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
101 [E_INVALID_NUM_RANKS] = "Invalid number of nodes. Distributed simulation can only make use of a power-of-2 number of node.",
111 [E_INVALID_OFFSET_NUM_AMPS_QUREG] = "More amplitudes given than exist in the statevector from the given starting index.",
112 [E_INVALID_OFFSET_NUM_ELEMS_DIAG] = "More elements given than exist in the diagonal operator from the given starting index.",
123 [E_NON_UNITARY_COMPLEX_PAIR] = "Compact matrix formed by given complex numbers is not unitary.",
125 [E_SYS_TOO_BIG_TO_PRINT] = "Invalid system size. Cannot print output for systems greater than 5 qubits.",
131 [E_MISMATCHING_QUREG_TYPES] = "Registers must both be state-vectors or both be density matrices.",
136 [E_INVALID_ONE_QUBIT_DEPHASE_PROB] = "The probability of a single qubit dephase error cannot exceed 1/2, which maximally mixes.",
137 [E_INVALID_TWO_QUBIT_DEPHASE_PROB] = "The probability of a two-qubit qubit dephase error cannot exceed 3/4, which maximally mixes.",
138 [E_INVALID_ONE_QUBIT_DEPOL_PROB] = "The probability of a single qubit depolarising error cannot exceed 3/4, which maximally mixes.",
139 [E_INVALID_TWO_QUBIT_DEPOL_PROB] = "The probability of a two-qubit depolarising error cannot exceed 15/16, which maximally mixes.",
140 [E_INVALID_ONE_QUBIT_PAULI_PROBS] = "The probability of any X, Y or Z error cannot exceed the probability of no error.",
141 [E_INVALID_CONTROLS_BIT_STATE] = "The state of the control qubits must be a bit sequence (0s and 1s).",
142 [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 operators respectively.",
143 [E_INVALID_NUM_SUM_TERMS] = "Invalid number of terms in the Pauli sum. The number of terms must be >0.",
144 [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.",
146 [E_COMPLEX_MATRIX_NOT_INIT] = "The ComplexMatrixN was not successfully created (possibly insufficient memory available).",
147 [E_INVALID_NUM_ONE_QUBIT_KRAUS_OPS] = "At least 1 and at most 4 single qubit Kraus operators may be specified.",
148 [E_INVALID_NUM_TWO_QUBIT_KRAUS_OPS] = "At least 1 and at most 16 two-qubit Kraus operators may be specified.",
149 [E_INVALID_NUM_N_QUBIT_KRAUS_OPS] = "At least 1 and at most 4*N^2 of N-qubit Kraus operators may be specified.",
150 [E_INVALID_KRAUS_OPS] = "The specified Kraus map is not a completely positive, trace preserving map.",
151 [E_MISMATCHING_NUM_TARGS_KRAUS_SIZE] = "Every Kraus operator must be of the same number of qubits as the number of targets.",
152 [E_DISTRIB_QUREG_TOO_SMALL] = "Too few qubits. The created qureg must have at least one amplitude per node used in distributed simulation.",
153 [E_DISTRIB_DIAG_OP_TOO_SMALL] = "Too few qubits. The created DiagonalOp must contain at least one element per node used in distributed simulation.",
154 [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.",
155 [E_INVALID_PAULI_HAMIL_PARAMS] = "The number of qubits and terms in the PauliHamil must be strictly positive.",
156 [E_INVALID_PAULI_HAMIL_FILE_PARAMS] = "The number of qubits and terms in the PauliHamil file (%s) must be strictly positive.",
157 [E_CANNOT_PARSE_PAULI_HAMIL_FILE_COEFF] = "Failed to parse the next expected term coefficient in PauliHamil file (%s).",
158 [E_CANNOT_PARSE_PAULI_HAMIL_FILE_PAULI] = "Failed to parse the next expected Pauli code in PauliHamil file (%s).",
159 [E_INVALID_PAULI_HAMIL_FILE_PAULI_CODE] = "The PauliHamil file (%s) contained an invalid pauli code (%d). 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 operators respectively.",
160 [E_MISMATCHING_PAULI_HAMIL_QUREG_NUM_QUBITS] = "The PauliHamil must act on the same number of qubits as exist in the Qureg.",
161 [E_INVALID_TROTTER_ORDER] = "The Trotterisation order must be 1, or an even number (for higher-order Suzuki symmetrized expansions).",
163 [E_MISMATCHING_QUREG_DIAGONAL_OP_SIZE] = "The qureg must represent an equal number of qubits as that in the applied diagonal operator.",
164 [E_DIAGONAL_OP_NOT_INITIALISED] = "The diagonal operator has not been initialised through createDiagonalOperator()."
351 void validateNumAmps(Qureg qureg, long long int startInd, long long int numAmps, const char* caller) {
357 void validateNumElems(DiagonalOp op, long long int startInd, long long int numElems, const char* caller) {
365 QuESTAssert(targetQubit>=0 && targetQubit<qureg.numQubitsRepresented, E_INVALID_TARGET_QUBIT, caller);
369 QuESTAssert(controlQubit>=0 && controlQubit<qureg.numQubitsRepresented, E_INVALID_CONTROL_QUBIT, caller);
372 void validateControlTarget(Qureg qureg, int controlQubit, int targetQubit, const char* caller) {
385 QuESTAssert(numTargetQubits>0 && numTargetQubits<=qureg.numQubitsRepresented, E_INVALID_NUM_TARGETS, caller);
389 QuESTAssert(numControlQubits>0 && numControlQubits<qureg.numQubitsRepresented, E_INVALID_NUM_CONTROLS, caller);
392 void validateMultiTargets(Qureg qureg, int* targetQubits, int numTargetQubits, const char* caller) {
400 void validateMultiControls(Qureg qureg, int* controlQubits, int numControlQubits, const char* caller) {
409 QuESTAssert(numQubits>0 && numQubits<=qureg.numQubitsRepresented, E_INVALID_NUM_QUBITS, caller);
411 QuESTAssert(qubits[i]>=0 && qubits[i]<qureg.numQubitsRepresented, E_INVALID_QUBIT_INDEX, caller);
416 void validateMultiControlsTarget(Qureg qureg, int* controlQubits, int numControlQubits, int targetQubit, const char* caller) {
423 void validateMultiControlsMultiTargets(Qureg qureg, int* controlQubits, int numControlQubits, int* targetQubits, int numTargetQubits, const char* caller) {
434 QuESTAssert(controlState[i] == 0 || controlState[i] == 1, E_INVALID_CONTROLS_BIT_STATE, caller);
438 QuESTAssert(qureg.numAmpsPerChunk >= (1LL << numTargets), E_CANNOT_FIT_MULTI_QUBIT_MATRIX, caller);
460 void validateMultiQubitMatrix(Qureg qureg, ComplexMatrixN u, int numTargs, const char* caller) {
466 void validateMultiQubitUnitaryMatrix(Qureg qureg, ComplexMatrixN u, int numTargs, const char* caller) {
496 QuESTAssert(qureg1.numQubitsRepresented==qureg2.numQubitsRepresented, E_MISMATCHING_QUREG_DIMENSIONS, caller);
574 void validateOneQubitKrausMap(Qureg qureg, ComplexMatrix2* ops, int numOps, const char* caller) {
586 void validateTwoQubitKrausMap(Qureg qureg, ComplexMatrix4* ops, int numOps, const char* caller) {
598 void validateMultiQubitKrausMap(Qureg qureg, int numTargs, ComplexMatrixN* ops, int numOps, const char* caller) {
625 QuESTAssert(hamil.numQubits == qureg.numQubitsRepresented, E_MISMATCHING_PAULI_HAMIL_QUREG_NUM_QUBITS, caller);
628 void validateHamilFileParams(int numQubits, int numTerms, FILE* file, char* fn, const char* caller) {
637 void validateHamilFileCoeffParsed(int parsed, PauliHamil h, FILE* file, char* fn, const char* caller) {
647 void validateHamilFilePauliParsed(int parsed, PauliHamil h, FILE* file, char* fn, const char* caller) {
657 void validateHamilFilePauliCode(enum pauliOpType code, PauliHamil h, FILE* file, char* fn, const char* caller) {
679 QuESTAssert(qureg.numQubitsRepresented == op.numQubits, E_MISMATCHING_QUREG_DIAGONAL_OP_SIZE, caller);
void validateDensityMatrQureg(Qureg qureg, const char *caller)
Definition: QuEST_validation.c:483
void validateMultiControlsTarget(Qureg qureg, int *controlQubits, int numControlQubits, int targetQubit, const char *caller)
Definition: QuEST_validation.c:416
void validateMeasurementProb(qreal prob, const char *caller)
Definition: QuEST_validation.c:491
void validateTarget(Qureg qureg, int targetQubit, const char *caller)
Definition: QuEST_validation.c:364
void validateOutcome(int outcome, const char *caller)
Definition: QuEST_validation.c:487
@ E_CANNOT_PARSE_PAULI_HAMIL_FILE_COEFF
Definition: QuEST_validation.c:90
void validateHamilFileCoeffParsed(int parsed, PauliHamil h, FILE *file, char *fn, const char *caller)
Definition: QuEST_validation.c:637
void validateStateIndex(Qureg qureg, long long int stateInd, const char *caller)
Definition: QuEST_validation.c:341
void validateHamilParams(int numQubits, int numTerms, const char *caller)
Definition: QuEST_validation.c:615
void validateStateVecQureg(Qureg qureg, const char *caller)
Definition: QuEST_validation.c:479
void validateMultiQubitMatrixFitsInNode(Qureg qureg, int numTargets, const char *caller)
Definition: QuEST_validation.c:437
void validateNumAmps(Qureg qureg, long long int startInd, long long int numAmps, const char *caller)
Definition: QuEST_validation.c:351
void validateNumQubitsInQureg(int numQubits, int numRanks, const char *caller)
Definition: QuEST_validation.c:313
void validateMultiQubitUnitaryMatrix(Qureg qureg, ComplexMatrixN u, int numTargs, const char *caller)
Definition: QuEST_validation.c:466
void validateHamilFilePauliParsed(int parsed, PauliHamil h, FILE *file, char *fn, const char *caller)
Definition: QuEST_validation.c:647
void validateNumControls(Qureg qureg, int numControlQubits, const char *caller)
Definition: QuEST_validation.c:388
int isCompletelyPositiveMap4(ComplexMatrix4 *ops, int numOps)
Definition: QuEST_validation.c:267
@ E_CANNOT_PARSE_PAULI_HAMIL_FILE_PAULI
Definition: QuEST_validation.c:91
#define macro_isCompletelyPositiveMap(ops, numOps, opDim)
Definition: QuEST_validation.c:246
void validateHamilFilePauliCode(enum pauliOpType code, PauliHamil h, FILE *file, char *fn, const char *caller)
Definition: QuEST_validation.c:657
@ E_INVALID_NUM_TWO_QUBIT_KRAUS_OPS
Definition: QuEST_validation.c:81
void validateTwoQubitDepolProb(qreal prob, const char *caller)
Definition: QuEST_validation.c:547
void validateNumPauliSumTerms(int numTerms, const char *caller)
Definition: QuEST_validation.c:570
#define qreal
void validateMatrixInit(ComplexMatrixN matr, const char *caller)
Definition: QuEST_validation.c:450
void validateFileOpened(int opened, char *fn, const char *caller)
Definition: QuEST_validation.c:507
int isCompletelyPositiveMap2(ComplexMatrix2 *ops, int numOps)
Definition: QuEST_validation.c:264
@ E_INVALID_PAULI_HAMIL_FILE_PAULI_CODE
Definition: QuEST_validation.c:92
unsigned int calcLog2(long unsigned int num)
returns log2 of numbers which must be gauranteed to be 2^n
Definition: QuEST_validation.c:292
void validateControl(Qureg qureg, int controlQubit, const char *caller)
Definition: QuEST_validation.c:368
#define macro_isMatrixUnitary(m, dim, retVal)
Definition: QuEST_validation.c:200
void validateNumTargets(Qureg qureg, int numTargetQubits, const char *caller)
Definition: QuEST_validation.c:384
void validateMultiQubits(Qureg qureg, int *qubits, int numQubits, const char *caller)
Definition: QuEST_validation.c:408
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:176
void validateControlTarget(Qureg qureg, int controlQubit, int targetQubit, const char *caller)
Definition: QuEST_validation.c:372
void exitWithError(const char *msg, const char *func)
Definition: QuEST_validation.c:167
void validateDiagonalOp(Qureg qureg, DiagonalOp op, const char *caller)
Definition: QuEST_validation.c:677
long long int numAmpsPerChunk
Number of probability amplitudes held in stateVec by this process In the non-MPI version,...
Definition: QuEST.h:213
void validateOneQubitDephaseProb(qreal prob, const char *caller)
Definition: QuEST_validation.c:527
enum pauliOpType * pauliCodes
The Pauli operators acting on each qubit, flattened over every operator.
Definition: QuEST.h:162
@ E_MISMATCHING_NUM_TARGS_KRAUS_SIZE
Definition: QuEST_validation.c:84
void validateControlState(int *controlState, int numControlQubits, const char *caller)
Definition: QuEST_validation.c:432
void validateMultiTargets(Qureg qureg, int *targetQubits, int numTargetQubits, const char *caller)
Definition: QuEST_validation.c:392
void validateMatchingQuregDims(Qureg qureg1, Qureg qureg2, const char *caller)
Definition: QuEST_validation.c:495
int numQubits
The number of qubits this operator can act on (informing its size)
Definition: QuEST.h:181
@ E_INVALID_NUM_ONE_QUBIT_KRAUS_OPS
Definition: QuEST_validation.c:80
int numSumTerms
The number of terms in the weighted sum, or the number of Pauli products.
Definition: QuEST.h:166
long long int getQubitBitMask(int *qubits, int numQubits)
Definition: QuEST_common.c:44
@ E_MISMATCHING_QUREG_DIAGONAL_OP_SIZE
Definition: QuEST_validation.c:96
Represents a diagonal complex operator on the full Hilbert state of a Qureg.
Definition: QuEST.h:178
void validateNumElems(DiagonalOp op, long long int startInd, long long int numElems, const char *caller)
Definition: QuEST_validation.c:357
void validateOneQubitKrausMap(Qureg qureg, ComplexMatrix2 *ops, int numOps, const char *caller)
Definition: QuEST_validation.c:574
@ E_MISMATCHING_PAULI_HAMIL_QUREG_NUM_QUBITS
Definition: QuEST_validation.c:93
void QuESTAssert(int isValid, ErrorCode code, const char *func)
Definition: QuEST_validation.c:180
void validateOneQubitDepolProb(qreal prob, const char *caller)
Definition: QuEST_validation.c:537
void validateTwoQubitKrausMap(Qureg qureg, ComplexMatrix4 *ops, int numOps, const char *caller)
Definition: QuEST_validation.c:586
void validateNumQubitsInMatrix(int numQubits, const char *caller)
Definition: QuEST_validation.c:325
void validatePauliHamil(PauliHamil hamil, const char *caller)
Definition: QuEST_validation.c:619
void validateTwoQubitUnitaryMatrix(Qureg qureg, ComplexMatrix4 u, const char *caller)
Definition: QuEST_validation.c:445
void validateDiagOpInit(DiagonalOp op, const char *caller)
Definition: QuEST_validation.c:673
void validateMatchingQuregPauliHamilDims(Qureg qureg, PauliHamil hamil, const char *caller)
Definition: QuEST_validation.c:624
void validateMatchingQuregTypes(Qureg qureg1, Qureg qureg2, const char *caller)
Definition: QuEST_validation.c:499
void validateAmpIndex(Qureg qureg, long long int ampInd, const char *caller)
Definition: QuEST_validation.c:346
void validateHamilFileParams(int numQubits, int numTerms, FILE *file, char *fn, const char *caller)
Definition: QuEST_validation.c:628
void validateOneQubitUnitaryMatrix(ComplexMatrix2 u, const char *caller)
Definition: QuEST_validation.c:441
@ E_INVALID_PAULI_HAMIL_FILE_PARAMS
Definition: QuEST_validation.c:89
void validateSecondQuregStateVec(Qureg qureg2, const char *caller)
Definition: QuEST_validation.c:503
int numQubitsRepresented
The number of qubits represented in either the state-vector or density matrix.
Definition: QuEST.h:208
long long int numAmpsTotal
Total number of amplitudes, which are possibly distributed among machines.
Definition: QuEST.h:215
void validateMultiControlsMultiTargets(Qureg qureg, int *controlQubits, int numControlQubits, int *targetQubits, int numTargetQubits, const char *caller)
Definition: QuEST_validation.c:423
void destroyPauliHamil(PauliHamil h)
Destroy a PauliHamil instance, created with either createPauliHamil() or createPauliHamilFromFile().
Definition: QuEST.c:1163
int isCompletelyPositiveMapN(ComplexMatrixN *ops, int numOps)
Definition: QuEST_validation.c:270
void validateMultiControls(Qureg qureg, int *controlQubits, int numControlQubits, const char *caller)
Definition: QuEST_validation.c:400
void validateMultiQubitKrausMap(Qureg qureg, int numTargs, ComplexMatrixN *ops, int numOps, const char *caller)
Definition: QuEST_validation.c:598
void validateMultiQubitMatrix(Qureg qureg, ComplexMatrixN u, int numTargs, const char *caller)
Definition: QuEST_validation.c:460
void validateNumQubitsInDiagOp(int numQubits, int numRanks, const char *caller)
Definition: QuEST_validation.c:329
void validateNumRanks(int numRanks, const char *caller)
Definition: QuEST_validation.c:299
void validateTrotterParams(int order, int reps, const char *caller)
Definition: QuEST_validation.c:667
int isComplexPairUnitary(Complex alpha, Complex beta)
Definition: QuEST_validation.c:192
void validatePauliCodes(enum pauliOpType *pauliCodes, int numPauliCodes, const char *caller)
Definition: QuEST_validation.c:563
void validateUnitaryComplexPair(Complex alpha, Complex beta, const char *caller)
Definition: QuEST_validation.c:471
void validateNormProbs(qreal prob1, qreal prob2, const char *caller)
Definition: QuEST_validation.c:519
void validateOneQubitDampingProb(qreal prob, const char *caller)
Definition: QuEST_validation.c:542
void validateUniqueTargets(Qureg qureg, int qubit1, int qubit2, const char *caller)
Definition: QuEST_validation.c:378
void validateTwoQubitDephaseProb(qreal prob, const char *caller)
Definition: QuEST_validation.c:532
void validateOneQubitPauliProbs(qreal probX, qreal probY, qreal probZ, const char *caller)
Definition: QuEST_validation.c:552