Gatesets in qsearch¶
To synthesize with different gates or topologies, you will need to create an instance of an qsearch.gatesets.Gateset subclass.
# 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)
Provided Gatesets¶
Basic Gatesets¶
QubitCNOTLinear- a gateset that is useful for synthesizing circuits with CNOTs and single qubit gates with the linear topology. It is similar toU3CNOTLinear, 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 useQubitCNOTLinear, 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 useU3CNOTLinear, which is more efficient.
Nonlinear Topologies¶
QubitCNOTRing- a gateset that is equivalent toQubitCNOTLinearexcept 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 toQubitCNOTLinearbut uses a toplogy based on the adjacency list. If the desired topology can be achieved by usingQubitCNOTLinearorQubitCNOTRing, 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)])
Qutrits¶
QutritCPIPhaseLinear- a gateset designed for qutrits that uses single qutrit gates and the CPI two-qutrit gate with a phase applied.
Custom Gatesets¶
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 singleqs.gates.Gateobject representing an initial layer for the search. Normally, this is a kronecker product of single-qudit gates, and you can use the providedfill_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 ofqs.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.