7#include <catch2/generators/catch_generators.hpp>
8#include <catch2/generators/catch_generators_range.hpp>
9#include <catch2/generators/catch_generators_adapters.hpp>
11#include "quest/include/quest.h"
26using Catch::Generators::IGenerator;
27using Catch::Generators::GeneratorWrapper;
36vector<int> getGeneratorElems(GeneratorWrapper<int>& gen) {
39 do { list.push_back(gen.get()); }
while (gen.next());
51vector<int> getSublist(vector<int> list,
int start,
int len) {
53 return vector<int>(list.begin() + start, list.begin() + start + len);
57vector<qcomp> getSublist(vector<qcomp> list,
int start,
int len) {
59 return vector<qcomp>(list.begin() + start, list.begin() + start + len);
69vector<int> getRange(
int start,
int endExcl) {
70 DEMAND( endExcl >= start );
72 vector<int> out(endExcl - start);
74 for (
size_t i=0; i<out.size(); i++)
81vector<int> getRange(
int endExcl) {
82 return getRange(0, endExcl);
92vector<int> getComplement(vector<int> listA, vector<int> listB) {
94 std::sort(listA.begin(), listA.end());
95 std::sort(listB.begin(), listB.end());
99 listA.begin(), listA.end(),
100 listB.begin(), listB.end(),
101 std::back_inserter(out));
114class SublistGenerator final :
public IGenerator<vector<int>> {
124 vector<bool> featured;
128 void prepareSublist() {
132 for (
size_t i=0; i<list.size(); i++)
134 sublist[j++] = list[i];
137 std::sort(sublist.begin(), sublist.end());
142 SublistGenerator(vector<int> list,
int sublen):
147 DEMAND( sublen <= list.size() );
150 sublist.resize(sublen);
151 featured.resize(list.size());
152 fill(featured.end() - sublen, featured.end(),
true);
157 vector<int>
const& get()
const override {
163 bool next()
override {
166 if (std::next_permutation(sublist.begin(), sublist.end()))
170 if (std::next_permutation(featured.begin(), featured.end())) {
182GeneratorWrapper<vector<int>> sublists(GeneratorWrapper<int>&& gen,
int sublen) {
185 do { list.push_back(gen.get()); }
while (gen.next());
187 return GeneratorWrapper<vector<int>>(
188 Catch::Detail::make_unique<SublistGenerator>(
200class DisjointSublistsGenerator :
public IGenerator<listpair> {
211 SublistGenerator subGen;
215 DisjointSublistsGenerator(vector<int> list,
int sublen1,
int sublen2):
219 subGen(list, sublen1 + sublen2)
221 static_cast<void>(next());
224 listpair
const& get()
const override {
228 bool next()
override {
235 vector<int> combined = subGen.get();
236 vector<int> sublist1 = getSublist(combined, 0, sublen1);
237 vector<int> sublist2 = getSublist(combined, sublen1, sublen2);
239 sublists = {sublist1, sublist2};
245GeneratorWrapper<listpair> disjointsublists(GeneratorWrapper<int>&& gen,
int sublen1,
int sublen2) {
248 do { list.push_back(gen.get()); }
while (gen.next());
250 return GeneratorWrapper<listpair>(
251 Catch::Detail::make_unique<DisjointSublistsGenerator>(
252 list, sublen1, sublen2));
262listpair GENERATE_CTRLS_AND_TARGS(
int numQubits,
int numCtrls,
int numTargs) {
263 DEMAND( numQubits >= numCtrls + numTargs );
266 int numPerms = getNumPermutations(numQubits, numCtrls + numTargs);
269 maxPerms = std::numeric_limits<int>::max();
274 if (numPerms < maxPerms)
275 return GENERATE_COPY( disjointsublists(range(0,numQubits), numCtrls, numTargs) );
278 GENERATE_COPY( range(0,maxPerms) );
279 return getRandomFixedNumCtrlsTargs(numQubits, numCtrls, numTargs);
283vector<int> GENERATE_TARGS(
int numQubits,
int numTargs) {
284 DEMAND( numQubits >= numTargs );
286 auto [ctrls, targs] = GENERATE_CTRLS_AND_TARGS(numQubits, 0, numTargs);
const int TEST_MAX_NUM_QUBIT_PERMUTATIONS