QCOR
kernel_evaluator.hpp
1 #pragma once
2 
3 #include "objective_function.hpp"
4 #include "qcor_observable.hpp"
5 #include "qcor_utils.hpp"
6 #include "quantum_kernel.hpp"
7 
8 #include <functional>
9 
10 namespace qcor {
11 
13 protected:
14  // Quantum kernel function pointer, we will use
15  // this to cast to kernel(composite, args...).
16  // Doing it this way means we don't template KernelFunctor
17  void *kernel_ptr;
18 
19  size_t nbParams;
20 
21  // CompositeInstruction representation of the
22  // evaluated quantum kernel
23  std::shared_ptr<CompositeInstruction> kernel;
24  qreg q;
25 
26 public:
27  KernelFunctor() = default;
28  KernelFunctor(qreg qReg) : q(qReg){};
29  // Direct construction via a Composite Instruction
30  KernelFunctor(std::shared_ptr<CompositeInstruction> composite) {
31  kernel = composite;
32  q = qalloc(composite->nPhysicalBits());
33  nbParams = composite->nVariables();
34  }
35  qreg &getQreg() { return q; }
36  size_t nParams() const { return nbParams; }
37  virtual std::shared_ptr<CompositeInstruction>
38  evaluate_kernel(const std::vector<double> &in_params) {
39  return kernel ? kernel->operator()(in_params) : nullptr;
40  }
41 };
42 
43 template <typename... KernelArgs>
45 private:
46  using LocalArgsTranslator = ArgsTranslator<KernelArgs...>;
47 
48  std::shared_ptr<CompositeInstruction> create_new_composite() {
49  // Create a composite that we can pass to the functor
50  std::stringstream name_ss;
51  name_ss << this << "_qkernel";
52  auto _kernel = qcor::__internal__::create_composite(name_ss.str());
53  return _kernel;
54  }
55 
56 protected:
57  std::shared_ptr<LocalArgsTranslator> args_translator;
58  std::shared_ptr<KernelFunctor> helper;
59 
60 public:
61  KernelFunctorImpl(void *k_ptr,
62  std::shared_ptr<LocalArgsTranslator> translator,
63  std::shared_ptr<KernelFunctor> obj_helper, qreg qReg,
64  size_t nParams)
65  : KernelFunctor(qReg) {
66  kernel_ptr = k_ptr;
67  args_translator = translator;
68  helper = obj_helper;
69  nbParams = nParams;
70  }
71 
72  std::shared_ptr<CompositeInstruction>
73  evaluate_kernel(const std::vector<double> &in_params) override {
74  // Create a new CompositeInstruction, and create a tuple
75  // from it so we can concatenate with the tuple args
76  auto m_kernel = create_new_composite();
77  auto kernel_composite_tuple = std::make_tuple(m_kernel);
78  // Translate x parameters into kernel args (represented as a tuple)
79  auto translated_tuple = (*args_translator)(in_params);
80 
81  // Concatenate the two to make the args list (kernel, args...)
82  auto concatenated =
83  std::tuple_cat(kernel_composite_tuple, translated_tuple);
84  auto kernel_functor = reinterpret_cast<void (*)(
85  std::shared_ptr<CompositeInstruction>, KernelArgs...)>(kernel_ptr);
86  // Call the functor with those arguments
87  qcor::__internal__::evaluate_function_with_tuple_args(kernel_functor,
88  concatenated);
89 
90  return m_kernel;
91  }
92 };
93 
94 template <typename... Args>
95 std::shared_ptr<KernelFunctor> createKernelFunctor(
96  void (*quantum_kernel_functor)(std::shared_ptr<CompositeInstruction>,
97  Args...),
98  size_t nQubits, size_t nParams) {
99 
100  auto q = qalloc(nQubits);
101  auto helper = std::make_shared<KernelFunctor>(q);
103  auto args_translator = auto_gen(helper->getQreg(), std::tuple<Args...>());
104 
105  void *kernel_ptr = reinterpret_cast<void *>(quantum_kernel_functor);
106 
107  return std::make_shared<KernelFunctorImpl<Args...>>(
108  kernel_ptr, args_translator, helper, q, nParams);
109 }
110 
111 inline std::shared_ptr<KernelFunctor>
112 createKernelFunctor(std::shared_ptr<CompositeInstruction> composite) {
113  return std::make_shared<KernelFunctor>(composite);
114 }
115 } // namespace qcor
qcor::__internal__::ArgsTranslatorAutoGenerator
Definition: objective_function.hpp:128
qcor::KernelFunctor
Definition: kernel_evaluator.hpp:12
qcor::KernelFunctorImpl
Definition: kernel_evaluator.hpp:44
qcor
Definition: qcor_syntax_handler.cpp:15
xacc::internal_compiler::qreg
Definition: qalloc.hpp:101
qcor::ArgsTranslator
Definition: qcor_utils.hpp:162