QuEST_validation.c
Go to the documentation of this file.
1 // Distributed under MIT licence. See https://github.com/QuEST-Kit/QuEST/blob/master/LICENCE.txt for details
81 [E_INVALID_NUM_RANKS] = "Invalid number of nodes. Distributed simulation can only make use of a power-of-2 number of node.",
89 [E_INVALID_OFFSET_NUM_AMPS] = "More amplitudes given than exist in the statevector from the given starting index.",
100 [E_NON_UNITARY_COMPLEX_PAIR] = "Compact matrix formed by given complex numbers is not unitary.",
102 [E_SYS_TOO_BIG_TO_PRINT] = "Invalid system size. Cannot print output for systems greater than 5 qubits.",
108 [E_MISMATCHING_QUREG_TYPES] = "Registers must both be state-vectors or both be density matrices.",
113 [E_INVALID_ONE_QUBIT_DEPHASE_PROB] = "The probability of a single qubit dephase error cannot exceed 1/2, which maximally mixes.",
114 [E_INVALID_TWO_QUBIT_DEPHASE_PROB] = "The probability of a two-qubit qubit dephase error cannot exceed 3/4, which maximally mixes.",
115 [E_INVALID_ONE_QUBIT_DEPOL_PROB] = "The probability of a single qubit depolarising error cannot exceed 3/4, which maximally mixes.",
116 [E_INVALID_TWO_QUBIT_DEPOL_PROB] = "The probability of a two-qubit depolarising error cannot exceed 15/16, which maximally mixes.",
117 [E_INVALID_ONE_QUBIT_PAULI_PROBS] = "The probability of any X, Y or Z error cannot exceed the probability of no error.",
118 [E_INVALID_CONTROLS_BIT_STATE] = "The state of the control qubits must be a bit sequence (0s and 1s).",
119 [E_INVALID_PAULI_CODE] = "Invalid Pauli code. Codes must be 0 (or PAULI_I), 1 (PAULI_X), 2 (PAULI_Y) or 3 (PAULI_Z) to indicate the identity, X, Y and Z gates respectively.",
120 [E_INVALID_NUM_SUM_TERMS] = "Invalid number of terms in the Pauli sum. The number of terms must be >0.",
121 [E_CANNOT_FIT_MULTI_QUBIT_MATRIX] = "The specified matrix targets too many qubits; the batches of amplitudes to modify cannot all fit in a single distributed node's memory allocation.",
123 [E_COMPLEX_MATRIX_NOT_INIT] = "The ComplexMatrixN was not successfully created (possibly insufficient memory available).",
124 [E_INVALID_NUM_ONE_QUBIT_KRAUS_OPS] = "At least 1 and at most 4 single qubit Kraus operators may be specified.",
125 [E_INVALID_NUM_TWO_QUBIT_KRAUS_OPS] = "At least 1 and at most 16 two-qubit Kraus operators may be specified.",
126 [E_INVALID_NUM_N_QUBIT_KRAUS_OPS] = "At least 1 and at most 4*N^2 of N-qubit Kraus operators may be specified.",
127 [E_INVALID_KRAUS_OPS] = "The specified Kraus map is not a completely positive, trace preserving map.",
128 [E_MISMATCHING_NUM_TARGS_KRAUS_SIZE] = "Every Kraus operator must be of the same number of qubits as the number of targets.",
129 [E_DISTRIB_QUREG_TOO_SMALL] = "Too few qubits. The created qureg must have at least one amplitude per node used in distributed simulation.",
130 [E_NUM_AMPS_EXCEED_TYPE] = "Too many qubits (max of log2(SIZE_MAX)). Cannot store the number of amplitudes per-node in the size_t type."
301 void validateNumAmps(Qureg qureg, long long int startInd, long long int numAmps, const char* caller) {
308 QuESTAssert(targetQubit>=0 && targetQubit<qureg.numQubitsRepresented, E_INVALID_TARGET_QUBIT, caller);
312 QuESTAssert(controlQubit>=0 && controlQubit<qureg.numQubitsRepresented, E_INVALID_CONTROL_QUBIT, caller);
315 void validateControlTarget(Qureg qureg, int controlQubit, int targetQubit, const char* caller) {
328 QuESTAssert(numTargetQubits>0 && numTargetQubits<=qureg.numQubitsRepresented, E_INVALID_NUM_TARGETS, caller);
332 QuESTAssert(numControlQubits>0 && numControlQubits<qureg.numQubitsRepresented, E_INVALID_NUM_CONTROLS, caller);
335 void validateMultiTargets(Qureg qureg, int* targetQubits, const int numTargetQubits, const char* caller) {
343 void validateMultiControls(Qureg qureg, int* controlQubits, const int numControlQubits, const char* caller) {
352 QuESTAssert(numQubits>0 && numQubits<=qureg.numQubitsRepresented, E_INVALID_NUM_QUBITS, caller);
354 QuESTAssert(qubits[i]>=0 && qubits[i]<qureg.numQubitsRepresented, E_INVALID_QUBIT_INDEX, caller);
359 void validateMultiControlsTarget(Qureg qureg, int* controlQubits, const int numControlQubits, const int targetQubit, const char* caller) {
366 void validateMultiControlsMultiTargets(Qureg qureg, int* controlQubits, const int numControlQubits, int* targetQubits, const int numTargetQubits, const char* caller) {
377 QuESTAssert(controlState[i] == 0 || controlState[i] == 1, E_INVALID_CONTROLS_BIT_STATE, caller);
381 QuESTAssert(qureg.numAmpsPerChunk >= (1LL << numTargets), E_CANNOT_FIT_MULTI_QUBIT_MATRIX, caller);
403 void validateMultiQubitUnitaryMatrix(Qureg qureg, ComplexMatrixN u, int numTargs, const char* caller) {
435 QuESTAssert(qureg1.numQubitsRepresented==qureg2.numQubitsRepresented, E_MISMATCHING_QUREG_DIMENSIONS, caller);
511 void validateOneQubitKrausMap(Qureg qureg, ComplexMatrix2* ops, int numOps, const char* caller) {
523 void validateTwoQubitKrausMap(Qureg qureg, ComplexMatrix4* ops, int numOps, const char* caller) {
535 void validateMultiQubitKrausMap(Qureg qureg, int numTargs, ComplexMatrixN* ops, int numOps, const char* caller) {
void validateDensityMatrQureg(Qureg qureg, const char *caller)
Definition: QuEST_validation.c:422
void validateMeasurementProb(qreal prob, const char *caller)
Definition: QuEST_validation.c:430
void validateTarget(Qureg qureg, int targetQubit, const char *caller)
Definition: QuEST_validation.c:307
void validateOutcome(int outcome, const char *caller)
Definition: QuEST_validation.c:426
void validateStateIndex(Qureg qureg, long long int stateInd, const char *caller)
Definition: QuEST_validation.c:291
void validateStateVecQureg(Qureg qureg, const char *caller)
Definition: QuEST_validation.c:418
void validateMultiQubitMatrixFitsInNode(Qureg qureg, int numTargets, const char *caller)
Definition: QuEST_validation.c:380
void validateNumAmps(Qureg qureg, long long int startInd, long long int numAmps, const char *caller)
Definition: QuEST_validation.c:301
void validateNumQubitsInQureg(int numQubits, int numRanks, const char *caller)
Definition: QuEST_validation.c:275
void validateMultiQubitUnitaryMatrix(Qureg qureg, ComplexMatrixN u, int numTargs, const char *caller)
Definition: QuEST_validation.c:403
int isCompletelyPositiveMap4(ComplexMatrix4 *ops, int numOps)
Definition: QuEST_validation.c:233
#define macro_isCompletelyPositiveMap(ops, numOps, opDim)
Definition: QuEST_validation.c:212
void validateMultiTargets(Qureg qureg, int *targetQubits, const int numTargetQubits, const char *caller)
Definition: QuEST_validation.c:335
@ E_INVALID_NUM_TWO_QUBIT_KRAUS_OPS
Definition: QuEST_validation.c:72
void validateTwoQubitDepolProb(qreal prob, const char *caller)
Definition: QuEST_validation.c:482
void validateNumPauliSumTerms(int numTerms, const char *caller)
Definition: QuEST_validation.c:507
#define qreal
void validateMatrixInit(ComplexMatrixN matr, const char *caller)
Definition: QuEST_validation.c:393
int isCompletelyPositiveMap2(ComplexMatrix2 *ops, int numOps)
Definition: QuEST_validation.c:230
unsigned int calcLog2(long unsigned int num)
returns log2 of numbers which must be gauranteed to be 2^n
Definition: QuEST_validation.c:254
void validateControl(Qureg qureg, int controlQubit, const char *caller)
Definition: QuEST_validation.c:311
#define macro_isMatrixUnitary(m, dim, retVal)
Definition: QuEST_validation.c:166
void validateMultiControls(Qureg qureg, int *controlQubits, const int numControlQubits, const char *caller)
Definition: QuEST_validation.c:343
long long int getQubitBitMask(int *qubits, const int numQubits)
Definition: QuEST_common.c:43
void invalidQuESTInputError(const char *errMsg, const char *errFunc)
An internal function called when invalid arguments are passed to a QuEST API call,...
Definition: QuEST_validation.c:142
void validateControlTarget(Qureg qureg, int controlQubit, int targetQubit, const char *caller)
Definition: QuEST_validation.c:315
void exitWithError(const char *msg, const char *func)
Definition: QuEST_validation.c:133
long long int numAmpsPerChunk
Number of probability amplitudes held in stateVec by this process In the non-MPI version,...
Definition: QuEST.h:170
void validateOneQubitDephaseProb(qreal prob, const char *caller)
Definition: QuEST_validation.c:462
@ E_MISMATCHING_NUM_TARGS_KRAUS_SIZE
Definition: QuEST_validation.c:75
void validateMatchingQuregDims(Qureg qureg1, Qureg qureg2, const char *caller)
Definition: QuEST_validation.c:434
@ E_INVALID_NUM_ONE_QUBIT_KRAUS_OPS
Definition: QuEST_validation.c:71
void validateOneQubitKrausMap(Qureg qureg, ComplexMatrix2 *ops, int numOps, const char *caller)
Definition: QuEST_validation.c:511
void QuESTAssert(int isValid, ErrorCode code, const char *func)
Definition: QuEST_validation.c:146
void validateOneQubitDepolProb(qreal prob, const char *caller)
Definition: QuEST_validation.c:472
void validateMultiQubits(Qureg qureg, int *qubits, const int numQubits, const char *caller)
Definition: QuEST_validation.c:351
void validateNumControls(Qureg qureg, const int numControlQubits, const char *caller)
Definition: QuEST_validation.c:331
void validateTwoQubitKrausMap(Qureg qureg, ComplexMatrix4 *ops, int numOps, const char *caller)
Definition: QuEST_validation.c:523
void validateNumQubitsInMatrix(int numQubits, const char *caller)
Definition: QuEST_validation.c:287
void validateNumTargets(Qureg qureg, const int numTargetQubits, const char *caller)
Definition: QuEST_validation.c:327
void validateTwoQubitUnitaryMatrix(Qureg qureg, ComplexMatrix4 u, const char *caller)
Definition: QuEST_validation.c:388
void validateMatchingQuregTypes(Qureg qureg1, Qureg qureg2, const char *caller)
Definition: QuEST_validation.c:438
void validateAmpIndex(Qureg qureg, long long int ampInd, const char *caller)
Definition: QuEST_validation.c:296
void validateOneQubitUnitaryMatrix(ComplexMatrix2 u, const char *caller)
Definition: QuEST_validation.c:384
void validateSecondQuregStateVec(Qureg qureg2, const char *caller)
Definition: QuEST_validation.c:442
int numQubitsRepresented
The number of qubits represented in either the state-vector or density matrix.
Definition: QuEST.h:165
long long int numAmpsTotal
Total number of amplitudes, which are possibly distributed among machines.
Definition: QuEST.h:172
void validateControlState(int *controlState, const int numControlQubits, const char *caller)
Definition: QuEST_validation.c:375
int isCompletelyPositiveMapN(ComplexMatrixN *ops, int numOps)
Definition: QuEST_validation.c:236
void validateFileOpened(int found, const char *caller)
Definition: QuEST_validation.c:446
void validateMultiQubitKrausMap(Qureg qureg, int numTargs, ComplexMatrixN *ops, int numOps, const char *caller)
Definition: QuEST_validation.c:535
void validateNumRanks(int numRanks, const char *caller)
Definition: QuEST_validation.c:261
int isComplexPairUnitary(Complex alpha, Complex beta)
Definition: QuEST_validation.c:158
void validatePauliCodes(enum pauliOpType *pauliCodes, int numPauliCodes, const char *caller)
Definition: QuEST_validation.c:498
void validateUnitaryComplexPair(Complex alpha, Complex beta, const char *caller)
Definition: QuEST_validation.c:410
void validateMultiControlsMultiTargets(Qureg qureg, int *controlQubits, const int numControlQubits, int *targetQubits, const int numTargetQubits, const char *caller)
Definition: QuEST_validation.c:366
void validateNormProbs(qreal prob1, qreal prob2, const char *caller)
Definition: QuEST_validation.c:454
void validateOneQubitDampingProb(qreal prob, const char *caller)
Definition: QuEST_validation.c:477
void validateUniqueTargets(Qureg qureg, int qubit1, int qubit2, const char *caller)
Definition: QuEST_validation.c:321
void validateTwoQubitDephaseProb(qreal prob, const char *caller)
Definition: QuEST_validation.c:467
void validateOneQubitPauliProbs(qreal probX, qreal probY, qreal probZ, const char *caller)
Definition: QuEST_validation.c:487
void validateMultiControlsTarget(Qureg qureg, int *controlQubits, const int numControlQubits, const int targetQubit, const char *caller)
Definition: QuEST_validation.c:359