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

minor updates, working on adapt impl from qcor kernels

parent 2e153dcb
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ int main(int argc, char **argv) {
  // need to provide ansatz, Operator, and qreg
  auto objective = createObjectiveFunction(
      ansatz, H, q, n_variational_params,
      {{"gradient-strategy", "parameter-shift-gradient"}});
      {{"gradient-strategy", "parameter-shift"}});

  // Create the Optimizer.
  auto optimizer = createOptimizer("nlopt", {{"nlopt-optimizer", "l-bfgs"}});
+11 −20
Original line number Diff line number Diff line
@@ -84,17 +84,17 @@ void QCORSyntaxHandler::GetReplacement(

  auto new_src = qcor::run_token_collector(PP, Toks, bufferNames);

  auto random_string = [](size_t length) {
    auto randchar = []() -> char {
      const char charset[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                             "abcdefghijklmnopqrstuvwxyz";
      const size_t max_index = (sizeof(charset) - 1);
      return charset[rand() % max_index];
    };
    std::string str(length, 0);
    std::generate_n(str.begin(), length, randchar);
    return str;
  };
//   auto random_string = [](size_t length) {
//     auto randchar = []() -> char {
//       const char charset[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
//                              "abcdefghijklmnopqrstuvwxyz";
//       const size_t max_index = (sizeof(charset) - 1);
//       return charset[rand() % max_index];
//     };
//     std::string str(length, 0);
//     std::generate_n(str.begin(), length, randchar);
//     return str;
//   };

  // Rewrite the original function
  OS << "void " << kernel_name << "(" << program_arg_types[0] << " "  << program_parameters[0];
@@ -147,18 +147,9 @@ void QCORSyntaxHandler::GetReplacement(
    OS << ", " << program_arg_types[i] << " " << program_parameters[i];
  }
  OS << ") {\n";
  if (shots > 0) {
    OS << "quantum::set_backend(\"" << qpu_name << "\", " << shots << ");\n";
  } else {
    OS << "quantum::set_backend(\"" << qpu_name << "\");\n";
  }
  OS << "if (!parent_kernel) {\n";
  OS << "parent_kernel = "
        "qcor::__internal__::create_composite(kernel_name);\n";
  for (auto bname : bufferNames) {
    auto random_buffer_name = "qreg_" + random_string(10);
    OS << bname << ".setNameAndStore(\"" << random_buffer_name << "\");\n";
  }
  OS << "}\n";
  OS << "quantum::set_current_program(parent_kernel);\n";
  OS << new_src << "\n";
+1 −0
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@ public:
    Derived derived(args...);
    derived.disable_destructor = true;
    derived(args...);
    xacc::internal_compiler::execute_pass_manager();
    os << derived.parent_kernel->toString() << "\n";
  }

+14 −4
Original line number Diff line number Diff line
@@ -69,6 +69,8 @@ void execute_pass_manager() {
    }
  }

//   std::cout << "PASS: " << ::quantum::program->nInstructions() << "\n";

  passManager.applyPlacement(::quantum::program);
}

@@ -331,9 +333,17 @@ void exp(qreg q, const double theta, std::shared_ptr<xacc::Observable> H) {

    xasm_src = xasm_src + "\n" + basis_front.str() + cnot_front.str();

    // FIXME, we assume real coefficients, if its zero, 
    // check that the imag part is not zero and use it 
    if (std::fabs(std::real(spinInst.coeff())) > 1e-12) {
      xasm_src = xasm_src + "Rz(q[" + std::to_string(qidxs[qidxs.size() - 1]) +
                 "], " + std::to_string(std::real(spinInst.coeff()) * theta) +
                 ");\n";
    } else if (std::fabs(std::imag(spinInst.coeff())) > 1e-12) {
      xasm_src = xasm_src + "Rz(q[" + std::to_string(qidxs[qidxs.size() - 1]) +
                 "], " + std::to_string(std::imag(spinInst.coeff()) * theta) +
                 ");\n";
    } 

    xasm_src = xasm_src + cnot_back.str() + basis_back.str();
  }
@@ -346,7 +356,7 @@ void exp(qreg q, const double theta, std::shared_ptr<xacc::Observable> H) {

  xasm_src = "__qpu__ void " + name + "(qbit q) {\n" + xasm_src + "}";

  // std::cout << xasm_src << "\n";
//   std::cout << "FROMQRT: " << theta << "\n" << xasm_src << "\n";
  auto xasm = xacc::getCompiler("xasm");
  auto tmp = xasm->compile(xasm_src)->getComposites()[0];