Gatesets in qsearch¶
To synthesize with different gates or topologies, you will need to create an instance of an
# example: synthesizing for the ring topology import qsearch as qs ring_gateset = qs.gatesets.QubitCNOTRing() # use your gateset with a project myproject = qs.Project("myproject") myproject["gateset"] = ring_gateset # or use it with SearchCompiler directly mycompiler = qs.SearchCompiler(gateset=ring_gateset)
QubitCNOTLinear- a gateset that is useful for synthesizing circuits with CNOTs and single qubit gates with the linear topology. It is similar to
U3CNOTLinear, but is slightly more efficient without sacrificing generality. It is the default gateset.
U3CNOTLinear- a gateset based on IBM’s U3 gate and CNOTs for the linear topology. It is generally better to use
QubitCNOTLinear, which is more efficient.
ZXZXZCNOTLinear- a gateset based on the RZ-RX90-RZ-RX90-RZ decomposition of single qubit gates for the linear topology. It is generally better to use
U3CNOTLinear, which is more efficient.
QubitCNOTRing- a gateset that is equivalent to
QubitCNOTLinearexcept it implements the ring topology. For 3 qubits, this is the triangle topology and is all-to-all.
QubitCNOTAdjacencyList- a gateset that takes a list of CNOT connections, and creates a gateset that is similar to
QubitCNOTLinearbut uses a toplogy based on the adjacency list. If the desired topology can be achieved by using
QubitCNOTRing, it is recommended to choose one of those because it will be more efficient.
# This would create a gateset for 4 qubits with CNOT connections 0 to 1, 0 to 2, and 1 to 3 mygateset = qs.gatesets.QubitCNOTAdjacencyList([(0,1), (0,2), (1,3)])
QutritCPIPhaseLinear- a gateset designed for qutrits that uses single qutrit gates and the CPI two-qutrit gate with a phase applied.
If none of these gatesets suite your needs, you can write your own! Make a subclass of
qs.gatesets.Gateset and implement these two functions:
intial_layer(n)The single input,
n, is an integer which deqsribes how many qudits will be in the circuit. The function returns a single
qs.gates.Gateobject representing an initial layer for the search. Normally, this is a kronecker product of single-qudit gates, and you can use the provided
fill_rowhelper function to produce this.
search_layers(n)The single input,
n, is an integer which deqsribes how many qudits will be in the circuit. The function returns a list of
qs.gates.Gateobjects, each representing a possible building block in a possible location for expanding the current circuit.
See the existing implementations in
qs.gatesets for examples of how to write a gateset.