pip install git+https://github.com/aspuru-guzik-group/tequila.git

Slides in notebook form: github.com/kottmanj/talks_and_material
import tequila as tq
import numpy
Original idea for quantum computers: Simulate nature

Assume: $U = e^{i\frac{\theta}{2}G}$ with hermitian matrix $G$ and $\theta=2\pi$.
For simplicity: Assume eigenvalues of $G$ are $0$ and $1$
Concrete example: $$ G = \sigma_x + 1 $$
G = 0.5*(tq.paulis.X(1)+1.0)
val, vec = numpy.linalg.eigh(G.to_matrix())
eigenstates = []
for i in range(2):
wfn = tq.QubitWaveFunction.from_array(vec[:,i])
print("energy = {:+2.5f}, wfn=".format(val[i]), wfn)
eigenstates.append(wfn)
energy = +0.00000, wfn= -0.7071|0> +0.7071|1> energy = +1.00000, wfn= +0.7071|0> +0.7071|1>

a=2*numpy.pi
cU = tq.gates.Trotterized(generator=G, angle=a, control=0)
U = tq.gates.H(0) + cU + tq.gates.H(0)
wfn = tq.simulate(U)
print("wavefunction after circuit:\n", wfn)
wavefunction after circuit: +0.5000e^(-0.2500Ï€i)|00> +0.5000e^(-0.2500Ï€i)|10> +0.5000e^(+0.7500Ï€i)|01> +0.5000e^(-0.2500Ï€i)|11>
Qp = tq.paulis.Qp(0) # Qp = |0><0| = 0.5(Z+1)
wfn2 = Qp(wfn)
wfn2 = wfn2.normalize()
print("wavefunction after measurements:\n",wfn2)
fidelity = numpy.abs(wfn2.inner(eigenstates[0]))**2
print("fidelity with eigenstate 0:", fidelity )
wavefunction after measurements: +0.7071e^(-0.2500Ï€i)|00> +0.7071e^(+0.7500Ï€i)|01> fidelity with eigenstate 0: 0.9999999999999998
Example before: Quantum Phase Estimation (measure eigenvalues of Hermitian operator)
Now: Variational Quantum Eigensolver (minimize expectation value of Hermitian operator)
$$ \min_{\theta} \langle H \rangle_{U(\theta)} $$H = 0.5*(tq.paulis.X(0) + 1.0)
U = tq.gates.Ry(target=0, angle="a")
E = tq.ExpectationValue(H=H, U=U)
result = tq.minimize(E)
WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)
Optimizer: <class 'tequila.optimizers.optimizer_scipy.OptimizerSciPy'>
backend : qulacs
device : None
samples : None
save_history : True
noise : None
Method : BFGS
Objective : 1 expectationvalues
gradient : 2 expectationvalues
active variables : 1
E=+0.50000000 angles= {a: 0.0} samples= None
E=+0.26028723 angles= {a: -0.5} samples= None
E=+0.00026787 angles= {a: -1.6035311193256832} samples= None
E=+0.00001204 angles= {a: -1.5638552774723973} samples= None
E=+0.00000000 angles= {a: -1.5707973321904534} samples= None
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 4
Function evaluations: 5
Gradient evaluations: 5
# simulate objectives
energy1 = tq.simulate(E, variables={"a": -numpy.pi/2})
# compile objectives and use as functions
f = tq.compile(E)
energy2 = f({"a":-numpy.pi/2})
# use different backends and options
energy3 = tq.simulate(E, variables={"a": -numpy.pi/2}, backend="cirq", samples=1000)
Overlap punishment:
$$ S^2\left(\phi, \psi\right)= \lvert\langle \phi \vert \psi \rangle\rvert^2 = \langle Q_+ \rangle_{U_\phi^\dagger U_{\psi}} , \quad Q_+ = \lvert 00\dots0 \rangle\langle 00\dots0 \lvert$$Uex = tq.gates.Ry(angle="b", target=0)
S2 = tq.ExpectationValue(H=tq.paulis.Qp(0), U=Uex+U.dagger())
opt_gs = {"a":-0.5*numpy.pi}
L = tq.ExpectationValue(H=H, U=Uex) + 10.0*S2
result_ex = tq.minimize(L,
initial_values=opt_gs,
variables=["b"])
/home/jsk/projects/OpenVQE/src/tequila/optimizers/optimizer_base.py:422: TequilaWarning:initial_variables given but not complete: Autocompleted with zeroes
Optimizer: <class 'tequila.optimizers.optimizer_scipy.OptimizerSciPy'>
backend : qulacs
device : None
samples : None
save_history : True
noise : None
Method : BFGS
Objective : 2 expectationvalues
gradient : 6 expectationvalues
active variables : 1
E=+5.49999475 angles= {b: 0.0, a: -1.5707973321904534} samples= None
E=+1.68925405 angles= {b: 1.01, a: -1.5707973321904534} samples= None
E=+1.75247025 angles= {b: 2.157473194149607, a: -1.5707973321904534} samples= None
E=+1.00000119 angles= {b: 1.5700696738344724, a: -1.5707973321904534} samples= None
E=+1.00000000 angles= {b: 1.5708347830881644, a: -1.5707973321904534} samples= None
Optimization terminated successfully.
Current function value: 1.000000
Iterations: 3
Function evaluations: 5
Gradient evaluations: 5

a = tq.Variable("a")
angle = (-a**2).apply(tq.numpy.exp)
U = tq.gates.Ry(angle=angle*numpy.pi, target=0)
U += tq.gates.X(target=1, control=0)
H = tq.QubitHamiltonian("-1.0X(0)X(1)+0.5Z(0)+Y(1)")
E = tq.ExpectationValue(H=H, U=U)
dE = tq.grad(E, "a")
objective = E + (-(dE**2)).apply(tq.numpy.exp)
f = tq.compile(objective)
import matplotlib.pyplot as plt
start=-2.0
stop=2.0
values = {}
for value in [start + i/100*(stop-start) for i in range(100)]:
values[value] = f({"a":value})
plt.plot(list(values.keys()), list(values.values()))
plt.show()

H = tq.paulis.Sp(0)*tq.paulis.Sm(1)
H += tq.paulis.Sm(0)*tq.paulis.Sp(1)
U = tq.gates.X(0)
U += tq.gates.QubitExcitation(angle=f, target=[0,1])
L2 = tq.ExpectationValue(H=H, U=U)**2
f2 = tq.compile(L2)
import matplotlib.pyplot as plt
start=-2.0
stop=2.0
steps=100
values = {}
for value in [start + i/steps*(stop-start) for i in range(steps)]:
values[value] = f2({"a":value})
plt.plot(list(values.keys()), list(values.values()))
plt.show()
A. Cervera-Lierta, JSK, A. Aspuru-Guzik, ArXiv:2009.13545
Learn the relation of a parameters in the Hamiltonian and in the circuit


def meta_angle(x):
a = tq.assign_variable("a")
b = tq.assign_variable("b")
return x*a-b
def make_H(x):
return tq.paulis.X(0) + x*tq.paulis.Z(0)
def make_U(angle):
angle = tq.assign_variable(angle)
return tq.gates.Ry(target=0, angle=angle*numpy.pi)
training_points = [0.0, 0.5, 1.0]
meta_objective = 0.0
for x in training_points:
meta_objective += tq.ExpectationValue(H=make_H(x), U=make_U(meta_angle(x)))
meta_objective = 1.0/len(training_points)*meta_objective
meta_vqe_result = tq.minimize(meta_objective)
Optimizer: <class 'tequila.optimizers.optimizer_scipy.OptimizerSciPy'>
backend : qulacs
device : None
samples : None
save_history : True
noise : None
Method : BFGS
Objective : 3 expectationvalues
gradient : 18 expectationvalues
active variables : 2
E=+0.50000000 angles= {a: 0.0, b: 0.0} samples= None
E=+0.03163936 angles= {a: -0.45168573145495755, b: 0.9033714629099151} samples= None
E=-1.10308790 angles= {a: -0.20895075848145425, b: 0.4179015169629085} samples= None
E=-0.60310841 angles= {a: -0.5721265537434792, b: 0.6376424028446308} samples= None
E=-1.17348516 angles= {a: -0.29224800825863895, b: 0.468300832380787} samples= None
E=-1.17658091 angles= {a: -0.23413025767017326, b: 0.518145642557484} samples= None
E=-1.17678094 angles= {a: -0.24759858034771412, b: 0.5085406576584631} samples= None
Optimization terminated successfully.
Current function value: -1.176781
Iterations: 4
Function evaluations: 7
Gradient evaluations: 7
test_points=[0.0 + x/100 for x in range(100)]
predicted_angles = {}
opt_angles = {}
for x in test_points:
predicted = meta_angle(x)(variables=meta_vqe_result.variables)
predicted_angles[x] = predicted
objective = tq.ExpectationValue(H=make_H(x), U=make_U("x"))
opt = tq.minimize(objective, silent=True, initial_values=predicted)
opt_angles[x] = opt.variables["x"]
plt.plot(list(predicted_angles.keys()), list(predicted_angles.values()), label="predicted", marker="o", markersize=5)
plt.plot(list(opt_angles.keys()), list(opt_angles.values()), label="opt", marker="x", markersize=3)
plt.legend()
plt.show()
def meta_angle(x):
a = tq.assign_variable("a")
b = tq.assign_variable("b")
c = tq.assign_variable("c")
d = tq.assign_variable("d")
return b*x**2 + c*x + d
plt.figure()
plt.plot(list(predicted_angles.keys()), list(predicted_angles.values()), label="predicted", marker="o", markersize=5)
plt.plot(list(opt_angles.keys()), list(opt_angles.values()), label="opt", marker="x", markersize=3)
plt.legend()
plt.show()

conda install psi4 -c psi4geomstring = "H 0.0 0.0 0.0\nH 0.0 0.0 {R}".format(R=0.7)
mol = tq.Molecule(geometry=geomstring,basis_set="sto-3g")
H = mol.make_hamiltonian()
print(H)
-0.0421+0.1777Z(0)+0.1777Z(1)-0.2427Z(2)-0.2427Z(3)+0.1706Z(0)Z(1)+0.0448Y(0)X(1)X(2)Y(3)-0.0448Y(0)Y(1)X(2)X(3)-0.0448X(0)X(1)Y(2)Y(3)+0.0448X(0)Y(1)Y(2)X(3)+0.1229Z(0)Z(2)+0.1677Z(0)Z(3)+0.1677Z(1)Z(2)+0.1229Z(1)Z(3)+0.1763Z(2)Z(3)
U = mol.prepare_reference()
E = tq.ExpectationValue(H=H, U=U)
hf_energy = tq.simulate(E)
print("EHF = {:+2.5f}".format(hf_energy))
EHF = -1.11735
print(E)
Objective with 1 unique expectation values total measurements = 15 variables = [] types = not compiled
E = tq.ExpectationValue(H=H, U=U, optimize_measurements=True)
print(tq.compile(E, backend="qiskit"))
Objective with 2 unique expectation values total measurements = 2 variables = [] types = [<class 'tequila.simulators.simulator_qiskit.BackendExpectationValueQiskit'>]
geomstring = "H 0.0 0.0 0.0\nLi 0.0 0.0 {R}".format(R=0.7)
mol = tq.Molecule(geometry=geomstring, basis_set="sto-3g",
transformation="BravyiKitaev")
print(mol)
<class 'tequila.quantumchemistry.psi4_interface.QuantumChemistryPsi4'> Qubit Encoding transformation=<function bravyi_kitaev at 0x7f418cdffa70> Parameters basis_set : sto-3g geometry : H 0.0 0.0 0.0 Li 0.0 0.0 0.7 description : multiplicity : 1 charge : 0 closed_shell : True name : molecule Psi4 Data Point Group (full) : c_inf_v Point Group (used) : c2v nirrep : 4 irreps : ['A1', 'A2', 'B1', 'B2'] mos per irrep : [4, 0, 1, 1] Orbitals: 0 : 0A1 energy = -2.519793 1 : 1A1 energy = -0.296569 2 : 2A1 energy = +0.057778 3 : 0B1 energy = +0.139822 4 : 0B2 energy = +0.139822 5 : 3A1 energy = +0.599617
geomstring = "H 0.0 0.0 0.0\nLi 0.0 0.0 {R}".format(R=0.7)
active={"A1":[1,2]}
mol = tq.Molecule(geometry=geomstring,
basis_set="sto-3g",
active_orbitals=active)
H = mol.make_hamiltonian()
U = tq.gates.Ry(angle="a", target=0)
U += tq.gates.X(1)
U += tq.gates.X(target=1, control=0)
U += tq.gates.X(target=2, control=1)
U += tq.gates.X(target=3, control=2)
U += tq.gates.X(target=1)
tq.draw(U)
E = tq.ExpectationValue(H=H, U=U)
result = tq.minimize(E)
energy_np = numpy.linalg.eigvalsh(H.to_matrix())[0]
energy_fci = mol.compute_energy("fci")
Optimizer: <class 'tequila.optimizers.optimizer_scipy.OptimizerSciPy'>
backend : qulacs
device : None
samples : None
save_history : True
noise : None
Method : BFGS
Objective : 1 expectationvalues
gradient : 2 expectationvalues
active variables : 1
E=-6.95631152 angles= {a: 0.0} samples= None
E=-6.95641192 angles= {a: -0.009415864944458008} samples= None
E=-6.95704807 angles= {a: -0.04707932472229004} samples= None
E=-6.96332136 angles= {a: -0.19773316383361816} samples= None
E=-7.04345170 angles= {a: -0.8003485202789307} samples= None
E=-7.48465953 angles= {a: -3.2108099460601807} samples= None
E=-7.48119139 angles= {a: -2.913032986993547} samples= None
E=-7.48611221 angles= {a: -3.106200173015701} samples= None
Optimization terminated successfully.
Current function value: -7.486112
Iterations: 1
Function evaluations: 8
Gradient evaluations: 8
print("VQE = {:2.5f}".format(result.energy))
print("FCI = {:2.5f}".format(energy_fci))
print("Numpy = {:2.5f}".format(energy_np))
VQE = -7.48611 FCI = -7.48612 Numpy = -7.48612

G0213 = mol.make_excitation_generator(indices=[(0,2),(1,3)])
Uex = tq.gates.Trotterized(generator=G0213, angle="a")
U = mol.prepare_reference() + Uex
tq.draw(U)
E = tq.ExpectationValue(H=H, U=U)
result = tq.minimize(E)
Optimizer: <class 'tequila.optimizers.optimizer_scipy.OptimizerSciPy'>
backend : qulacs
device : None
samples : None
save_history : True
noise : None
Method : BFGS
Objective : 1 expectationvalues
gradient : 16 expectationvalues
active variables : 1
E=-7.48594487 angles= {a: 0.0} samples= None
E=-7.48602179 angles= {a: 0.009415864944458008} samples= None
E=-7.48611042 angles= {a: 0.031862458915351874} samples= None
Optimization terminated successfully.
Current function value: -7.486110
Iterations: 2
Function evaluations: 3
Gradient evaluations: 3

Uex = mol.make_excitation_gate([(0,2),(1,3)], "a")
U = mol.prepare_reference() + Uex
E = tq.ExpectationValue(H=H, U=U)
result = tq.minimize(E)
Optimizer: <class 'tequila.optimizers.optimizer_scipy.OptimizerSciPy'>
backend : qulacs
device : None
samples : None
save_history : True
noise : None
Method : BFGS
Objective : 1 expectationvalues
gradient : 2 expectationvalues
active variables : 1
E=-7.48594487 angles= {a: 0.0} samples= None
E=-7.48602179 angles= {a: 0.009415864944458008} samples= None
E=-7.48611042 angles= {a: 0.031862458915351874} samples= None
Optimization terminated successfully.
Current function value: -7.486110
Iterations: 2
Function evaluations: 3
Gradient evaluations: 3



mol = tq.Molecule(geometry=geomstring, basis_set="cc-pVDZ")
print(mol.make_hamiltonian().n_qubits)
38


Basis-set-Free VQE:
JSK, P. Schleich, T. Tamayo-Mendoza, A. Aspuru-Guzik doi.org/10.1021/acs.jpclett.0c03410
Surrogate Model (PNO-MP2):
JSK, F. A. Bischoff, E. F. Valeev doi.org/10.1063/1.5141880
Tequila backend: Madness
R.J. Harrison et.al. doi.org/10.1137/15M1026171
MRA basics:
doi.org/10.18452/19357 (Chapter 2)
Review on classical applications:
F.A. Bischoff, doi.org/10.1016/bs.aiq.2019.04.003
mol = tq.Molecule(geometry="Li 0.0 0.0 0.0\nH 0.0 0.0 1.6",
n_pno=4,
executable=madness_exe,
name="lih_1.6")
H = mol.make_hamiltonian()
U = mol.make_pno_upccgsd_ansatz(include_singles=False)
E = tq.ExpectationValue(H=H, U=U)
print(mol)
<class 'tequila.quantumchemistry.madness_interface.QuantumChemistryMadness'> Qubit Encoding transformation=<function jordan_wigner at 0x7f90eb2efa70> Parameters basis_set : custom geometry : Li 0.0 0.0 0.0 H 0.0 0.0 1.6 description : multiplicity : 1 charge : 0 closed_shell : True name : lih_1.6 MRA Orbitals : orbital 0, occupied reference orbital (0,), energy -2.44107 orbital 1, occupied reference orbital (1,), energy -0.305942 orbital 2, pno from pair (1, 1), MP2 occ 0.0113194 orbital 3, pno from pair (1, 1), MP2 occ 0.00479669 orbital 4, pno from pair (1, 1), MP2 occ 0.00479458 orbital 5, pno from pair (1, 1), MP2 occ 0.00419803 executable : /home/jsk/devel/madness/build-opt//src/apps/pno/pno_integrals htensor : lih_1.6_htensor.npy gtensor : lih_1.6_gtensor.npy
result = tq.minimize(E)
Optimizer: <class 'tequila.optimizers.optimizer_scipy.OptimizerSciPy'>
backend : qulacs
device : None
samples : None
save_history : True
noise : None
Method : BFGS
Objective : 1 expectationvalues
gradient : 8 expectationvalues
active variables : 4
E=-7.98721057 angles= {(0, ((2, 4), (3, 5)), None): 0.0, (0, ((2, 6), (3, 7)), None): 0.0, (0, ((2, 8), (3, 9)), None): 0.0, (0, ((2, 10), (3, 11)), None): 0.0} samples= None
E=-8.01593186 angles= {(0, ((2, 4), (3, 5)), None): 0.12768793106079102, (0, ((2, 6), (3, 7)), None): 0.09198546409606934, (0, ((2, 8), (3, 9)), None): 0.09202122688293457, (0, ((2, 10), (3, 11)), None): 0.09455657005310059} samples= None
E=-8.02032262 angles= {(0, ((2, 4), (3, 5)), None): 0.21350067509853055, (0, ((2, 6), (3, 7)), None): 0.14165840203560198, (0, ((2, 8), (3, 9)), None): 0.14177428603515832, (0, ((2, 10), (3, 11)), None): 0.13429117589170406} samples= None
E=-8.02036286 angles= {(0, ((2, 4), (3, 5)), None): 0.2187140711919535, (0, ((2, 6), (3, 7)), None): 0.14006640996346112, (0, ((2, 8), (3, 9)), None): 0.1402723816504262, (0, ((2, 10), (3, 11)), None): 0.12927082915985516} samples= None
E=-8.02037080 angles= {(0, ((2, 4), (3, 5)), None): 0.22235015051312715, (0, ((2, 6), (3, 7)), None): 0.13869881217448576, (0, ((2, 8), (3, 9)), None): 0.13896068272518608, (0, ((2, 10), (3, 11)), None): 0.12618000883095457} samples= None
Optimization terminated successfully.
Current function value: -8.020371
Iterations: 4
Function evaluations: 5
Gradient evaluations: 5
final energy = -8.02037

Original approaches:
Ryabynkin, Yen, Genin, Izmaylov, doi.org/10.1021/acs.jctc.8b00932
Grimsley, Economou, Barnes, Mayhall doi.org/10.1038/s41467-019-10988-2

Tequila implementation:
JSK, Anand, Aspuru-Guzik. doi.org/10.1039/D0SC06627C
More examples on github
operator_pool = tq.apps.adapt.MolecularPool(molecule=mol,
indices="UpCCGSD")
solver = tq.apps.adapt.Adapt(operator_pool=operator_pool,
H=mol.make_hamiltonian(),
Upre=mol.prepare_reference())
result = solver()
WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)
Starting Adaptive Solver
optimizer_args : {'method': 'bfgs'}
compile_args : {}
maxiter : 100
energy_convergence : None
gradient_convergence : 0.01
max_gradient_convergence : 0.0
degeneracy_threshold : 0.0001
operator pool: : MolecularPool with 45 Generators
objective factory : : ObjectiveFactoryBase
Optimizer: <class 'tequila.optimizers.optimizer_scipy.OptimizerSciPy'>
backend : qulacs
device : None
samples : None
save_history : True
noise : None
Method : BFGS
Objective : 1 expectationvalues
gradient : 2 expectationvalues
active variables : 1
E=-7.98721057 angles= {(((2, 4), (3, 5)), (0, 0)): 0.0} samples= None
E=-7.99916644 angles= {(((2, 4), (3, 5)), (0, 0)): 0.12768793106079102} samples= None
E=-8.00241089 angles= {(((2, 4), (3, 5)), (0, 0)): 0.23849312692390365} samples= None
Optimization terminated successfully.
Current function value: -8.002411
Iterations: 2
Function evaluations: 3
Gradient evaluations: 3
-------------------------------------
Finished iteration 0
current energy : -8.00241089
difference : +8.00241089
grad_norm : +0.20602156
max_grad : +0.12768793
circuit size : 1
Optimizer: <class 'tequila.optimizers.optimizer_scipy.OptimizerSciPy'>
backend : qulacs
device : None
samples : None
save_history : True
noise : None
Method : BFGS
Objective : 1 expectationvalues
gradient : 4 expectationvalues
active variables : 2
E=-8.00241089 angles= {(((2, 4), (3, 5)), (0, 0)): 0.23849312692390365, (((2, 10), (3, 11)), (1, 0)): 0.0} samples= None
E=-8.00780753 angles= {(((2, 4), (3, 5)), (0, 0)): 0.23767010598884505, (((2, 10), (3, 11)), (1, 0)): 0.09035181999206543} samples= None
E=-8.00843062 angles= {(((2, 4), (3, 5)), (0, 0)): 0.2343611910637476, (((2, 10), (3, 11)), (1, 0)): 0.13314953400528567} samples= None
E=-8.00843164 angles= {(((2, 4), (3, 5)), (0, 0)): 0.23318258339429312, (((2, 10), (3, 11)), (1, 0)): 0.13302324668499999} samples= None
Optimization terminated successfully.
Current function value: -8.008432
Iterations: 3
Function evaluations: 4
Gradient evaluations: 4
-------------------------------------
Finished iteration 1
current energy : -8.00843164
difference : +0.00602075
grad_norm : +0.15554684
max_grad : +0.09035182
circuit size : 2
Optimizer: <class 'tequila.optimizers.optimizer_scipy.OptimizerSciPy'>
backend : qulacs
device : None
samples : None
save_history : True
noise : None
Method : BFGS
Objective : 1 expectationvalues
gradient : 6 expectationvalues
active variables : 3
E=-8.00843164 angles= {(((2, 4), (3, 5)), (0, 0)): 0.23318258339429312, (((2, 10), (3, 11)), (1, 0)): 0.13302324668499999, (((2, 8), (3, 9)), (2, 0)): 0.0} samples= None
E=-8.01356580 angles= {(((2, 4), (3, 5)), (0, 0)): 0.23264709526563102, (((2, 10), (3, 11)), (1, 0)): 0.1329805697593408, (((2, 8), (3, 9)), (2, 0)): 0.08562302589416504} samples= None
E=-8.01454673 angles= {(((2, 4), (3, 5)), (0, 0)): 0.2292548691773303, (((2, 10), (3, 11)), (1, 0)): 0.13026296777047125, (((2, 8), (3, 9)), (2, 0)): 0.14278973206021528} samples= None
E=-8.01454807 angles= {(((2, 4), (3, 5)), (0, 0)): 0.2280944915498197, (((2, 10), (3, 11)), (1, 0)): 0.12953777365689514, (((2, 8), (3, 9)), (2, 0)): 0.14257096693112328} samples= None
Optimization terminated successfully.
Current function value: -8.014548
Iterations: 3
Function evaluations: 4
Gradient evaluations: 4
-------------------------------------
Finished iteration 2
current energy : -8.01454807
difference : +0.00611643
grad_norm : +0.12348381
max_grad : +0.08562303
circuit size : 3
Optimizer: <class 'tequila.optimizers.optimizer_scipy.OptimizerSciPy'>
backend : qulacs
device : None
samples : None
save_history : True
noise : None
Method : BFGS
Objective : 1 expectationvalues
gradient : 8 expectationvalues
active variables : 4
E=-8.01454807 angles= {(((2, 4), (3, 5)), (0, 0)): 0.2280944915498197, (((2, 10), (3, 11)), (1, 0)): 0.12953777365689514, (((2, 8), (3, 9)), (2, 0)): 0.14257096693112328, (((2, 6), (3, 7)), (3, 0)): 0.0} samples= None
E=-8.01943093 angles= {(((2, 4), (3, 5)), (0, 0)): 0.22757950741896033, (((2, 10), (3, 11)), (1, 0)): 0.12932677321439026, (((2, 8), (3, 9)), (2, 0)): 0.1425290052612014, (((2, 6), (3, 7)), (3, 0)): 0.08349323272705078} samples= None
E=-8.02036901 angles= {(((2, 4), (3, 5)), (0, 0)): 0.22433865810968726, (((2, 10), (3, 11)), (1, 0)): 0.12662560462330566, (((2, 8), (3, 9)), (2, 0)): 0.13998966028679324, (((2, 6), (3, 7)), (3, 0)): 0.13936573373473318} samples= None
E=-8.02037057 angles= {(((2, 4), (3, 5)), (0, 0)): 0.22327154777341038, (((2, 10), (3, 11)), (1, 0)): 0.12598020594558565, (((2, 8), (3, 9)), (2, 0)): 0.13917604934964553, (((2, 6), (3, 7)), (3, 0)): 0.13917959113862152} samples= None
Optimization terminated successfully.
Current function value: -8.020371
Iterations: 3
Function evaluations: 4
Gradient evaluations: 4
-------------------------------------
Finished iteration 3
current energy : -8.02037057
difference : +0.00582249
grad_norm : +0.08640215
max_grad : +0.08349323
circuit size : 4
Optimizer: <class 'tequila.optimizers.optimizer_scipy.OptimizerSciPy'>
backend : qulacs
device : None
samples : None
save_history : True
noise : None
Method : BFGS
Objective : 1 expectationvalues
gradient : 10 expectationvalues
active variables : 5
E=-8.02037057 angles= {(((2, 4), (3, 5)), (0, 0)): 0.22327154777341038, (((2, 10), (3, 11)), (1, 0)): 0.12598020594558565, (((2, 8), (3, 9)), (2, 0)): 0.13917604934964553, (((2, 6), (3, 7)), (3, 0)): 0.13917959113862152, (((0, 10), (1, 11)), (4, 0)): 0.0} samples= None
E=-8.02020028 angles= {(((2, 4), (3, 5)), (0, 0)): 0.2228154530315891, (((2, 10), (3, 11)), (1, 0)): 0.12580949824294893, (((2, 8), (3, 9)), (2, 0)): 0.13888398659024612, (((2, 6), (3, 7)), (3, 0)): 0.1391295232370102, (((0, 10), (1, 11)), (4, 0)): 0.015167236328125} samples= None
E=-8.02040368 angles= {(((2, 4), (3, 5)), (0, 0)): 0.2231404248933198, (((2, 10), (3, 11)), (1, 0)): 0.12593112911226373, (((2, 8), (3, 9)), (2, 0)): 0.13909208409710452, (((2, 6), (3, 7)), (3, 0)): 0.1391651970953288, (((0, 10), (1, 11)), (4, 0)): 0.0043604355148156165} samples= None
Optimization terminated successfully.
Current function value: -8.020404
Iterations: 1
Function evaluations: 3
Gradient evaluations: 3
-------------------------------------
Finished iteration 4
current energy : -8.02040368
difference : +0.00003312
grad_norm : +0.01873558
max_grad : +0.01516724
circuit size : 5
detected degeneracies: increasing batch size temporarily from 1 to 2
Optimizer: <class 'tequila.optimizers.optimizer_scipy.OptimizerSciPy'>
backend : qulacs
device : None
samples : None
save_history : True
noise : None
Method : BFGS
Objective : 1 expectationvalues
gradient : 14 expectationvalues
active variables : 7
E=-8.02040368 angles= {(((2, 4), (3, 5)), (0, 0)): 0.2231404248933198, (((2, 10), (3, 11)), (1, 0)): 0.12593112911226373, (((2, 8), (3, 9)), (2, 0)): 0.13909208409710452, (((2, 6), (3, 7)), (3, 0)): 0.1391651970953288, (((0, 10), (1, 11)), (4, 0)): 0.0043604355148156165, (((2, 4),), (5, 0)): 0.0, (((3, 5),), (5, 0)): 0.0} samples= None
E=-8.02045662 angles= {(((2, 4), (3, 5)), (0, 0)): 0.22275990884107372, (((2, 10), (3, 11)), (1, 0)): 0.1257902237320147, (((2, 8), (3, 9)), (2, 0)): 0.13885461919231937, (((2, 6), (3, 7)), (3, 0)): 0.13912871905272625, (((0, 10), (1, 11)), (4, 0)): 0.0043430309585412025, (((2, 4),), (5, 0)): -0.005755186080932617, (((3, 5),), (5, 0)): -0.005755186080932617} samples= None
E=-8.02048573 angles= {(((2, 4), (3, 5)), (0, 0)): 0.22283865865781968, (((2, 10), (3, 11)), (1, 0)): 0.1259990399483573, (((2, 8), (3, 9)), (2, 0)): 0.1387374575540267, (((2, 6), (3, 7)), (3, 0)): 0.13921443619448012, (((0, 10), (1, 11)), (4, 0)): 0.004438309189553299, (((2, 4),), (5, 0)): -0.014225118429425795, (((3, 5),), (5, 0)): -0.014225118429425795} samples= None
Optimization terminated successfully.
Current function value: -8.020486
Iterations: 2
Function evaluations: 3
Gradient evaluations: 3
-------------------------------------
Finished iteration 5
current energy : -8.02048573
difference : +0.00008205
grad_norm : +0.01079170
max_grad : +0.00575519
circuit size : 7
pool gradient norm is +0.00711192, convergence criterion met
def meta_angle(R):
a = tq.assign_variable("a")
b = tq.assign_variable("b")
c = tq.assign_variable("c")
d = tq.assign_variable("d")
return a*(-(b*R-c)**2).apply(tq.numpy.exp) + d
def make_U(mol, angle):
U = mol.prepare_reference()
U += mol.make_excitation_gate([(0,2),(1,3)], angle)
return U
geomstring = "H 0.0 0.0 0.0\nH 0.0 0.0 {R}"
training_points = [0.5, 1.0, 1.5, 3.0]
meta_objective = 0.0
for R in training_points:
mol = tq.Molecule(name="H2_R_{R:1.4f}".format(R=R), geometry=geomstring.format(R=R), n_pno=1, executable=madness_exe)
H = mol.make_hamiltonian()
U = make_U(mol, meta_angle(R))
E = tq.ExpectationValue(H=H, U=U)
meta_objective += E
meta_objective = 1.0/len(training_points)*meta_objective
meta_vqe_result = tq.minimize(meta_objective, initial_values={"b":1.0, "c":1.0})
Starting madness calculation with executable: /home/jsk/devel/madness/build-opt//src/apps/pno/pno_integrals output redirected to H2_R_0.5000_pno_integrals.out logfile finished after 15.370546817779541s Starting madness calculation with executable: /home/jsk/devel/madness/build-opt//src/apps/pno/pno_integrals output redirected to H2_R_1.0000_pno_integrals.out logfile finished after 14.80038332939148s Starting madness calculation with executable: /home/jsk/devel/madness/build-opt//src/apps/pno/pno_integrals output redirected to H2_R_1.5000_pno_integrals.out logfile finished after 15.434062242507935s Starting madness calculation with executable: /home/jsk/devel/madness/build-opt//src/apps/pno/pno_integrals output redirected to H2_R_3.0000_pno_integrals.out logfile finished after 17.48304271697998s
/home/jsk/projects/OpenVQE/src/tequila/optimizers/optimizer_base.py:422: TequilaWarning:initial_variables given but not complete: Autocompleted with zeroes
Optimizer: <class 'tequila.optimizers.optimizer_scipy.OptimizerSciPy'>
backend : qulacs
device : None
samples : None
save_history : True
noise : None
Method : BFGS
Objective : 4 expectationvalues
gradient : 48 expectationvalues
active variables : 4
E=-1.34122288 angles= {a: 0.0, b: 1.0, c: 1.0, d: 0.0} samples= None
E=-1.36554265 angles= {a: 0.11155933141708374, b: 1.0, c: 1.0, d: 0.17781761288642883} samples= None
E=-1.36658454 angles= {a: 0.10272243630136521, b: 0.9935534159295202, c: 1.0064019139845308, d: 0.21499432013083114} samples= None
E=-1.36833477 angles= {a: 0.058099494256050405, b: 0.9775900773692061, c: 1.023056394046223, d: 0.28127795022067165} samples= None
E=-1.37103558 angles= {a: -0.05316870764747138, b: 0.9473497192317459, c: 1.0546766680502973, d: 0.3993030301002968} samples= None
E=-1.37367809 angles= {a: -0.23638881867206418, b: 0.9141771490413152, c: 1.087514230006737, d: 0.5495720430325262} samples= None
E=-1.37615788 angles= {a: -0.3819438289832486, b: 0.9126639231259984, c: 1.084286735142044, d: 0.6349892622508759} samples= None
E=-1.38046718 angles= {a: -0.6225324382535566, b: 0.9354639185360066, c: 1.0495662104891754, d: 0.7709032013625796} samples= None
E=-1.38611794 angles= {a: -1.0911498068140484, b: 0.9999316303568635, c: 0.9609608835327315, d: 1.0625908232037808} samples= None
E=-1.38980711 angles= {a: -1.2951536138478448, b: 1.055422858885136, c: 0.9059705725875977, d: 1.2249028024567779} samples= None
E=-1.39493084 angles= {a: -1.3402594291710288, b: 1.1215324685076185, c: 0.8588332482521858, d: 1.3181970735445094} samples= None
E=-1.39741099 angles= {a: -1.1057772177917484, b: 1.141596229592042, c: 0.8543830229869231, d: 1.2134582746327731} samples= None
E=-1.39752638 angles= {a: -1.1250263665432103, b: 1.1445457206821181, c: 0.8427627822572473, d: 1.220080721979179} samples= None
E=-1.39759398 angles= {a: -1.1151608958088748, b: 1.1426011916528398, c: 0.8304884798751907, d: 1.2068267724396289} samples= None
E=-1.39767385 angles= {a: -1.0916377609917123, b: 1.1354743641886265, c: 0.8094329141381655, d: 1.1858133605827417} samples= None
E=-1.39777207 angles= {a: -1.0681262502311963, b: 1.1186149090477226, c: 0.7807065574914076, d: 1.1683212632580873} samples= None
E=-1.39794147 angles= {a: -1.046939050820719, b: 1.0823409002837419, c: 0.7331046456751329, d: 1.1563951521075913} samples= None
E=-1.39823854 angles= {a: -1.031928244613442, b: 1.0110829485354644, c: 0.6514125610330178, d: 1.1547681298450811} samples= None
E=-1.39871931 angles= {a: -1.0337296420938615, b: 0.871100234470878, c: 0.5021653643027022, d: 1.1756866720711494} samples= None
E=-1.39906108 angles= {a: -1.0941205366939335, b: 0.6392381484864271, c: 0.2655964184477986, d: 1.251867226378342} samples= None
E=-1.39930475 angles= {a: -1.1468615703178604, b: 0.6804970922604371, c: 0.3136410048785928, d: 1.2871537328812395} samples= None
E=-1.39942431 angles= {a: -1.2203822986181394, b: 0.6324878977562862, c: 0.26531155889640234, d: 1.3549295616161512} samples= None
E=-1.39947999 angles= {a: -1.2855104601592944, b: 0.5614208809128503, c: 0.1979681817553786, d: 1.4171863148923727} samples= None
E=-1.39949763 angles= {a: -1.3358922759552763, b: 0.5262600795875232, c: 0.1592983242130536, d: 1.4672553898868412} samples= None
E=-1.39950812 angles= {a: -1.3730738848479491, b: 0.5112616885134806, c: 0.1487058615884992, d: 1.4998322850778472} samples= None
Optimization terminated successfully.
Current function value: -1.399508
Iterations: 24
Function evaluations: 25
Gradient evaluations: 25
from matplotlib import pyplot as plt
plt.figure()
plt.plot(list(predicted_angles.keys()), list(predicted_angles.values()), label="predicted", marker="o", markersize=5)
plt.plot(list(opt_angles.keys()), list(opt_angles.values()), label="opt", marker="x", markersize=3)
plt.title("angle")
plt.legend()
<matplotlib.legend.Legend at 0x7f411420a7d0>
from matplotlib import pyplot as plt
plt.figure()
plt.plot(list(predicted_energies.keys()), list(predicted_energies.values()), label="predicted", marker="o", markersize=5)
plt.plot(list(opt_energies.keys()), list(opt_energies.values()), label="opt", marker="x", markersize=3)
plt.title("energy")
plt.legend()
<matplotlib.legend.Legend at 0x7f41b4f3e350>


pip install git+https://github.com/aspuru-guzik-group/tequila.git pip install tequila