# Quantum Circuit Synthesis#

The main functionality for synthesizing quantum circuits is provided by the `synthesize_clifford()`

and the `optimize_clifford()`

methods.

- synthesize_clifford(
target_tableau,initial_tableau=None,include_destabilizers=False,**kwargs)[source]#Synthesize a Clifford circuit from a given tableau starting from an (optional) initial tableau.

- Parameters:

target_tableau(`str`

|`Clifford`

|`PauliList`

|`Tableau`

) – The target tableau to synthesize. If a string is given, it is interpreted as a semicolon separated binary matrix or a list of Pauli strings. The Pauli strings follow the same format as in Stim. If a`Clifford`

or a`PauliList`

is given, it is converted to a`Tableau`

. If a`Tableau`

is given, it is used directly.

initial_tableau(`str`

|`Clifford`

|`PauliList`

|`Tableau`

|`None`

) – The initial tableau to start from. If a string is given, it is interpreted as a semicolon separated binary matrix or a list of Pauli strings. If a`Clifford`

or a`PauliList`

is given, it is converted to a`Tableau`

. If a`Tableau`

is given, it is used directly. If no initial tableau is given, the synthesis starts from the identity tableau.

include_destabilizers(`bool`

) – Flag to set whether destabilizers should be considered in the synthesis

**kwargs(`Any`

) – Additional keyword arguments to configure the synthesis. See`SynthesisConfiguration`

for a list of available options.- Returns:

`tuple`

[`QuantumCircuit`

,`SynthesisResults`

] – A tuple containing the synthesized circuit and the synthesis results.

- optimize_clifford(
circuit,initial_tableau=None,include_destabilizers=False,**kwargs)[source]#Optimize a Clifford circuit starting from an (optional) initial tableau.

- Parameters:

circuit(`str`

|`QuantumCircuit`

|`QuantumComputation`

) – The circuit to optimize. If a string is given, it is interpreted as a QASM string or a filename. If a`QuantumCircuit`

is given, it is converted to a`QuantumComputation`

. If a`QuantumComputation`

is given, it is used as is.

initial_tableau(`str`

|`Clifford`

|`PauliList`

|`Tableau`

|`None`

) – The initial tableau to start from. If a string is given, it is interpreted as a semicolon separated binary matrix or a list of Pauli strings. If a`Clifford`

is given or a`PauliList`

is given, it is converted to a Tableau. If a`Tableau`

is given, it is used directly. If no initial tableau is given, the synthesis starts from the identity tableau.

include_destabilizers(`bool`

) – Flag to set whether destabilizers should be considered in the synthesis

**kwargs(`Any`

) – Additional keyword arguments to configure the synthesis. See`SynthesisConfiguration`

for a list of available options.- Returns:

`tuple`

[`QuantumCircuit`

,`SynthesisResults`

] – A tuple containing the optimized circuit and the synthesis results.

## Synthesis Configuration#

The following classes provide a more explicit way of initializing the respective parameters of the `synthesize_clifford`

and the `optimize_clifford`

method. Instead of setting parameters via `str`

members, they can be set with `Enumeration.member`

where `Enumeration`

is the enumeration class.

classTargetMetric#Members:

gates : Optimize gate count.

two_qubit_gates : Optimize two-qubit gate count.

depth : Optimize circuit depth.

classVerbosity#Members:

none : No output.

fatal : Only show fatal errors.

error : Show errors.

warning : Show warnings.

info : Show general information.

debug : Show additional debug information.

verbose : Show all information.

The `SynthesisConfiguration`

class is used to provide several parameters to the `synthesize_clifford`

and the `optimize_clifford`

method. The following table lists the parameters and their default values.

classSynthesisConfiguration#Configuration options for the MQT QMAP Clifford synthesis tool.

propertydump_intermediate_results#Dump intermediate results of the synthesis process. Defaults to false.

propertygate_limit_factor#Factor by which the gate limit is increased when trying to find a better solution for the two-qubit gate optimization. Defaults to 1.1.

propertyheuristic#Use heuristic to synthesize the circuit. This method synthesizes shallow intermediate circuits and combines them. Defaults to false.

propertyinitial_timestep_limit#Initial timestep limit for the Clifford synthesis. Defaults to 0, which implies that the initial timestep limit is determined automatically.

propertyintermediate_results_path#Path to the directory where intermediate results should be dumped. Defaults to ./. The path needs to include a path separator at the end.

- json(
self: mqt.qmap.pyqmap.SynthesisConfiguration) json #Returns a JSON-style dictionary of all the information present in the

`Configuration`

propertylinear_search#Use liner search instead of binary search scheme for finding the optimum. Defaults to false.

propertyminimal_timesteps#Minimal timestep considered for the Clifford synthesis. This option limits the lower bound of the interval in which the binary search method looks for solutions. Set this if you know a lower bound for the circuit depth. Defaults to 0, which implies that no lower bound for depth is known.

propertyminimize_gates_after_depth_optimization#Depth optimization might produce a circuit with more gates than necessary. This option enables an additional run of the synthesizer to minimize the overall number of gates. Defaults to false.

propertyminimize_gates_after_two_qubit_gate_optimization#Two-qubit gate optimization might produce a circuit with more gates than necessary. This option enables an additional run of the synthesizer to minimize the overall number of gates. Defaults to false.

propertyn_threads_heuristic#Maximum number of threads used for the heuristic optimizer. Defaults to the number of available threads on the system.

propertysolver_parameters#Parameters to be passed to Z3 as dict[str, bool | int | float | str]

propertysplit_size#Size of subcircuits used in heuristic. Defaults to 5.

propertytarget_metric#Target metric for the Clifford synthesis. Defaults to gates.

propertytry_higher_gate_limit_for_two_qubit_gate_optimization#When optimizing two-qubit gates, the synthesizer might fail to find an optimal solution for a certain timestep limit, but there might be a better solution for some higher timestep limit. This option enables an additional run of the synthesizer with a higher gate limit. Defaults to false.

propertyuse_maxsat#Use MaxSAT to solve the synthesis problem or to really on the binary search scheme for finding the optimum. Defaults to false.

propertyuse_symmetry_breaking#Use symmetry breaking clauses to speed up the synthesis process. Defaults to true.

propertyverbosity#Verbosity level for the synthesis process. Defaults to ‘warning’.