Skip to content

Auxiliary Reuse and Management

View on GitHub

This tutorial demonstrates automatic auxiliary qubits management by the synthesis engine. It synthesizes a simple state preparation function, which comprises several multi-controlled rotations. These rotations can use auxiliary qubits to reduce depth. For a given global width constraint, the initialization and reuse of auxiliary qubits between different function blocks is automated.

import numpy as np

from classiq import *

MAX_WIDTH = 8

NUM_QUBITS = 4
np.random.seed(12)
amplitudes = 1 - 2 * np.random.rand(2**NUM_QUBITS)
amplitudes = (amplitudes / np.linalg.norm(amplitudes)).tolist()


@qfunc
def main() -> None:
    out = QArray("out")
    prepare_amplitudes(amplitudes=amplitudes, bound=0.2, out=out)


qmod = create_model(main)
qmod = set_preferences(
    qmod,
    custom_hardware_settings=CustomHardwareSettings(basis_gates=["cx", "u"]),
    random_seed=1235,
    optimization_timeout_seconds=100,
)
qmod = set_constraints(
    qmod, optimization_parameter=OptimizationParameter.DEPTH, max_width=MAX_WIDTH
)
qprog = synthesize(qmod)
show(qprog)
Opening: https://platform.classiq.io/circuit/2tcfX8HLgsEmRutAFGw3i3npbvU?version=0.66.1