utilities.hpp
Go to the documentation of this file.
1 
14 #ifndef QUEST_TEST_UTILS_H
15 #define QUEST_TEST_UTILS_H
16 
17 #include "QuEST.h"
18 #include "QuEST_complex.h"
19 #include "catch.hpp"
20 #include <vector>
21 
25 extern QuESTEnv QUEST_ENV;
26 
36 #define NUM_QUBITS 5
37 
49 typedef std::vector<std::vector<qcomp>> QMatrix;
50 
60 typedef std::vector<qcomp> QVector;
61 
62 /* (Excluded from Doxygen doc)
63  *
64  * Define QVector and QMatrix operator overloads.
65  * Note that QMatrix overloads don't simply use QVector
66  * overloads, since the complex vector dot product involves
67  * conjugation, which doesn't occur in complex matrix multiplication.
68  * Note too we also avoid defining operators in terms of other operators
69  * (e.g. minus is plus(negative times)) since compiler optimisations
70  * may change the order of operations and confuse the overloads invoked.
71  * Definition of division using multiplication can furthermore
72  * heighten numerical errors.
73  *
74  * @ingroup testutilities
75  * @author Tyson Jones
76  */
77 QVector operator + (const QVector& v1, const QVector& v2);
78 QVector operator - (const QVector& v1, const QVector& v2);
79 QVector operator * (const qcomp& a, const QVector& v);
80 QVector operator * (const QVector& v, const qcomp& a);
81 QVector operator / (const QVector& v, const qcomp& a);
82 qcomp operator * (const QVector &v1, const QVector& v2);
83 void operator += (QVector& v1, const QVector& v2);
84 void operator -= (QVector& v1, const QVector& v2);
85 void operator *= (QVector& v1, const qcomp& a);
86 void operator /= (QVector& v1, const qcomp& a);
87 QMatrix operator + (const QMatrix& m1, const QMatrix& m2);
88 QMatrix operator - (const QMatrix& m1, const QMatrix& m2);
89 QMatrix operator * (const qcomp& a, const QMatrix& m);
90 QMatrix operator * (const QMatrix& m, const qcomp& a);
91 QMatrix operator / (const QMatrix& m, const qcomp& a);
92 QMatrix operator * (const QMatrix& m1, const QMatrix& m2);
93 void operator += (QMatrix& m1, const QMatrix& m2);
94 void operator -= (QMatrix& m1, const QMatrix& m2);
95 void operator *= (QMatrix& m1, const qreal& a);
96 void operator /= (QMatrix& m1, const qreal& a);
97 void operator *= (QMatrix& m1, const QMatrix& m2);
98 QVector operator * (const QMatrix& m, const QVector& v);
99 
107 QVector toQVector(Qureg qureg);
108 
116 QMatrix toQMatrix(Qureg qureg);
117 
124 QMatrix toQMatrix(Complex alpha, Complex beta);
125 
132 
139 
146 
154 
162 
171 
180 void toQureg(Qureg qureg, QVector vec);
181 
190 void toQureg(Qureg qureg, QMatrix mat);
191 
197 QMatrix getZeroMatrix(size_t dim);
198 
204 QMatrix getIdentityMatrix(size_t dim);
205 
213 
224 
232 
240 QMatrix getSwapMatrix(int qb1, int qb2, int numQb);
241 
256 QMatrix getFullOperatorMatrix(int* ctrls, int numCtrls, int *targs, int numTargs, QMatrix op, int numQubits);
257 
266 QMatrix getKetBra(QVector ket, QVector bra);
267 
274 
282 int getRandomInt(int min, int max);
283 
291 qreal getRandomReal(qreal min, qreal max);
292 
300 QVector getRandomQVector(int dim);
301 
309 QMatrix getRandomQMatrix(int dim);
310 
324 QMatrix getRandomUnitary(int numQb);
325 
333 QVector getRandomStateVector(int numQb);
334 
343 
353 std::vector<QMatrix> getRandomKrausMap(int numQb, int numOps);
354 
361 
370 void setSubMatrix(QMatrix &dest, QMatrix sub, size_t r, size_t c);
371 
391 void applyReferenceOp(QMatrix &state, int* ctrls, int numCtrls, int *targs, int numTargs, QMatrix op);
392 
412 void applyReferenceOp(QMatrix &state, int* ctrls, int numCtrls, int targ1, int targ2, QMatrix op);
413 
432 void applyReferenceOp(QMatrix &state, int* ctrls, int numCtrls, int target, QMatrix op);
433 
452 void applyReferenceOp(QMatrix &state, int *targs, int numTargs, QMatrix op);
453 
471 void applyReferenceOp(QMatrix &state, int ctrl, int targ, QMatrix op);
472 
491 void applyReferenceOp(QMatrix &state, int ctrl, int* targs, int numTargs, QMatrix op);
492 
510 void applyReferenceOp(QMatrix &state, int ctrl, int targ1, int targ2, QMatrix op);
511 
529 void applyReferenceOp(QMatrix &state, int targ, QMatrix op);
530 
549 void applyReferenceOp(QVector &state, int* ctrls, int numCtrls, int *targs, int numTargs, QMatrix op);
550 
567 void applyReferenceOp(QVector &state, int* ctrls, int numCtrls, int targ1, int targ2, QMatrix op);
568 
585 void applyReferenceOp(QVector &state, int* ctrls, int numCtrls, int target, QMatrix op);
586 
602 void applyReferenceOp(QVector &state, int *targs, int numTargs, QMatrix op);
603 
619 void applyReferenceOp(QVector &state, int ctrl, int targ, QMatrix op);
620 
637 void applyReferenceOp(QVector &state, int ctrl, int* targs, int numTargs, QMatrix op);
638 
655 void applyReferenceOp(QVector &state, int ctrl, int targ1, int targ2, QMatrix op);
656 
672 void applyReferenceOp(QVector &state, int targ, QMatrix op);
673 
687 bool areEqual(Qureg qureg1, Qureg qureg2);
688 
701 bool areEqual(Qureg qureg, QVector vec);
702 
715 bool areEqual(Qureg qureg, QMatrix matr);
716 
730 bool areEqual(Qureg qureg1, Qureg qureg2, qreal precision);
731 
744 bool areEqual(Qureg qureg, QVector vec, qreal precision);
745 
758 bool areEqual(Qureg qureg, QMatrix matr, qreal precision);
759 
766 bool areEqual(QVector a, QVector b);
767 
774 bool areEqual(QMatrix a, QMatrix b);
775 
780 qcomp expI(qreal phase);
781 
787 unsigned int calcLog2(long unsigned int res);
788 
789 // makes below signatures more concise
790 template<class T> using CatchGen = Catch::Generators::GeneratorWrapper<T>;
791 
814 CatchGen<int*> sublists(int* list, int len, int sublen);
815 
841 CatchGen<int*> sublists(CatchGen<int>&& gen, int numSamps, const int* exclude, int numExclude);
842 
868 CatchGen<int*> sublists(CatchGen<int>&& gen, int numSamps, int excluded);
869 
890 CatchGen<int*> sublists(CatchGen<int>&& gen, int sublen);
891 
906 CatchGen<int*> bitsets(int numBits);
907 
924 CatchGen<int*> sequences(int base, int numDigits);
925 
942 CatchGen<pauliOpType*> pauliseqs(int numPaulis);
943 
944 #endif // QUEST_TEST_UTILS_H
QMatrix getFullOperatorMatrix(int *ctrls, int numCtrls, int *targs, int numTargs, QMatrix op, int numQubits)
Takes a 2^numTargs-by-2^numTargs matrix op and a returns a 2^numQubits-by-2^numQubits matrix where op...
Definition: utilities.cpp:293
Catch::Generators::GeneratorWrapper< T > CatchGen
Definition: utilities.hpp:790
qcomp expI(qreal phase)
Returns the unit-norm complex number exp(i*phase).
Definition: utilities.cpp:406
void applyReferenceOp(QMatrix &state, int *ctrls, int numCtrls, int *targs, int numTargs, QMatrix op)
Modifies the density matrix state to be the result of applying the multi-target operator matrix op,...
Definition: utilities.cpp:629
QMatrix getConjugateTranspose(QMatrix a)
Returns the conjugate transpose of the complex square matrix a.
Definition: utilities.cpp:179
int getRandomInt(int min, int max)
Returns a random integer between min (inclusive) and max (exclusive), from the uniform distribution.
Definition: utilities.cpp:481
std::vector< QMatrix > getRandomKrausMap(int numQb, int numOps)
Returns a random Kraus map of #numOps 2^numQb-by-2^numQb operators, from an undisclosed distribution.
Definition: utilities.cpp:533
QMatrix getSwapMatrix(int qb1, int qb2, int numQb)
Returns the 2^numQb-by-2^numQb unitary matrix which swaps qubits qb1 and qb2; the SWAP gate of not-ne...
Definition: utilities.cpp:219
QMatrix getRandomUnitary(int numQb)
Returns a uniformly random (under Haar) 2^numQb-by-2^numQb unitary matrix.
Definition: utilities.cpp:485
qreal getRandomReal(qreal min, qreal max)
Returns a random real between min (inclusive) and max (exclusive), from the uniform distribution.
Definition: utilities.cpp:410
QMatrix getKetBra(QVector ket, QVector bra)
Returns the matrix |ket><bra|, with ith-jth element ket(i) conj(bra(j)), since |ket><bra| = sum_i a_i...
Definition: utilities.cpp:159
QuESTEnv QUEST_ENV
The single QuESTEnv environment created before the Catch tests begin, and destroyed thereafter.
Definition: main.cpp:20
void operator/=(QVector &v1, const qcomp &a)
Definition: utilities.cpp:73
Represents a 4x4 matrix of complex numbers.
Definition: QuEST.h:125
Information about the environment the program is running in.
Definition: QuEST.h:199
Represents a general 2^N by 2^N matrix of complex numbers.
Definition: QuEST.h:136
#define qreal
void toQureg(Qureg qureg, QVector vec)
Initialises the state-vector qureg to have the same amplitudes as vec.
Definition: utilities.cpp:946
unsigned int calcLog2(long unsigned int res)
Returns log2 of numbers which must be gauranteed to be 2^n.
QMatrix getExponentialOfPauliMatrix(qreal angle, QMatrix a)
Returns the matrix exponential of a kronecker product of pauli matrices (or of any involutory matrice...
Definition: utilities.cpp:205
void toComplexMatrixN(QMatrix qm, ComplexMatrixN cm)
Initialises cm with the values of qm.
Definition: utilities.cpp:824
std::vector< qcomp > QVector
A complex vector, which can be zero-initialised with QVector(numAmps).
Definition: utilities.hpp:60
void setSubMatrix(QMatrix &dest, QMatrix sub, size_t r, size_t c)
Modifies dest by overwriting its submatrix (from top-left corner (r, c) to bottom-right corner (r + d...
Definition: utilities.cpp:211
QVector toQVector(Qureg qureg)
Returns an equal-size copy of the given state-vector qureg.
Definition: utilities.cpp:904
CatchGen< int * > sequences(int base, int numDigits)
Returns a Catch2 generator of every numDigits-length sequence in the given base, in increasing lexogr...
Definition: utilities.cpp:1148
#define qcomp
ComplexMatrix4 toComplexMatrix4(QMatrix qm)
Returns a ComplexMatrix4 copy of QMatix qm.
Definition: utilities.cpp:818
bool areEqual(Qureg qureg1, Qureg qureg2)
Performs a hardware-agnostic comparison of the given quregs, checking whether the difference between ...
Definition: utilities.cpp:704
void operator-=(QVector &v1, const QVector &v2)
Definition: utilities.cpp:67
QVector getRandomStateVector(int numQb)
Returns a random numQb-length L2-normalised state-vector from an undisclosed distribution.
Definition: utilities.cpp:453
QVector operator-(const QVector &v1, const QVector &v2)
Definition: utilities.cpp:33
QMatrix getRandomQMatrix(int dim)
Returns a dim-by-dim complex matrix, where the real and imaginary value of each element are independe...
Definition: utilities.cpp:368
Represents a system of qubits.
Definition: QuEST.h:160
CatchGen< pauliOpType * > pauliseqs(int numPaulis)
Returns a Catch2 generator of every numPaulis-length set of Pauli-matrix types (or base-4 integers).
Definition: utilities.cpp:1153
QVector operator*(const qcomp &a, const QVector &v)
Definition: utilities.cpp:40
std::vector< std::vector< qcomp > > QMatrix
A complex square matrix.
Definition: utilities.hpp:49
ComplexMatrix2 toComplexMatrix2(QMatrix qm)
Returns a ComplexMatrix2 copy of QMatix qm.
Definition: utilities.cpp:812
CatchGen< int * > sublists(int *list, int len, int sublen)
Returns a Catch2 generator of every length-sublen sublist of length-len list, in increasing lexograph...
Definition: utilities.cpp:1074
QVector getNormalised(QVector vec)
Returns an L2-normalised copy of vec, using Kahan summation for improved accuracy.
Definition: utilities.cpp:431
QMatrix getIdentityMatrix(size_t dim)
Returns a dim-by-dim identity matrix.
Definition: utilities.cpp:151
QMatrix getKroneckerProduct(QMatrix a, QMatrix b)
Returns the kronecker product of a and b, where a and b are square but possibly differently-sized com...
Definition: utilities.cpp:169
QMatrix getRandomDensityMatrix(int numQb)
Returns a random numQb-by-numQb density matrix, from an undisclosed distribution, in a very mixed sta...
Definition: utilities.cpp:457
QVector operator/(const QVector &v, const qcomp &a)
Definition: utilities.cpp:49
QMatrix toQMatrix(Qureg qureg)
Returns an equal-size copy of the given density matrix qureg.
Definition: utilities.cpp:862
QMatrix getExponentialOfDiagonalMatrix(QMatrix a)
Returns the matrix exponential of a diagonal, square, complex matrix.
Definition: utilities.cpp:187
QMatrix getZeroMatrix(size_t dim)
Returns a dim-by-dim square complex matrix, initialised to all zeroes.
Definition: utilities.cpp:143
void operator*=(QVector &v1, const qcomp &a)
Definition: utilities.cpp:70
Represents one complex number.
Definition: QuEST.h:103
void operator+=(QVector &v1, const QVector &v2)
Definition: utilities.cpp:64
QVector getRandomQVector(int dim)
Returns a dim-length vector with random complex amplitudes in the square joining {-1-i,...
Definition: utilities.cpp:420
CatchGen< int * > bitsets(int numBits)
Returns a Catch2 generator of every numBits-length bit-set, in increasing lexographic order,...
Definition: utilities.cpp:1143
QVector operator+(const QVector &v1, const QVector &v2)
Definition: utilities.cpp:26
Represents a 2x2 matrix of complex numbers.
Definition: QuEST.h:114