Loading examples/xasm/deuteron_pauli.cpp 0 → 100644 +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 runtime/CMakeLists.txt +1 −1 Original line number Diff line number Diff line Loading @@ -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}) Loading runtime/qcor.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -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, Loading runtime/qcor.hpp +71 −0 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ #include "qalloc" #include "xacc_internal_compiler.hpp" #include "PauliOperator.hpp" #include "qrt.hpp" Loading @@ -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: Loading Loading @@ -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 = {}); Loading scripts/qcor.in +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading
examples/xasm/deuteron_pauli.cpp 0 → 100644 +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
runtime/CMakeLists.txt +1 −1 Original line number Diff line number Diff line Loading @@ -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}) Loading
runtime/qcor.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -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, Loading
runtime/qcor.hpp +71 −0 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ #include "qalloc" #include "xacc_internal_compiler.hpp" #include "PauliOperator.hpp" #include "qrt.hpp" Loading @@ -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: Loading Loading @@ -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 = {}); Loading
scripts/qcor.in +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading