# AQC

`qiskit.transpiler.synthesis.aqc.AQC(optimizer=None, seed=None)`

GitHub(opens in a new tab)

Bases: `object`

(opens in a new tab)

A generic implementation of the Approximate Quantum Compiler. This implementation is agnostic of the underlying implementation of the approximate circuit, objective, and optimizer. Users may pass corresponding implementations of the abstract classes:

- The
*optimizer*is an implementation of the`Minimizer`

protocol, a callable used to run the optimization process. The choice of optimizer may affect overall convergence, required time for the optimization process and achieved objective value. - The
*approximate circuit*represents a template which parameters we want to optimize. Currently, there’s only one implementation based on 4-rotations CNOT unit blocks:`CNOTUnitCircuit`

. See the paper for more details. - The
*approximate objective*is tightly coupled with the approximate circuit implementation and provides two methods for computing objective function and gradient with respect to approximate circuit parameters. This objective is passed to the optimizer. Currently, there are two implementations based on 4-rotations CNOT unit blocks:`DefaultCNOTUnitObjective`

and its accelerated version`FastCNOTUnitObjective`

. Both implementations share the same idea of maximization the Hilbert-Schmidt product between the target matrix and its approximation. The former implementation approach should be considered as a baseline one. It may suffer from performance issues, and is mostly suitable for a small number of qubits (up to 5 or 6), whereas the latter, accelerated one, can be applied to larger problems. - One should take into consideration the exponential growth of matrix size with the number of qubits because the implementation not only creates a potentially large target matrix, but also allocates a number of temporary memory buffers comparable in size to the target matrix.

Setting the optimizer argument to an instance of qiskit.algorithms.optimizers.Optimizer is deprecated as of qiskit 0.45.0. It will be removed no earlier than 3 months after the release date. Please, submit a callable that follows the Minimizer protocol instead.

**Parameters**

**optimizer**(*Minimizer**|**Optimizer**| None*) – an optimizer to be used in the optimization procedure of the search for the best approximate circuit. By default, the scipy minimizer with the`L-BFGS-B`

method is used with max iterations set to 1000.**seed**(*int*(opens in a new tab)*| None*) – a seed value to be used by a random number generator.

## Methods

### compile_unitary

`compile_unitary(target_matrix, approximate_circuit, approximating_objective, initial_point=None)`

Approximately compiles a circuit represented as a unitary matrix by solving an optimization problem defined by `approximating_objective`

and using `approximate_circuit`

as a template for the approximate circuit.

**Parameters**

**target_matrix**(*np.ndarray*) – a unitary matrix to approximate.**approximate_circuit**(*ApproximateCircuit*) – a template circuit that will be filled with the parameter values obtained in the optimization procedure.**approximating_objective**(*ApproximatingObjective*) – a definition of the optimization problem.**initial_point**(*np.ndarray | None*) – initial values of angles/parameters to start optimization from.