Qubit tapering / LiH

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]