Commit c96722d4 authored by Mccaskey, Alex's avatar Mccaskey, Alex
Browse files

Merge branch 'master' of https://github.com/ornl-qci/qcor

parents edcfb177 14345237
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
#include "qcor.hpp"

__qpu__ void ansatz(qreg q, double theta) {
  X(q[0]);
  Ry(q[1], theta);
  CX(q[1],q[0]);
}
int main(int argc, char **argv){
    auto q = qalloc(2);
    // "5.907 - 2.1433 X0X1 - 2.1433 Y0Y1 + .21829 Z0 - 6.125 Z1"
    auto H = 5.907 - 2.1433 * qcor::X(0) * qcor::X(1) - 
    2.1433 * qcor::Y(0) * qcor::Y(1) - .21829*qcor::Z(0) - 6.125 * qcor::Z(1);

    auto ansatz_exponent = qcor::X(0)*qcor::Y(1) - qcor::Y(0)*qcor::X(1);

    qcor::OptFunction opt_func(
        [&](const std::vector<double> &x, std::vector<double> &grad) -> double {

        // Affect Observable observation and evaluate at given ansatz parameters
        auto e = qcor::observe(ansatz, H, q, x[0]);

        // Need to clean the current qubit register
        q.reset();
        return e;
        }, 1);

    auto optimizer = qcor::createOptimizer("nlopt");

    auto result = optimizer->optimize(opt_func);

    printf("energy = %f\n ", result.first);

    return 0;
}
 No newline at end of file
+1 −1
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@ add_library(${LIBRARY_NAME} SHARED ${SRC})

target_include_directories(${LIBRARY_NAME} PUBLIC . qrt)

target_link_libraries(${LIBRARY_NAME} PUBLIC xacc::xacc xacc::quantum_gate qrt)
target_link_libraries(${LIBRARY_NAME} PUBLIC xacc::xacc xacc::quantum_gate qrt xacc::pauli)

xacc_configure_library_rpath(${LIBRARY_NAME})

+15 −0
Original line number Diff line number Diff line
@@ -35,6 +35,21 @@ double observe(std::shared_ptr<CompositeInstruction> program,
    return q.weighted_sum(obs.get());
  }();
}

double observe(std::shared_ptr<CompositeInstruction> program,
               Observable& obs,
               xacc::internal_compiler::qreg &q) {
  return [program, &obs, &q]() {
    // Observe the program
    auto programs = obs.observe(program);

    xacc::internal_compiler::execute(q.results(), programs);

    // We want to contract q children buffer
    // exp-val-zs with obs term coeffs
    return q.weighted_sum(&obs);
  }();
}
} // namespace __internal__

std::shared_ptr<xacc::Optimizer> createOptimizer(const std::string &type,
+71 −0
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@

#include "qalloc"
#include "xacc_internal_compiler.hpp"
#include "PauliOperator.hpp"

#include "qrt.hpp"

@@ -22,6 +23,48 @@ using HeterogeneousMap = xacc::HeterogeneousMap;
using Observable = xacc::Observable;
using Optimizer = xacc::Optimizer;
using CompositeInstruction = xacc::CompositeInstruction;
using PauliOperator = xacc::quantum::PauliOperator;


PauliOperator X(int idx){
  return PauliOperator({{idx, "X"}});
}

PauliOperator Y(int idx){
  return PauliOperator({{idx, "Y"}});
}

PauliOperator Z(int idx){
  return PauliOperator({{idx, "Z"}});
}
template<typename T>
PauliOperator operator+(T coeff, PauliOperator &op){
  return PauliOperator(coeff) + op;
}
template<typename T>
PauliOperator operator+(PauliOperator &op, T coeff){
  return PauliOperator(coeff) + op;
}

template<typename T>
PauliOperator operator-(T coeff, PauliOperator &op){
  return -1.0*coeff + op;
}

template<typename T>
PauliOperator operator-(PauliOperator &op, T coeff){
  return -1.0*coeff + op;
}

PauliOperator SP(int idx){
  std::complex<double> imag (0.0, 1.0);
  return X(idx) + imag * Y(idx);
}

PauliOperator SM(int idx){
  std::complex<double> imag (0.0, 1.0);
  return X(idx) - imag * Y(idx);
}

class ResultsBuffer {
public:
@@ -224,6 +267,34 @@ auto observe(QuantumKernel &kernel, std::shared_ptr<Observable> obs,
  }(args...);
}

template <typename QuantumKernel, typename... Args>
auto observe(QuantumKernel &kernel, Observable &obs,
             Args... args) {
  auto program = __internal__::kernel_as_composite_instruction(kernel, args...);
  return [program, &obs](Args... args) {



    // Get the first argument, which should be a qreg
    auto q = std::get<0>(std::forward_as_tuple(args...));
    // std::cout << "\n" << program->toString() << "\n";

    // Set the arguments on the IR
#ifndef QCOR_USE_QRT
    program->updateRuntimeArguments(args...);
#endif

    // Observe the program
    auto programs = obs.observe(program);

    xacc::internal_compiler::execute(q.results(), programs);

    // We want to contract q children buffer
    // exp-val-zs with obs term coeffs
    return q.weighted_sum(&obs);
  }(args...);
}

// Create the desired Optimizer
std::shared_ptr<xacc::Optimizer>
createOptimizer(const std::string& type, HeterogeneousMap &&options = {});
+1 −1
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@ def main(argv=None):
                            '-lqcor', '-lqrt', '-lCppMicroServices',
                            '-lxacc-quantum-gate',
                            '-lxacc-pauli', '-lpthread']
    baseIncludes = ['-I', '@CMAKE_INSTALL_PREFIX@/include/xacc', '-I', '@CMAKE_INSTALL_PREFIX@/include/qcor']
    baseIncludes = ['-I', '@CMAKE_INSTALL_PREFIX@/include/xacc', '-I', '@CMAKE_INSTALL_PREFIX@/include/qcor', '-I', '@CMAKE_INSTALL_PREFIX@/include/quantum/gate']
    defaultFlags = ['-std=c++17', '-fplugin=@CMAKE_INSTALL_PREFIX@/clang-plugins/libqcor-syntax-handler.so']

    # Need to know if this is compile-only