12#include <catch2/catch_test_macros.hpp>
13#include <catch2/matchers/catch_matchers_string.hpp>
14#include <catch2/generators/catch_generators_range.hpp>
16#include "tests/utils/qvector.hpp"
17#include "tests/utils/qmatrix.hpp"
18#include "tests/utils/cache.hpp"
19#include "tests/utils/compare.hpp"
20#include "tests/utils/convert.hpp"
21#include "tests/utils/evolve.hpp"
22#include "tests/utils/linalg.hpp"
23#include "tests/utils/lists.hpp"
24#include "tests/utils/macros.hpp"
25#include "tests/utils/measure.hpp"
26#include "tests/utils/random.hpp"
28using Catch::Matchers::ContainsSubstring;
37#define TEST_CATEGORY \
38 LABEL_UNIT_TAG "[initialisations]"
41void TEST_ON_CACHED_QUREGS(quregCache quregs,
auto testFunc) {
43 for (
auto& [label, qureg]: quregs) {
45 DYNAMIC_SECTION( label ) {
53void TEST_ON_CACHED_QUREGS(quregCache quregs,
auto apiFunc,
auto refState) {
57 auto testFunc = [&](
Qureg qureg) {
59 REQUIRE_AGREE( qureg, refState );
62 TEST_ON_CACHED_QUREGS(quregs, testFunc);
77 SECTION( LABEL_CORRECTNESS ) {
79 SECTION( LABEL_STATEVEC ) { TEST_ON_CACHED_QUREGS(getCachedStatevecs(),
initBlankState, getRefStatevec()); }
80 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(getCachedDensmatrs(),
initBlankState, getRefDensmatr()); }
89 SECTION( LABEL_CORRECTNESS ) {
91 qvector refVec = getRefStatevec(); refVec[0] = 1;
92 qmatrix refMat = getRefDensmatr(); refMat[0][0] = 1;
94 SECTION( LABEL_STATEVEC ) { TEST_ON_CACHED_QUREGS(getCachedStatevecs(),
initZeroState, refVec); }
95 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(getCachedDensmatrs(),
initZeroState, refMat); }
104 SECTION( LABEL_CORRECTNESS ) {
106 int numQubits = getNumCachedQubits();
107 qreal vecElem = 1. / std::sqrt(getPow2(numQubits));
108 qreal matElem = 1. / getPow2(numQubits);
110 qvector refVec = getConstantVector(getPow2(numQubits), vecElem);
111 qmatrix refMat = getConstantMatrix(getPow2(numQubits), matElem);
113 SECTION( LABEL_STATEVEC ) { TEST_ON_CACHED_QUREGS(getCachedStatevecs(),
initPlusState, refVec); }
114 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(getCachedDensmatrs(),
initPlusState, refMat); }
123 SECTION( LABEL_CORRECTNESS ) {
125 int numQubits = getNumCachedQubits();
126 int numInds = (int) getPow2(numQubits);
127 int stateInd = GENERATE_COPY( range(0,numInds) );
129 qvector refVec = getRefStatevec(); refVec[stateInd] = 1;
130 qmatrix refMat = getRefDensmatr(); refMat[stateInd][stateInd] = 1;
134 SECTION( LABEL_STATEVEC ) { TEST_ON_CACHED_QUREGS(getCachedStatevecs(), apiFunc, refVec); }
135 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(getCachedDensmatrs(), apiFunc, refMat); }
144 SECTION( LABEL_CORRECTNESS ) {
146 qvector refVec = getRefStatevec(); setToDebugState(refVec);
147 qmatrix refMat = getRefDensmatr(); setToDebugState(refMat);
149 SECTION( LABEL_STATEVEC ) { TEST_ON_CACHED_QUREGS(getCachedStatevecs(),
initDebugState, refVec); }
150 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(getCachedDensmatrs(),
initDebugState, refMat); }
159 SECTION( LABEL_CORRECTNESS ) {
162 GENERATE( range(0,10) );
164 auto testFunc = [&](
Qureg qureg) {
173 REQUIRE( qureg.cpuAmps[0] != qureg.cpuAmps[1] );
176 REQUIRE_AGREE( prob, 1 );
179 REQUIRE_AGREE( purity, 1 );
182 SECTION( LABEL_STATEVEC ) { TEST_ON_CACHED_QUREGS(getCachedStatevecs(), testFunc); }
183 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(getCachedDensmatrs(), testFunc); }
192 SECTION( LABEL_CORRECTNESS ) {
196 GENERATE( range(0,10) );
197 int numPureStates = GENERATE( 1, 2, 10 );
199 auto testFunc = [&](
Qureg qureg) {
208 REQUIRE( qureg.cpuAmps[0] != qureg.cpuAmps[1] );
211 REQUIRE_AGREE( prob, 1 );
214 if (numPureStates == 1)
215 REQUIRE_AGREE( purity, 1 );
217 REQUIRE( purity < 1 );
220 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(getCachedDensmatrs(), testFunc); }
229 SECTION( LABEL_CORRECTNESS ) {
232 qvector refVec = getRandomVector(getPow2(getNumCachedQubits()));
233 qmatrix refMat = getOuterProduct(refVec, refVec);
237 SECTION( LABEL_STATEVEC ) { TEST_ON_CACHED_QUREGS(getCachedStatevecs(), apiFunc, refVec); }
238 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(getCachedDensmatrs(), apiFunc, refMat); }
249 SECTION( LABEL_CORRECTNESS ) {
251 int numTotalAmps = getPow2(getNumCachedQubits());
252 int numSetAmps = GENERATE_COPY( range(0,numTotalAmps+1) );
253 int startInd = GENERATE_COPY( range(0,numTotalAmps-numSetAmps) );
254 qvector amps = getRandomVector(numSetAmps);
256 auto testFunc = [&](
Qureg qureg) {
259 qvector refVec = getRandomVector(numTotalAmps);
260 setQuregToReference(qureg, refVec);
263 setSubVector(refVec, amps, startInd);
268 REQUIRE_AGREE( qureg, refVec );
271 SECTION( LABEL_STATEVEC ) { TEST_ON_CACHED_QUREGS(getCachedStatevecs(), testFunc); }
280 SECTION( LABEL_CORRECTNESS ) {
282 int numTotalRows = getPow2(getNumCachedQubits());
283 int numTotalAmps = numTotalRows * numTotalRows;
286 GENERATE( range(0,1000) );
288 int startInd =
getRandomInt(0, numTotalAmps - numSetAmps);
289 qvector amps = getRandomVector(numSetAmps);
291 auto testFunc = [&](
Qureg qureg) {
294 qmatrix refMat = getRandomMatrix(numTotalRows);
295 setQuregToReference(qureg, refMat);
298 refMat = getTranspose(refMat);
300 refMat = getTranspose(refMat);
306 REQUIRE_AGREE( qureg, refMat );
309 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(getCachedDensmatrs(), testFunc); }
321 SECTION( LABEL_CORRECTNESS ) {
323 int numTotalRowsCols = getPow2(getNumCachedQubits());
326 GENERATE( range(0,1000) );
329 int startRow =
getRandomInt(0, numTotalRowsCols - numSetRows);
330 int startCol =
getRandomInt(0, numTotalRowsCols - numSetCols);
333 qmatrix amps = getRandomNonSquareMatrix(numSetRows, numSetCols);
335 auto testFunc = [&](
Qureg qureg) {
338 qmatrix refMat = getRandomMatrix(numTotalRowsCols);
339 setQuregToReference(qureg, refMat);
342 std::vector<qcomp*> rowPtrs(numSetRows);
343 for (
size_t r=0; r<numSetRows; r++)
344 rowPtrs[r] = amps[r].data();
351 REQUIRE_AGREE( qureg, refMat );
354 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(getCachedDensmatrs(), testFunc); }
364 SECTION( LABEL_CORRECTNESS ) {
366 GENERATE( range(0,10) );
367 qindex dim = getPow2(getNumCachedQubits());
368 qvector refVec = getRandomVector(dim);
369 qmatrix refMat = getRandomMatrix(dim);
372 if (doScalarsAgree(getTrace(refMat), 0))
373 refMat[0][0] += 1/(qreal) dim;
380 refVec = getNormalised(refVec);
383 refMat /= getReferenceProbability(refMat);
385 SECTION( LABEL_STATEVEC ) { TEST_ON_CACHED_QUREGS(getCachedStatevecs(), funcVec, refVec); }
386 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(getCachedDensmatrs(), funcMat, refMat); }
395 SECTION( LABEL_CORRECTNESS ) {
397 GENERATE( range(0,10) );
398 int numQubits = getNumCachedQubits();
399 int numTerms = GENERATE_COPY( 1, numQubits, getPow2(2*numQubits) );
400 PauliStrSum sum = createRandomPauliStrSum(numQubits, numTerms);
401 qmatrix refMat = getMatrix(sum, numQubits);
405 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(getCachedDensmatrs(), apiFunc, refMat); }
qreal calcPurity(Qureg qureg)
qreal calcTotalProb(Qureg qureg)
void setDensityQuregFlatAmps(Qureg qureg, qindex startInd, qcomp *amps, qindex numAmps)
void setQuregToReducedDensityMatrix(Qureg out, Qureg in, int *retainQubits, int numRetainQubits)
void setQuregToPauliStrSum(Qureg qureg, PauliStrSum sum)
void setQuregAmps(Qureg qureg, qindex startInd, qcomp *amps, qindex numAmps)
void setQuregToPartialTrace(Qureg out, Qureg in, int *traceOutQubits, int numTraceQubits)
qreal setQuregToRenormalized(Qureg qureg)
void setQuregToClone(Qureg targetQureg, Qureg copyQureg)
void setDensityQuregAmps(Qureg qureg, qindex startRow, qindex startCol, qcomp **amps, qindex numRows, qindex numCols)
void setQuregToSuperposition(qcomp facOut, Qureg out, qcomp fac1, Qureg qureg1, qcomp fac2, Qureg qureg2)
void initArbitraryPureState(Qureg qureg, qcomp *amps)
void initRandomPureState(Qureg qureg)
void initPlusState(Qureg qureg)
void initZeroState(Qureg qureg)
void initPureState(Qureg qureg, Qureg pure)
void initDebugState(Qureg qureg)
void initRandomMixedState(Qureg qureg, qindex numPureStates)
void initClassicalState(Qureg qureg, qindex stateInd)
void initBlankState(Qureg qureg)
void syncQuregFromGpu(Qureg qureg)
void setSubMatrix(qmatrix &dest, qmatrix sub, size_t r, size_t c)
int getRandomInt(int min, int maxExcl)
TEST_CASE("initBlankState", TEST_CATEGORY)