3 #include <argparse.hpp>
11 #include "qcor_ir.hpp"
15 class IRTransformation;
16 class AcceleratorBuffer;
17 namespace internal_compiler {
25 static constexpr
double pi = 3.141592653589793238;
30 using ArgumentParser = argparse::ArgumentParser;
33 ArgumentParser &get_parser();
37 template <
typename... Targs>
38 argparse::Argument &add_argument(Targs... Fargs) {
39 return get_parser().add_argument(Fargs...);
47 template <
typename T = std::
string>
48 T get_argument(std::string_view argument_name) {
49 return get_parser().get<T>(argument_name);
56 void parse_args(
int argc,
const char *
const argv[]);
61 using PairList = std::vector<std::pair<T, T>>;
62 using HeterogeneousMap = xacc::HeterogeneousMap;
63 using IRTransformation = xacc::IRTransformation;
64 using IRProvider = xacc::IRProvider;
66 using UnitaryMatrix = Eigen::MatrixXcd;
67 using DenseMatrix = Eigen::MatrixXcd;
89 void error(
const std::string &msg);
90 std::vector<std::string> split(
const std::string &str,
char delimiter);
92 void persist_var_to_qreg(
const std::string &key,
double &val, qreg &q);
93 void persist_var_to_qreg(
const std::string &key,
int &val, qreg &q);
96 std::vector<T> linspace(T a, T b,
size_t N) {
97 T h = (b - a) /
static_cast<T
>(N - 1);
99 typename std::vector<T>::iterator x;
101 for (x = xs.begin(), val = a; x != xs.end(); ++x, val += h) *x = val;
105 inline std::vector<int> range(
int N) {
106 std::vector<int> vec(N);
107 std::iota(vec.begin(), vec.end(), 0);
111 inline std::vector<int> range(
int start,
int stop,
int step) {
113 error(
"step for range must be non-zero.");
117 std::vector<int> vec;
118 while ((step > 0) ? (i < stop) : (i > stop)) {
125 inline std::vector<int> range(
int start,
int stop) {
126 return range(start, stop, 1);
130 template <
typename T>
131 int len(
const T &countable) {
132 return countable.size();
135 template <
typename T>
136 int len(T &countable) {
137 return countable.size();
141 inline void print() { std::cout <<
"\n"; }
142 template <
typename T,
typename... TAIL>
143 void print(
const T &t, TAIL... tail) {
144 std::cout << t <<
" ";
148 std::shared_ptr<qcor::IRTransformation> createTransformation(
149 const std::string &transform_type);
152 template <
typename... Args>
153 using TranslationFunctor =
154 std::function<std::tuple<Args...>(
const std::vector<double> &)>;
161 template <
typename... Args>
164 TranslationFunctor<Args...> functor;
169 std::tuple<Args...> operator()(
const std::vector<double> &x) {
174 template <
typename... Args>
176 TranslationFunctor<Args...> functor) {
182 using GradientEvaluator =
183 std::function<void(std::vector<double> x, std::vector<double> &dx)>;
185 namespace __internal__ {
187 UnitaryMatrix map_composite_to_unitary_matrix(
188 std::shared_ptr<CompositeInstruction> composite);
190 std::string translate(
const std::string compiler,
191 std::shared_ptr<CompositeInstruction> program);
193 void append_plugin_path(
const std::string path);
197 std::shared_ptr<qcor::CompositeInstruction> create_composite(std::string name);
200 std::shared_ptr<qcor::CompositeInstruction> create_ctrl_u();
201 std::shared_ptr<qcor::CompositeInstruction> create_and_expand_ctrl_u(
202 HeterogeneousMap &&m);
205 std::shared_ptr<qcor::IRTransformation> get_transformation(
206 const std::string &transform_type);
209 std::shared_ptr<qcor::IRProvider> get_provider();
213 std::shared_ptr<qcor::CompositeInstruction>
214 decompose_unitary(
const std::string algorithm, UnitaryMatrix &mat,
225 template <
typename Function,
typename Tuple,
size_t... I>
226 auto evaluate_shared_ptr_fn_with_tuple_args(Function f, Tuple t,
227 std::index_sequence<I...>) {
228 return f->operator()(std::get<I>(t)...);
233 template <
typename Function,
typename Tuple>
234 auto evaluate_shared_ptr_fn_with_tuple_args(Function f, Tuple t) {
235 static constexpr
auto size = std::tuple_size<Tuple>::value;
236 return evaluate_shared_ptr_fn_with_tuple_args(
237 f, t, std::make_index_sequence<size>{});
242 template <
typename Function,
typename Tuple,
size_t... I>
243 auto evaluate_function_with_tuple_args(Function f, Tuple t,
244 std::index_sequence<I...>) {
245 return f(std::get<I>(t)...);
250 template <
typename Function,
typename Tuple>
251 auto evaluate_function_with_tuple_args(Function f, Tuple t) {
252 static constexpr
auto size = std::tuple_size<Tuple>::value;
253 return evaluate_function_with_tuple_args(f, t,
254 std::make_index_sequence<size>{});
263 std::vector<double> &vec;
265 void operator()(std::vector<double> tuple_element_vec) {
266 for (
auto &e : tuple_element_vec) {
270 void operator()(
double tuple_element_double) {
271 vec.push_back(tuple_element_double);
273 template <
typename T>
274 void operator()(T &) {}
278 template <
typename TupleType,
typename FunctionType>
280 TupleType &&, FunctionType,
281 std::integral_constant<
282 size_t, std::tuple_size<
283 typename std::remove_reference<TupleType>::type>::value>) {}
285 template <std::size_t I,
typename TupleType,
typename FunctionType,
286 typename =
typename std::enable_if<
287 I != std::tuple_size<
typename std::remove_reference<
288 TupleType>::type>::value>::type>
290 void tuple_for_each(TupleType &&t, FunctionType f,
291 std::integral_constant<size_t, I>) {
293 __internal__::tuple_for_each(std::forward<TupleType>(t), f,
294 std::integral_constant<size_t, I + 1>());
297 template <
typename TupleType,
typename FunctionType>
298 void tuple_for_each(TupleType &&t, FunctionType f) {
299 __internal__::tuple_for_each(std::forward<TupleType>(t), f,
300 std::integral_constant<size_t, 0>());
306 std::vector<double> random_vector(
const double l_range,
const double r_range,
307 const std::size_t size);
310 template <
typename... Args>
311 auto args_translator(
312 std::function<std::tuple<Args...>(
const std::vector<double>)>
314 return TranslationFunctor<Args...>(functor_lambda);
318 template <typename T, typename TIter = decltype(std::begin(std::declval<T>())),
319 typename = decltype(std::end(std::declval<T>()))>
320 constexpr
auto enumerate(T &&iterable) {
324 bool operator!=(
const iterator &other)
const {
return iter != other.iter; }
329 auto operator*()
const {
return std::tie(i, *iter); }
331 struct iterable_wrapper {
333 auto begin() {
return iterator{0, std::begin(iterable)}; }
334 auto end() {
return iterator{0, std::end(iterable)}; }
336 return iterable_wrapper{std::forward<T>(iterable)};
340 void set_backend(
const std::string &backend);
344 std::shared_ptr<CompositeInstruction> compile(
const std::string &src);
347 void set_verbose(
bool verbose);
353 void set_shots(
const int shots);
362 #define qcor_expect(test_condition) \
364 if (!(test_condition)) { \
365 std::stringstream ss; \
366 ss << __FILE__ << ":" << __LINE__ << ": Assertion failed: '" \
367 << #test_condition << "'."; \