""" Example script for running ADAPT-AQC recompilation using more advanced options """ import logging from qiskit import QuantumCircuit, transpile from qiskit.circuit.random import random_circuit from adaptaqc.compilers import AdaptCompiler, AdaptConfig logging.basicConfig() logger = logging.getLogger("adaptaqc") logger.setLevel(logging.INFO) n = 4 state_prep_circuit = QuantumCircuit(n) state_prep_circuit.h(range(n)) # Create a random circuit starting with a layer of hadamard gates qc = state_prep_circuit.compose(random_circuit(n, 16, 2, seed=0)) config = AdaptConfig( # We expect the solution to take longer to converge, so decrease the threshold for exiting # early. cost_improvement_tol=1e-5, # Run Rotosolve only every 10th layer to reduce computational cost. rotosolve_frequency=10, # Choose Rotosolve to modify only the last 10 layers. max_layers_to_modify=10, # Setting this value > 0 prioritises not using the same qubit pairs too often. reuse_exponent=1, # Increase the amount the cost needs to decrease by to terminate Rotosolve. This stops spending # too much time fine-tuning the angles. rotosolve_tol=1e-2, ) # Since we know the solution starts with Hadamards, we can pass this information into ADAPT-AQC starting_circuit = state_prep_circuit adapt_compiler = AdaptCompiler( target=qc, adapt_config=config, starting_circuit=starting_circuit, initial_single_qubit_layer=True, ) result = adapt_compiler.compile() approx_circuit = result.circuit print(f"Overlap between circuits is {result.overlap}") # Transpile the original circuits to the common basis set with maximum Qiskit optimization qc_in_basis_gates = transpile( qc, basis_gates=["ry", "rz", "rx", "u3", "cx"], optimization_level=3 ) print("Original circuit gates:", qc_in_basis_gates.count_ops()) print("Original circuit depth:", qc_in_basis_gates.depth()) # Compare with compiled circuit print("Compiled circuit gates:", approx_circuit.count_ops()) print("Compiled circuit depth:", approx_circuit.depth())