Unverified Commit 3e2e0690 authored by Mccaskey, Alex's avatar Mccaskey, Alex Committed by GitHub
Browse files

Merge pull request #37 from tnguyen-ornl/tnguyen/ftqc-shots

Refactor common kernels to qcor standard lib
parents 4b40a33c fe322eeb
Loading
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -6,11 +6,12 @@ add_test(NAME qrt_deuteron_exp_inst COMMAND ${CMAKE_BINARY_DIR}/qcor -c ${CMAKE_
add_test(NAME qrt_deuteron_task_initiate COMMAND ${CMAKE_BINARY_DIR}/qcor -c ${CMAKE_CURRENT_SOURCE_DIR}/deuteron/deuteron_task_initiate.cpp)
add_test(NAME qrt_qaoa_example COMMAND ${CMAKE_BINARY_DIR}/qcor -c ${CMAKE_CURRENT_SOURCE_DIR}/qaoa/qaoa_example.cpp)
add_test(NAME qrt_simple-objective-function COMMAND ${CMAKE_BINARY_DIR}/qcor -c ${CMAKE_CURRENT_SOURCE_DIR}/simple/simple-objective-function.cpp)
add_test(NAME qrt_qpe_example COMMAND ${CMAKE_BINARY_DIR}/qcor -c -I${CMAKE_CURRENT_SOURCE_DIR}/shared ${CMAKE_CURRENT_SOURCE_DIR}/qpe/qpe_example_qrt.cpp)
add_test(NAME qrt_kernel_include COMMAND ${CMAKE_BINARY_DIR}/qcor -c -I${CMAKE_CURRENT_SOURCE_DIR}/shared ${CMAKE_CURRENT_SOURCE_DIR}/simple/multiple_kernels.cpp)
add_test(NAME qrt_period_finding COMMAND ${CMAKE_BINARY_DIR}/qcor -c -I${CMAKE_CURRENT_SOURCE_DIR}/shared ${CMAKE_CURRENT_SOURCE_DIR}/simple/period_finding.cpp)
add_test(NAME qrt_qpe_example COMMAND ${CMAKE_BINARY_DIR}/qcor -c ${CMAKE_CURRENT_SOURCE_DIR}/qpe/qpe_example_qrt.cpp)
add_test(NAME qrt_kernel_include COMMAND ${CMAKE_BINARY_DIR}/qcor -c ${CMAKE_CURRENT_SOURCE_DIR}/simple/multiple_kernels.cpp)
add_test(NAME qrt_period_finding COMMAND ${CMAKE_BINARY_DIR}/qcor -c ${CMAKE_CURRENT_SOURCE_DIR}/simple/period_finding.cpp)
add_test(NAME qrt_grover COMMAND ${CMAKE_BINARY_DIR}/qcor -c ${CMAKE_CURRENT_SOURCE_DIR}/grover/grover.cpp)
add_test(NAME qrt_adapt COMMAND ${CMAKE_BINARY_DIR}/qcor -c ${CMAKE_CURRENT_SOURCE_DIR}/hybrid/adapt_h2.cpp)
add_test(NAME qrt_ftqc_simple COMMAND ${CMAKE_BINARY_DIR}/qcor -c -qrt ftqc ${CMAKE_CURRENT_SOURCE_DIR}/ftqc_qrt/simple-demo.cpp)
add_test(NAME qrt_ftqc_rus COMMAND ${CMAKE_BINARY_DIR}/qcor -c -qrt ftqc ${CMAKE_CURRENT_SOURCE_DIR}/ftqc_qrt/repeat-until-success.cpp)
add_test(NAME qrt_ftqc_qec COMMAND ${CMAKE_BINARY_DIR}/qcor -c -qrt ftqc ${CMAKE_CURRENT_SOURCE_DIR}/ftqc_qrt/bit-flip-code.cpp)
add_test(NAME qrt_ftqc_deuteron COMMAND ${CMAKE_BINARY_DIR}/qcor -c -qrt ftqc ${CMAKE_CURRENT_SOURCE_DIR}/ftqc_qrt/deuteron.cpp)
 No newline at end of file
+33 −0
Original line number Diff line number Diff line
#include <qcor_vqe>

// Compile with:
// qcor -qpu qpp -qrt ftqc deuteron.cpp 

__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) {
  // Allocate 2 qubits
  auto q = qalloc(2);
  // Hamiltonian
  auto H = 5.907 - 2.1433 * X(0) * X(1) - 2.1433 * Y(0) * Y(1) + .21829 * Z(0) -
           6.125 * Z(1);
  auto optimizer = createOptimizer("nlopt");
  OptFunction f(
      [&](const std::vector<double> &x, std::vector<double> &dx) {
        const double angle = x[0];
        auto statePrep =
            std::function<void(qreg)>{[angle](qreg q) { ansatz(q, angle); }};
        double energy = 0.0;
        ftqc::estimate_energy(q, statePrep, H, 1024, energy);
        std::cout << "Energy(" << angle << ") = " << energy << "\n";
        return energy;
      },
      1);

  auto result = optimizer->optimize(f);
  std::cout << "Min Energy = " << result.first << "\n";
}
+29 −0
Original line number Diff line number Diff line
// Compile with: qcor -qpu qpp -qrt ftqc -shots 1024 run-with-shots.cpp

// Define sub-kernel to print out FTQC execution
__qpu__ void h_gate(qreg q) { 
  std::cout << "Run H\n";
  H(q[0]); 
}
__qpu__ void cx_gate(qreg q) { 
  std::cout << "Run CNOT\n";
  CX(q[0], q[1]);
}

__qpu__ void bell(qreg q) {
  h_gate(q);
  cx_gate(q);
  const bool q0Result = Measure(q[0]);
  const bool q1Result = Measure(q[1]);
  if (q0Result == q1Result) {
    std::cout << " Matched!\n";
  } else {
    std::cout << "NOT Matched!\n";
  }
}

int main() {
  auto q = qalloc(2);
  bell(q);
  q.print();
}
+1 −1
Original line number Diff line number Diff line
// Use the pre-defined IQFT kernel
#include "qft.hpp"
#include <qcor_qft>

// using namespace qcor;

+1 −1
Original line number Diff line number Diff line
// The header file which contains QFT kernel def
#include "qft.hpp"
#include <qcor_qft>

// Entry point kernel
__qpu__ void f(qreg q) {
Loading