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

Merge pull request #161 from tnguyen-ornl/tnguyen/kernel-alloc

Move internal_compiler code to qcor and handle qalloc inside a quantum kernel
parents ce4d60f8 1d760a60
Loading
Loading
Loading
Loading
Loading
+41 −27
Original line number Diff line number Diff line
@@ -10,34 +10,48 @@ function(add_qcor_compile_and_exe_test test_name relative_source_location)
  )
endfunction()

add_test(NAME qrt_bell_multi COMMAND ${CMAKE_BINARY_DIR}/qcor -c ${CMAKE_CURRENT_SOURCE_DIR}/bell/bell_multi_qreg.cpp)
# Compile with FTQC runtime and execute
function(add_qcor_ftqc_compile_and_exe_test test_name relative_source_location)
  add_test(
  NAME
    ${test_name}
  COMMAND
    bash -c "${CMAKE_BINARY_DIR}/qcor -qrt ftqc ${CMAKE_CURRENT_SOURCE_DIR}/${relative_source_location} -o ${test_name}; \
              ${CMAKE_CURRENT_BINARY_DIR}/${test_name}"
  )
endfunction()

add_qcor_compile_and_exe_test(qrt_bell_multi bell/bell_multi_qreg.cpp)
add_test(NAME qrt_add_3_5 COMMAND ${CMAKE_BINARY_DIR}/qcor -v -c ${CMAKE_CURRENT_SOURCE_DIR}/adder/add_3_5.cpp WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/adder)
add_test(NAME qrt_mixed_language COMMAND ${CMAKE_BINARY_DIR}/qcor -c ${CMAKE_CURRENT_SOURCE_DIR}/simple/mixed_language.cpp)
add_test(NAME qrt_simple-demo COMMAND ${CMAKE_BINARY_DIR}/qcor -c ${CMAKE_CURRENT_SOURCE_DIR}/simple/simple-demo.cpp)
add_test(NAME qrt_deuteron_exp_inst COMMAND ${CMAKE_BINARY_DIR}/qcor -c ${CMAKE_CURRENT_SOURCE_DIR}/deuteron/deuteron_exp_inst.cpp)
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_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_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)
add_test(NAME qrt_ftqc_bit_flip_qec_std_lib COMMAND ${CMAKE_BINARY_DIR}/qcor -c -qrt ftqc ${CMAKE_CURRENT_SOURCE_DIR}/ftqc_qrt/error_correcting_code.cpp)
add_test(NAME qrt_ftqc_five_qubit_qec_std_lib COMMAND ${CMAKE_BINARY_DIR}/qcor -c -qrt ftqc ${CMAKE_CURRENT_SOURCE_DIR}/ftqc_qrt/five_qubit_qec_code.cpp)
add_test(NAME qrt_ftqc_steane_qec_std_lib COMMAND ${CMAKE_BINARY_DIR}/qcor -c -qrt ftqc ${CMAKE_CURRENT_SOURCE_DIR}/ftqc_qrt/steane_qec_code.cpp)
add_test(NAME quasimo_vqe COMMAND ${CMAKE_BINARY_DIR}/qcor ${CMAKE_CURRENT_SOURCE_DIR}/quasimo/VqeWithAnsatzCircuit.cpp)
add_test(NAME quasimo_trotter COMMAND ${CMAKE_BINARY_DIR}/qcor ${CMAKE_CURRENT_SOURCE_DIR}/quasimo/TrotterTdWorkflow.cpp)
add_test(NAME quasimo_iqpe_vqe COMMAND ${CMAKE_BINARY_DIR}/qcor ${CMAKE_CURRENT_SOURCE_DIR}/quasimo/IterativeQpeVqe.cpp)
add_test(NAME quasimo_adapt_vqe COMMAND ${CMAKE_BINARY_DIR}/qcor ${CMAKE_CURRENT_SOURCE_DIR}/quasimo/AdaptVqeWorkflow.cpp)
add_test(NAME quasimo_qaoa COMMAND ${CMAKE_BINARY_DIR}/qcor ${CMAKE_CURRENT_SOURCE_DIR}/quasimo/QaoaWorkflow.cpp)
add_test(NAME quasimo_qite COMMAND ${CMAKE_BINARY_DIR}/qcor ${CMAKE_CURRENT_SOURCE_DIR}/quasimo/QiteWorkflow.cpp)
add_test(NAME quasimo_heisenberg COMMAND ${CMAKE_BINARY_DIR}/qcor ${CMAKE_CURRENT_SOURCE_DIR}/quasimo/TdWorkflowHeisenbergModel.cpp)
add_test(NAME quasimo_verified_qpe COMMAND ${CMAKE_BINARY_DIR}/qcor ${CMAKE_CURRENT_SOURCE_DIR}/quasimo/VerifiedQuantumPhaseEstimation.cpp)
add_test(NAME hadamard_ctrl_test COMMAND ${CMAKE_BINARY_DIR}/qcor ${CMAKE_CURRENT_SOURCE_DIR}/ctrl-gates/simple_hadamard_test.cpp)
add_test(NAME multi_ctrl_test COMMAND ${CMAKE_BINARY_DIR}/qcor ${CMAKE_CURRENT_SOURCE_DIR}/ctrl-gates/multiple_controls.cpp)
add_qcor_compile_and_exe_test(qrt_mixed_language simple/mixed_language.cpp)
add_qcor_compile_and_exe_test(qrt_simple-demo simple/simple-demo.cpp)
add_qcor_compile_and_exe_test(qrt_deuteron_exp_inst deuteron/deuteron_exp_inst.cpp)
add_qcor_compile_and_exe_test(qrt_deuteron_task_initiate deuteron/deuteron_task_initiate.cpp)
add_qcor_compile_and_exe_test(qrt_qaoa_example qaoa/qaoa_example.cpp)
add_qcor_compile_and_exe_test(qrt_qpe_example qpe/qpe_example_qrt.cpp)
add_qcor_compile_and_exe_test(qrt_kernel_include simple/multiple_kernels.cpp)
add_qcor_compile_and_exe_test(qrt_grover grover/grover.cpp)
add_qcor_compile_and_exe_test(qrt_adapt hybrid/adapt_h2.cpp)
add_qcor_ftqc_compile_and_exe_test(qrt_ftqc_simple ftqc_qrt/simple-demo.cpp)
add_qcor_ftqc_compile_and_exe_test(qrt_ftqc_rus ftqc_qrt/repeat-until-success.cpp)
add_qcor_ftqc_compile_and_exe_test(qrt_ftqc_qec ftqc_qrt/bit-flip-code.cpp)
add_qcor_ftqc_compile_and_exe_test(qrt_ftqc_deuteron ftqc_qrt/deuteron.cpp)
add_qcor_ftqc_compile_and_exe_test(qrt_ftqc_bit_flip_qec_std_lib ftqc_qrt/error_correcting_code.cpp)
add_qcor_ftqc_compile_and_exe_test(qrt_ftqc_five_qubit_qec_std_lib ftqc_qrt/five_qubit_qec_code.cpp)
add_qcor_ftqc_compile_and_exe_test(qrt_ftqc_steane_qec_std_lib ftqc_qrt/steane_qec_code.cpp)
add_qcor_ftqc_compile_and_exe_test(qrt_ftqc_qalloc ftqc_qrt/qalloc_ftqc.cpp)
add_qcor_ftqc_compile_and_exe_test(qrt_ftqc_arithmetic ftqc_qrt/integer_add.cpp)
add_qcor_ftqc_compile_and_exe_test(qrt_ftqc_grover ftqc_qrt/grover.cpp)
add_qcor_compile_and_exe_test(quasimo_vqe quasimo/VqeWithAnsatzCircuit.cpp)
add_qcor_compile_and_exe_test(quasimo_trotter quasimo/TrotterTdWorkflow.cpp)
add_qcor_compile_and_exe_test(quasimo_iqpe_vqe quasimo/IterativeQpeVqe.cpp)
add_qcor_compile_and_exe_test(quasimo_adapt_vqe quasimo/AdaptVqeWorkflow.cpp)
add_qcor_compile_and_exe_test(quasimo_qaoa quasimo/QaoaWorkflow.cpp)
add_qcor_compile_and_exe_test(quasimo_qite quasimo/QiteWorkflow.cpp)
add_qcor_compile_and_exe_test(quasimo_heisenberg quasimo/TdWorkflowHeisenbergModel.cpp)
add_qcor_compile_and_exe_test(quasimo_verified_qpe quasimo/VerifiedQuantumPhaseEstimation.cpp)
add_qcor_compile_and_exe_test(hadamard_ctrl_test ctrl-gates/simple_hadamard_test.cpp)
add_qcor_compile_and_exe_test(multi_ctrl_test ctrl-gates/multiple_controls.cpp)

add_qcor_compile_and_exe_test(qrt_obj_func_simple simple/simple-objective-function.cpp)
add_qcor_compile_and_exe_test(qrt_kernel_autograd_simple simple/gradients_optimization.cpp)
+22 −0
Original line number Diff line number Diff line
// Generate a random bit string in an obscure way...
__qpu__ void test_random(qreg q) {
  for (int i = 0; i < q.size(); ++i) {
    // Allocate qubit:
    // This qubit should be reused...
    auto anc_reg = qalloc(1);
    H(anc_reg);
    // entangle each qubit in the register
    // -> reset anc => q[i] in random 0 or 1 state
    X::ctrl(anc_reg[0], q[i]);
    Reset(anc_reg[0]);
  }
  Measure(q);
}

int main(int argc, char **argv) {
  set_shots(1024);
  auto a = qalloc(8);
  test_random(a);
  a.print();
  return 0;
}
 No newline at end of file
+11 −18
Original line number Diff line number Diff line
@@ -6,14 +6,13 @@ __qpu__ void test_add_integer(qreg q) {
  Measure(q);
}

__qpu__ void test_add_integer_mod(qreg q, qubit anc) {
__qpu__ void test_add_integer_mod(qreg q) {
  H(q[2]); // |000> + |001>
  add_integer_mod(q, anc, 3, 5); // |3 mod 5> and |7 mod 5>
  add_integer_mod(q, 3, 5); // |3 mod 5> and |7 mod 5>
  Measure(q);
  Measure(anc);
}

__qpu__ void test_mul_integer(qreg x, qreg b, qubit anc, int a, int N) {
__qpu__ void test_mul_integer(qreg x, qreg b, int a, int N) {
  // b = 1;
  X(b[0]); 
  // x = |1> + |3>
@@ -22,18 +21,18 @@ __qpu__ void test_mul_integer(qreg x, qreg b, qubit anc, int a, int N) {

  // ==> |a*x + b> 
  
  mul_integer_mod(x, b, anc, a, N);
  mul_integer_mod(x, b, a, N);
  Measure(b);
  Measure(x);
}

__qpu__ void test_mul_integer_inline(qreg x, qreg anc, int a, int N) {
__qpu__ void test_mul_integer_inline(qreg x, int a, int N) {
  // x = |1> + |3>
  X(x[0]);
  H(x[1]);
  // ==> |a*x> inline (save in x)
  // anc register is just for scratch pad.
  mul_integer_mod_in_place(x, anc.head(x.size() + 1), anc[x.size() + 1], a, N);
  mul_integer_mod_in_place(x, a, N);
  Measure(x);
}

@@ -51,17 +50,13 @@ int main(int argc, char **argv) {

  // Test modular add
  auto b = qalloc(3);
  auto anc = qalloc(1);
  test_add_integer_mod::print_kernel(b, anc[0]);
  test_add_integer_mod(b, anc[0]);
  test_add_integer_mod::print_kernel(b);
  test_add_integer_mod(b);
  // |3 mod 5> and |7 mod 5> == |2> + |3>
  b.print();
  qcor_expect(b.counts().size() == 2);
  qcor_expect(b.counts()["110"] > 400);
  qcor_expect(b.counts()["010"] > 400);
  anc.print();
  // anc returns to 0
  qcor_expect(anc.counts()["0"] == 1024);

  // Test modular multiply 
  int a_val = 3;
@@ -70,9 +65,8 @@ int main(int argc, char **argv) {
  // More qubits to save the result
  auto b_reg = qalloc(5);
  auto x_reg = qalloc(2);
  auto anc_reg = qalloc(1);
  test_mul_integer::print_kernel(x_reg, b_reg, anc_reg[0], a_val, N_val);
  test_mul_integer(x_reg, b_reg, anc_reg[0], a_val, N_val);
  test_mul_integer::print_kernel(x_reg, b_reg, a_val, N_val);
  test_mul_integer(x_reg, b_reg, a_val, N_val);
  // x = |1> + |3>; |b> = 1
  // |a*x + b> = |4> + |10>
  b_reg.print();
@@ -91,8 +85,7 @@ int main(int argc, char **argv) {
  a_val = 2;
  N_val = 8;
  auto x_reg2 = qalloc(3);
  auto anc_reg2 = qalloc(5);
  test_mul_integer_inline(x_reg2, anc_reg2, a_val, N_val);
  test_mul_integer_inline(x_reg2, a_val, N_val);
  x_reg2.print();
  qcor_expect(x_reg2.counts().size() == 2);
  // 2
+29 −0
Original line number Diff line number Diff line
__qpu__ void ccnot(qreg q) {
  for (int i = 0; i < 8; ++i) {
    print("Initial state:", i);
    for (int j = 0; j < 3; ++j) {
      // set initial state
      if (i & (1 << j)) {
        X(q[j]);
      }
    }
    // CCNOT
    X::ctrl({q[0], q[1]}, q[2]);
    print("Measure:");
    for (int i = 0; i < q.size(); ++i) {
      if (Measure(q[i])) {
        print(1);
        X(q[i]);
      } else {
        print(0);
      }
    }
  }
}

int main() {
  // allocate 3 qubits
  auto q = qalloc(3);
  // Run the unitary evolution.
  ccnot(q);
}
 No newline at end of file
+1 −1
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@ int main(int argc, char **argv) {
  // 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");
  auto optimizer = createOptimizer("nlopt", {{"maxeval", 20}, {"ftol", 0.1}});
  OptFunction f(
      [&](const std::vector<double> &x, std::vector<double> &dx) {
        const double angle = x[0];
Loading