Skip to content

Second Quantized Hamiltonian

View on GitHub

!pip install -qq "classiq[chemistry]"
import time

import numpy as np
from openfermion import FermionOperator

from classiq import *
from classiq.applications.chemistry.mapping import FermionToQubitMapper
from classiq.applications.chemistry.op_utils import qubit_op_to_pauli_terms
from classiq.applications.chemistry.problems import FermionHamiltonianProblem
op_list = [
    FermionOperator("0^ 0", 0.2),
    FermionOperator("0^ 1^ 1 0", -0.1),
    FermionOperator("2^ 3^ 2 3", -0.3),
]
hamiltonian = sum(op_list)

ham_problem = FermionHamiltonianProblem(
    fermion_hamiltonian=hamiltonian, n_particles=(1, 1)
)

print(ham_problem.fermion_hamiltonian)
0.2 [0^ 0] +
-0.1 [0^ 1^ 1 0] +
-0.3 [2^ 3^ 2 3]
mapper = FermionToQubitMapper()
vqe_hamiltonian = qubit_op_to_pauli_terms(mapper.map(ham_problem.fermion_hamiltonian))
num_qubits = mapper.get_num_qubits(ham_problem)

reps = 3
num_params = reps * num_qubits


@qfunc
def main(params: CArray[CReal, num_params], state: Output[QArray[QBit, num_qubits]]):
    allocate(state)
    full_hea(
        num_qubits=num_qubits,
        operands_1qubit=[lambda _, q: X(q), lambda theta, q: RY(theta, q)],
        operands_2qubit=[lambda _, q1, q2: CX(q1, q2)],
        is_parametrized=[0, 1, 0],
        angle_params=params,
        connectivity_map=[(0, 1), (1, 2), (2, 3)],
        reps=reps,
        x=state,
    )
qprog = synthesize(main)
show(qprog)
Quantum program link: https://platform.classiq.io/circuit/30Y1qjigHmi4wS5uE2JQXjbWdIu
with ExecutionSession(qprog) as es:
    result = es.minimize(
        cost_function=vqe_hamiltonian,
        initial_params={"params": [0.0] * num_params},
        max_iteration=200,
    )
optimizer_res = result[-1][0]
print("vqe result:", optimizer_res)
vqe result: 9.765625000001391e-05