7#include <catch2/generators/catch_generators.hpp>
8#include <catch2/generators/catch_generators_range.hpp>
9#include <catch2/generators/catch_generators_adapters.hpp>
27using Catch::Generators::IGenerator;
28using Catch::Generators::GeneratorWrapper;
37vector<int> getGeneratorElems(GeneratorWrapper<int>& gen) {
40 do { list.push_back(gen.get()); }
while (gen.next());
52vector<int> getSublist(vector<int> list,
int start,
int len) {
54 return vector<int>(list.begin() + start, list.begin() + start + len);
58vector<qcomp> getSublist(vector<qcomp> list,
int start,
int len) {
60 return vector<qcomp>(list.begin() + start, list.begin() + start + len);
70vector<int> getRange(
int start,
int endExcl) {
71 DEMAND( endExcl >= start );
73 vector<int> out(endExcl - start);
75 for (
size_t i=0; i<out.size(); i++)
82vector<int> getRange(
int endExcl) {
83 return getRange(0, endExcl);
93vector<int> getComplement(vector<int> listA, vector<int> listB) {
95 std::sort(listA.begin(), listA.end());
96 std::sort(listB.begin(), listB.end());
100 listA.begin(), listA.end(),
101 listB.begin(), listB.end(),
102 std::back_inserter(out));
115class SublistGenerator final :
public IGenerator<vector<int>> {
125 vector<bool> featured;
129 void prepareSublist() {
133 for (
size_t i=0; i<list.size(); i++)
135 sublist[j++] = list[i];
138 std::sort(sublist.begin(), sublist.end());
143 SublistGenerator(vector<int> list,
int sublen):
148 DEMAND( sublen <= list.size() );
151 sublist.resize(sublen);
152 featured.resize(list.size());
153 fill(featured.end() - sublen, featured.end(),
true);
158 vector<int>
const& get()
const override {
164 bool next()
override {
167 if (std::next_permutation(sublist.begin(), sublist.end()))
171 if (std::next_permutation(featured.begin(), featured.end())) {
183GeneratorWrapper<vector<int>> sublists(GeneratorWrapper<int>&& gen,
int sublen) {
186 do { list.push_back(gen.get()); }
while (gen.next());
188 return GeneratorWrapper<vector<int>>(
189 Catch::Detail::make_unique<SublistGenerator>(
201class DisjointSublistsGenerator :
public IGenerator<listpair> {
212 SublistGenerator subGen;
216 DisjointSublistsGenerator(vector<int> list,
int sublen1,
int sublen2):
220 subGen(list, sublen1 + sublen2)
222 static_cast<void>(next());
225 listpair
const& get()
const override {
229 bool next()
override {
236 vector<int> combined = subGen.get();
237 vector<int> sublist1 = getSublist(combined, 0, sublen1);
238 vector<int> sublist2 = getSublist(combined, sublen1, sublen2);
240 sublists = {sublist1, sublist2};
246GeneratorWrapper<listpair> disjointsublists(GeneratorWrapper<int>&& gen,
int sublen1,
int sublen2) {
249 do { list.push_back(gen.get()); }
while (gen.next());
251 return GeneratorWrapper<listpair>(
252 Catch::Detail::make_unique<DisjointSublistsGenerator>(
253 list, sublen1, sublen2));
263listpair GENERATE_CTRLS_AND_TARGS(
int numQubits,
int numCtrls,
int numTargs) {
264 DEMAND( numQubits >= numCtrls + numTargs );
267 int numPerms = getNumPermutations(numQubits, numCtrls + numTargs);
268 int maxPerms = getMaxNumTestedQubitPermutations();
270 maxPerms = std::numeric_limits<int>::max();
275 if (numPerms < maxPerms)
276 return GENERATE_COPY( disjointsublists(range(0,numQubits), numCtrls, numTargs) );
279 GENERATE_COPY( range(0,maxPerms) );
280 return getRandomFixedNumCtrlsTargs(numQubits, numCtrls, numTargs);
284vector<int> GENERATE_TARGS(
int numQubits,
int numTargs) {
285 DEMAND( numQubits >= numTargs );
287 auto [ctrls, targs] = GENERATE_CTRLS_AND_TARGS(numQubits, 0, numTargs);