Skip to main contentIBM Quantum Documentation
You are viewing the API reference for an old version of Qiskit. Switch to latest version

UnitarySynthesisPlugin

UnitarySynthesisPlugin GitHub(opens in a new tab)

Bases: abc.ABC

Abstract unitary synthesis plugin class

This abstract class defines the interface for unitary synthesis plugins.


Methods

run

abstract UnitarySynthesisPlugin.run(unitary, **options)

Run synthesis for the given unitary matrix

Parameters

  • unitary (numpy.ndarray) – The unitary matrix to synthesize to a DAGCircuit object
  • options – The optional kwargs that are passed based on the output the support_* methods on the class. Refer to the documentation for these methods on UnitarySynthesisPlugin to see what the keys and values are.

Returns

The dag circuit representation of the unitary. Alternatively, you can return a tuple of the form (dag, wires) where dag is the dag circuit representation of the circuit representation of the unitary and wires is the mapping wires to use for qiskit.dagcircuit.DAGCircuit.substitute_node_with_dag(). If you return a tuple and wires is None this will behave just as if only a DAGCircuit was returned. Additionally if this returns None no substitution will be made.

Return type

DAGCircuit


Attributes

max_qubits

Return the maximum number of qubits the unitary synthesis plugin supports.

If the size of the unitary to be synthesized exceeds this value the default plugin will be used. If there is no upper bound return None and all unitaries (>= min_qubits if it’s defined) will be passed to this plugin when it’s enabled.

min_qubits

Return the minimum number of qubits the unitary synthesis plugin supports.

If the size of the unitary to be synthesized is below this value the default plugin will be used. If there is no lower bound return None and all unitaries (<= max_qubits if it’s defined) will be passed to this plugin when it’s enabled.

supported_bases

Returns a dictionary of supported bases for synthesis

This is expected to return a dictionary where the key is a string basis and the value is a list of gate names that the basis works in. If the synthesis method doesn’t support multiple bases this should return None. For example:

{
    "XZX": ["rz", "rx"],
    "XYX": ["rx", "ry"],
}

If a dictionary is returned by this method the run kwargs will be passed a parameter matched_basis which contains a list of the basis strings (i.e. keys in the dictionary) which match the target basis gate set for the transpilation. If no entry in the dictionary matches the target basis gate set then the matched_basis kwarg will be set to an empty list, and a plugin can choose how to deal with the target basis gate set not matching the plugin’s capabilities.

supports_basis_gates

Return whether the plugin supports taking basis_gates

If this returns True the plugin’s run() method will be passed a basis_gates kwarg with a list of gate names the target backend supports. For example, ['sx', 'x', 'cx', 'id', 'rz'].

supports_coupling_map

Return whether the plugin supports taking coupling_map

If this returns True the plugin’s run() method will receive one kwarg coupling_map. The coupling_map kwarg will be set to a tuple with the first element being a CouplingMap object representing the qubit connectivity of the target backend, the second element will be a list of integers that represent the qubit indices in the coupling map that unitary is on. Note that if the target backend doesn’t have a coupling map set, the coupling_map kwarg’s value will be (None, qubit_indices).

supports_gate_errors

Return whether the plugin supports taking gate_errors

gate_errors will be a dictionary in the form of {gate_name: {(qubit_1, qubit_2): error}}. For example:

{
'sx': {(0,): 0.0006149355812506126, (1,): 0.0006149355812506126},
'cx': {(0, 1): 0.012012477900732316, (1, 0): 5.191111111111111e-07}
}

Do note that this dictionary might not be complete or could be empty as it depends on the target backend reporting gate errors on every gate for each qubit. The gate error rates reported in gate_errors are provided by the target device Backend object and the exact meaning might be different depending on the backend.

supports_gate_lengths

Return whether the plugin supports taking gate_lengths

gate_lengths will be a dictionary in the form of {gate_name: {(qubit_1, qubit_2): length}}. For example:

{
'sx': {(0,): 0.0006149355812506126, (1,): 0.0006149355812506126},
'cx': {(0, 1): 0.012012477900732316, (1, 0): 5.191111111111111e-07}
}

where the length value is in units of seconds.

Do note that this dictionary might not be complete or could be empty as it depends on the target backend reporting gate lengths on every gate for each qubit.

supports_natural_direction

Return whether the plugin supports a toggle for considering directionality of 2-qubit gates as natural_direction.

Refer to the documentation for UnitarySynthesis for the possible values and meaning of these values.

supports_pulse_optimize

Return whether the plugin supports a toggle to optimize pulses during synthesis as pulse_optimize.

Refer to the documentation for UnitarySynthesis for the possible values and meaning of these values.

supports_target

Whether the plugin supports taking target as an option

target will be a Target object representing the target device for the output of the synthesis pass.

By default this will be False since the plugin interface predates the Target class. If a plugin returns True for this attribute, it is expected that the plugin will use the Target instead of the values passed if any of supports_gate_lengths, supports_gate_errors, supports_coupling_map, and supports_basis_gates are set (although ideally all those parameters should contain duplicate information).

Was this page helpful?