Commit 61ba4fb5 authored by Nguyen, Thien Minh's avatar Nguyen, Thien Minh
Browse files

Added a python example for QSim adapt workflow



Signed-off-by: default avatarThien Nguyen <nguyentm@ornl.gov>
parent b690d169
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ TEST(AdaptVqeWorkflowTester, checkSimple) {
  // std::cout << H_vqe.toString() << "\n";
  xacc::internal_compiler::qpu = xacc::getAccelerator("qsim");
  auto problemModel = qsim::ModelBuilder::createModel(&H_vqe);
  auto optimizer = createOptimizer("nlopt", {{"nlopt-optimizer", "l-bfgs"}, {"stopval", -1.137}});
  auto optimizer = createOptimizer("nlopt", {{"nlopt-optimizer", "l-bfgs"}});
  auto workflow = qsim::getWorkflow("adapt", {{"optimizer", optimizer},
                                              {"pool", pool_vqe},
                                              {"n-electrons", nElectrons}});
+45 −0
Original line number Diff line number Diff line
from qcor import *
from openfermion.ops import FermionOperator as FOp

# Define the Hamiltonian
H=  FOp('', 0.7080240981) + FOp('1^ 2^ 1 2', -0.165606823582) + FOp('1^ 0^ 0 1', 0.120200490713) + \
    FOp('0^ 3^ 1 2', -0.0454063328691) + FOp('2^ 0^ 0 2', 0.168335986252) + \
    FOp('1^ 2^ 3 0', 0.0454063328691) + FOp('0^ 2^ 2 0', 0.168335986252) + \
    FOp('0^ 3^ 3 0', 0.165606823582) + FOp('3^ 0^ 2 1', -0.0454063328691) + \
    FOp('1^ 3^ 0 2', -0.0454063328691) + FOp('3^ 1^ 2 0', -0.0454063328691) + \
    FOp('1^ 2^ 2 1', 0.165606823582) + FOp('0^ 3^ 0 3', -0.165606823582) + \
    FOp('3^ 3', -0.479677813134) + FOp('1^ 2^ 0 3', -0.0454063328691) + \
    FOp('1^ 3^ 1 3', -0.174072892497) + FOp('0^ 2^ 1 3', -0.0454063328691) + \
    FOp('0^ 1^ 1 0', 0.120200490713) + FOp('0^ 2^ 3 1', 0.0454063328691) + \
    FOp('1^ 3^ 3 1', 0.174072892497) + FOp('2^ 1^ 1 2', 0.165606823582) + \
    FOp('2^ 1^ 3 0', -0.0454063328691) + FOp('2^ 3^ 2 3', -0.120200490713) + \
    FOp('2^ 3^ 3 2', 0.120200490713) + FOp('0^ 2^ 0 2', -0.168335986252) + \
    FOp('3^ 2^ 2 3', 0.120200490713) + FOp('3^ 2^ 3 2', -0.120200490713) + \
    FOp('1^ 3^ 2 0', 0.0454063328691) + FOp('0^ 0', -1.2488468038) + \
    FOp('3^ 1^ 0 2', 0.0454063328691) + FOp('2^ 0^ 2 0', -0.168335986252) + \
    FOp('3^ 0^ 0 3', 0.165606823582) + FOp('2^ 0^ 3 1', -0.0454063328691) + \
    FOp('2^ 0^ 1 3', 0.0454063328691) + FOp('2^ 2', -1.2488468038) + \
    FOp('2^ 1^ 0 3', 0.0454063328691) + FOp('3^ 1^ 1 3', 0.174072892497) + \
    FOp('1^ 1', -0.479677813134) + FOp('3^ 1^ 3 1', -0.174072892497) + \
    FOp('3^ 0^ 1 2', 0.0454063328691) + FOp('3^ 0^ 3 0', -0.165606823582) + \
    FOp('0^ 3^ 2 1', 0.0454063328691) + FOp('2^ 1^ 2 1', -0.165606823582) + \
    FOp('0^ 1^ 0 1', -0.120200490713) + FOp('1^ 0^ 1 0', -0.120200490713) 

# Create a QSim problem model for the OpenFermion Hamiltonian
problemModel = qsim.ModelBuilder.createModel(H)
      
# Create the Adapt-VQE workflow
nElectrons = 2
pool_vqe = 'qubit-pool'
optimizer = createOptimizer('nlopt', {'nlopt-optimizer': 'l-bfgs'})
workflow = qsim.getWorkflow('adapt', {'optimizer': optimizer,
                                      'pool': pool_vqe,
                                      'n-electrons': nElectrons})
# Execute and print the result
result = workflow.execute(problemModel)
energy = result['energy']
# Expected: -1.137
print('Energy = ', energy)
# Print the final adapt ansatz circuit
adapt_ansatz = result['circuit']
print('Final circuit:\n', adapt_ansatz)
 No newline at end of file
+22 −1
Original line number Diff line number Diff line
@@ -688,7 +688,19 @@ PYBIND11_MODULE(_pyqcor, m) {
              return std::move(model);
            },
            "")

        .def(
            "createModel",
            [](py::object py_kernel, py::object &py_obs, const int n_params) {
              qcor::qsim::QuantumSimulationModel model;
              static auto obs = convertToQCOROperator(py_obs);
              auto nq = obs->nBits();
              auto kernel_functor = std::make_shared<qcor::PyKernelFunctor>(
                  py_kernel, nq, n_params);
              model.observable = obs.get();
              model.user_defined_ansatz = kernel_functor;
              return std::move(model);
            },
            "")
        .def(
            "createModel",
            [](py::object py_kernel, qcor::PauliOperator &obs,
@@ -733,6 +745,15 @@ PYBIND11_MODULE(_pyqcor, m) {
              return qcor::qsim::ModelBuilder::createModel(obs);
            },
            "")
        .def(
            "createModel",
            [](py::object &py_obs) {
              qcor::qsim::QuantumSimulationModel model;
              static auto obs = convertToQCOROperator(py_obs);
              model.observable = obs.get();
              return std::move(model);
            },
            "")
        .def(
            "createModel",
            [](qcor::qsim::ModelBuilder::ModelType type,