Hi @whatsis -
Yes that worked, I confirm I now get the same expectation values for the two Hamiltonians with a HF state occupancy.
However I think there is still a problem using the tapered Hamiltonian for a VQE simulation given the output below
VQE simulation
singles, doubles = qml.qchem.excitations(n_electrons, len(H_tapered.wires))
tapered_doubles = [
qml.taper_operation(qml.DoubleExcitation, generators, paulixops, paulix_sector,
wire_order=H_tapered.wires, op_wires=double) for double in doubles
]
tapered_singles = [
qml.taper_operation(qml.SingleExcitation, generators, paulixops, paulix_sector,
wire_order=H_tapered.wires, op_wires=single) for single in singles
]
dev = qml.device("lightning.qubit", wires=H_tapered.wires)
@qml.qnode(dev, interface="jax")
def tapered_circuit(params):
# see https://github.com/PennyLaneAI/pennylane/issues/6934
# qml.BasisState(state_tapered, wires=H_tapered.wires)
#qml.BasisState(jnp.array([1, 1, 0, 0, 0, 1, 1, 0]), wires=H_tapered.wires)
qml.BasisState(jnp.array([1, 1, 1, 1, 0, 0, 0, 0]), wires=H_tapered.wires)
for idx, tapered_op in enumerate(tapered_doubles + tapered_singles):
tapered_op(params[idx])
return qml.expval(H_tapered)
import optax
import catalyst
opt = optax.sgd(learning_rate=0.8) # sgd stands for StochasticGradientDescent
init_params = jnp.zeros(len(doubles) + len(singles))
def update_step(i, params, opt_state):
"""Perform a single gradient update step"""
grads = catalyst.grad(tapered_circuit)(params)
updates, opt_state = opt.update(grads, opt_state)
params = optax.apply_updates(params, updates)
return (params, opt_state)
loss_history = []
opt_state = opt.init(init_params)
params = init_params
for i in range(1, 21):
params, opt_state = update_step(i, params, opt_state)
energy = tapered_circuit(params)
if not i % 5:
print(f"n: {i}, E: {energy:.8f} Ha, Params: {params}")
n: 5, E: -4.92758152 Ha, Params: [-1.45322403e-18 0.00000000e+00 0.00000000e+00 2.74994521e-18
0.00000000e+00 2.02661812e-18 0.00000000e+00 0.00000000e+00
-1.36555428e-18 -3.06287114e-18 0.00000000e+00 0.00000000e+00
-2.16194043e-17 0.00000000e+00 -7.31294365e-18 0.00000000e+00
0.00000000e+00 -5.32089055e-18 7.77026132e-18 0.00000000e+00
2.91178160e-19 0.00000000e+00 3.02709247e-17 0.00000000e+00
-9.18048930e-18 0.00000000e+00]
n: 10, E: -4.92758152 Ha, Params: [-2.53510881e-18 0.00000000e+00 0.00000000e+00 8.29713203e-18
0.00000000e+00 4.27007667e-18 0.00000000e+00 0.00000000e+00
-2.68774048e-18 -5.18790740e-18 0.00000000e+00 0.00000000e+00
-4.17642936e-17 0.00000000e+00 -7.55417864e-18 0.00000000e+00
0.00000000e+00 -2.31510841e-18 9.64246282e-18 0.00000000e+00
-4.58477765e-19 0.00000000e+00 5.75060832e-17 0.00000000e+00
-1.89681318e-17 0.00000000e+00]
n: 15, E: -4.92758152 Ha, Params: [-3.22125980e-18 0.00000000e+00 0.00000000e+00 1.61645115e-17
0.00000000e+00 5.81964583e-18 0.00000000e+00 0.00000000e+00
-5.89643846e-18 -8.09356922e-18 0.00000000e+00 0.00000000e+00
-6.17357105e-17 0.00000000e+00 -9.37834879e-18 0.00000000e+00
0.00000000e+00 -3.10403387e-18 1.29024431e-17 0.00000000e+00
-1.67299605e-19 0.00000000e+00 8.47412418e-17 0.00000000e+00
-2.84088296e-17 0.00000000e+00]
n: 20, E: -4.92758152 Ha, Params: [-2.84760316e-18 0.00000000e+00 0.00000000e+00 2.20586430e-17
0.00000000e+00 7.41258308e-18 0.00000000e+00 0.00000000e+00
-8.99671622e-18 -1.02619736e-17 0.00000000e+00 0.00000000e+00
-8.28780658e-17 0.00000000e+00 -1.33844758e-17 0.00000000e+00
0.00000000e+00 -7.47082651e-18 2.06727044e-17 0.00000000e+00
-1.36329966e-19 0.00000000e+00 1.10848830e-16 0.00000000e+00
-3.72423742e-17 0.00000000e+00]
