3 #include "objective_function.hpp"
4 #include "qcor_observable.hpp"
5 #include "qcor_utils.hpp"
6 #include "quantum_kernel.hpp"
23 std::shared_ptr<CompositeInstruction> kernel;
30 KernelFunctor(std::shared_ptr<CompositeInstruction> composite) {
32 q = qalloc(composite->nPhysicalBits());
33 nbParams = composite->nVariables();
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;
43 template <
typename... KernelArgs>
48 std::shared_ptr<CompositeInstruction> create_new_composite() {
50 std::stringstream name_ss;
51 name_ss <<
this <<
"_qkernel";
52 auto _kernel = qcor::__internal__::create_composite(name_ss.str());
57 std::shared_ptr<LocalArgsTranslator> args_translator;
58 std::shared_ptr<KernelFunctor> helper;
62 std::shared_ptr<LocalArgsTranslator> translator,
63 std::shared_ptr<KernelFunctor> obj_helper,
qreg qReg,
67 args_translator = translator;
72 std::shared_ptr<CompositeInstruction>
73 evaluate_kernel(
const std::vector<double> &in_params)
override {
76 auto m_kernel = create_new_composite();
77 auto kernel_composite_tuple = std::make_tuple(m_kernel);
79 auto translated_tuple = (*args_translator)(in_params);
83 std::tuple_cat(kernel_composite_tuple, translated_tuple);
84 auto kernel_functor =
reinterpret_cast<void (*)(
85 std::shared_ptr<CompositeInstruction>, KernelArgs...)
>(kernel_ptr);
87 qcor::__internal__::evaluate_function_with_tuple_args(kernel_functor,
94 template <
typename... Args>
95 std::shared_ptr<KernelFunctor> createKernelFunctor(
96 void (*quantum_kernel_functor)(std::shared_ptr<CompositeInstruction>,
98 size_t nQubits,
size_t nParams) {
100 auto q = qalloc(nQubits);
101 auto helper = std::make_shared<KernelFunctor>(q);
103 auto args_translator = auto_gen(helper->getQreg(), std::tuple<Args...>());
105 void *kernel_ptr =
reinterpret_cast<void *
>(quantum_kernel_functor);
108 kernel_ptr, args_translator, helper, q, nParams);
111 inline std::shared_ptr<KernelFunctor>
112 createKernelFunctor(std::shared_ptr<CompositeInstruction> composite) {
113 return std::make_shared<KernelFunctor>(composite);