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()