Auxiliary Reuse and Management
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