Spaces:
Paused
Paused
File size: 2,298 Bytes
6d8ed8c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
"""
Example script for running ADAPT-AQC recompilation using more advanced options
"""
import logging
import matplotlib.pyplot as plt
from tenpy import SpinChain, MPS
from tenpy.algorithms import dmrg
from adaptaqc.backends.aer_mps_backend import AerMPSBackend, mps_sim_with_args
from adaptaqc.compilers import AdaptCompiler, AdaptConfig
from adaptaqc.utils.ansatzes import identity_resolvable
from adaptaqc.utils.utilityfunctions import tenpy_to_qiskit_mps
logging.basicConfig()
logger = logging.getLogger("adaptaqc")
logger.setLevel(logging.INFO)
# Generate a ground state of the XXZ model using TenPy
l = 20
model_params = dict(
S=0.5, L=l, Jx=1.0, Jy=1.0, Jz=5.0, hz=1.0, bc_MPS="finite", conserve="None"
)
model = SpinChain(model_params)
psi = MPS.from_product_state(
model.lat.mps_sites(), ["up", "down"] * (l // 2), bc=model_params["bc_MPS"]
)
# Run the DMRG algorithm to obtain the ground state
dmrg_params = {"trunc_params": {"trunc_cut": 1e-4}}
dmrg_engine = dmrg.TwoSiteDMRGEngine(psi, model, dmrg_params)
E, psi = dmrg_engine.run()
logger.info(f"Ground state created with maximum bond dimension {max(psi.chi)}")
# Convert it to a format compatible with the Qiskit Aer MPS simulator
qiskit_mps = tenpy_to_qiskit_mps(psi)
# Set compiler to use the general gradient method as laid out in https://arxiv.org/abs/2503.09683
config = AdaptConfig(
method="general_gradient", cost_improvement_num_layers=1e3, rotosolve_frequency=10
)
# Create an instance of Qiskit's MPS simulator with a specified truncation threshold
qiskit_mps_sim = mps_sim_with_args(mps_truncation_threshold=1e-8)
# Create an AQCBackend object
backend = AerMPSBackend(simulator=qiskit_mps_sim)
# Create a compiler with the target to be an MPS rather than a circuit
adapt_compiler = AdaptCompiler(
target=qiskit_mps,
backend=backend,
adapt_config=config,
starting_circuit="tenpy_product_state", # Start compiling from best χ=1 compression of target
custom_layer_2q_gate=identity_resolvable(), # Use ansatz from https://arxiv.org/abs/2503.09683
)
result = adapt_compiler.compile()
approx_circuit = result.circuit
print(f"Overlap between circuits is {result.overlap}")
# Draw the circuit that prepares the target random MPS
approx_circuit.draw(output="mpl", fold=-1)
plt.show()
|