QuEST_validation.h File Reference
#include "QuEST.h"

Go to the source code of this file.

Functions

void validateAmpIndex (Qureg qureg, long long int ampInd, const char *caller)
 
void validateControlState (int *controlState, const int numControlQubits, const char *caller)
 
void validateControlTarget (Qureg qureg, int controlQubit, int targetQubit, const char *caller)
 
void validateDensityMatrQureg (Qureg qureg, const char *caller)
 
void validateFileOpened (int opened, const char *caller)
 
void validateMatchingQuregDims (Qureg qureg1, Qureg qureg2, const char *caller)
 
void validateMatchingQuregTypes (Qureg qureg1, Qureg qureg2, const char *caller)
 
void validateMatrixInit (ComplexMatrixN matr, const char *caller)
 
void validateMeasurementProb (qreal prob, const char *caller)
 
void validateMultiControls (Qureg qureg, int *controlQubits, const int numControlQubits, const char *caller)
 
void validateMultiControlsMultiTargets (Qureg qureg, int *controlQubits, const int numControlQubits, int *targetQubits, const int numTargetQubits, const char *caller)
 
void validateMultiControlsTarget (Qureg qureg, int *controlQubits, const int numControlQubits, const int targetQubit, const char *caller)
 
void validateMultiQubitKrausMap (Qureg qureg, int numTargs, ComplexMatrixN *ops, int numOps, const char *caller)
 
void validateMultiQubitMatrixFitsInNode (Qureg qureg, int numTargets, const char *caller)
 
void validateMultiQubits (Qureg qureg, int *qubits, const int numQubits, const char *caller)
 
void validateMultiQubitUnitaryMatrix (Qureg qureg, ComplexMatrixN u, int numTargs, const char *caller)
 
void validateMultiTargets (Qureg qurge, int *targetQubits, const int numTargetQubits, const char *caller)
 
void validateNormProbs (qreal prob1, qreal prob2, const char *caller)
 
void validateNumAmps (Qureg qureg, long long int startInd, long long int numAmps, const char *caller)
 
void validateNumPauliSumTerms (int numTerms, const char *caller)
 
void validateNumQubitsInMatrix (int numQubits, const char *caller)
 
void validateNumQubitsInQureg (int numQubits, int numRanks, const char *caller)
 
void validateNumRanks (int numRanks, const char *caller)
 
void validateOneQubitDampingProb (qreal prob, const char *caller)
 
void validateOneQubitDephaseProb (qreal prob, const char *caller)
 
void validateOneQubitDepolProb (qreal prob, const char *caller)
 
void validateOneQubitKrausMap (Qureg qureg, ComplexMatrix2 *ops, int numOps, const char *caller)
 
void validateOneQubitPauliProbs (qreal probX, qreal probY, qreal probZ, const char *caller)
 
void validateOneQubitUnitaryMatrix (ComplexMatrix2 u, const char *caller)
 
void validateOutcome (int outcome, const char *caller)
 
void validatePauliCodes (enum pauliOpType *pauliCodes, int numPauliCodes, const char *caller)
 
void validateProb (qreal prob, const char *caller)
 
void validateSecondQuregStateVec (Qureg qureg2, const char *caller)
 
void validateStateIndex (Qureg qureg, long long int stateInd, const char *caller)
 
void validateStateVecQureg (Qureg qureg, const char *caller)
 
void validateTarget (Qureg qureg, int targetQubit, const char *caller)
 
void validateTwoQubitDephaseProb (qreal prob, const char *caller)
 
void validateTwoQubitDepolProb (qreal prob, const char *caller)
 
void validateTwoQubitKrausMap (Qureg qureg, ComplexMatrix4 *ops, int numOps, const char *caller)
 
void validateTwoQubitUnitaryMatrix (Qureg qureg, ComplexMatrix4 u, const char *caller)
 
void validateUniqueTargets (Qureg qureg, int qubit1, int qubit2, const char *caller)
 
void validateUnitaryComplexPair (Complex alpha, Complex beta, const char *caller)
 
void validateVector (Vector vector, const char *caller)
 

Detailed Description

Provides validation defined in QuEST_validation.c which is used exclusively by QuEST.c

Author
Tyson Jones
Ania Brown (original testing of qubit indices, unitarity, valid collapse probability)
Balint Koczor (Kraus maps)

Definition in file QuEST_validation.h.

Function Documentation

◆ validateAmpIndex()

void validateAmpIndex ( Qureg  qureg,
long long int  ampInd,
const char *  caller 
)

Definition at line 296 of file QuEST_validation.c.

296  {
297  long long int indMax = 1LL << qureg.numQubitsRepresented;
298  QuESTAssert(ampInd>=0 && ampInd<indMax, E_INVALID_AMP_INDEX, caller);
299 }

References E_INVALID_AMP_INDEX, Qureg::numQubitsRepresented, and QuESTAssert().

Referenced by getAmp(), getDensityAmp(), getImagAmp(), getProbAmp(), getRealAmp(), and validateNumAmps().

◆ validateControlState()

void validateControlState ( int *  controlState,
const int  numControlQubits,
const char *  caller 
)

Definition at line 375 of file QuEST_validation.c.

375  {
376  for (int i=0; i < numControlQubits; i++)
377  QuESTAssert(controlState[i] == 0 || controlState[i] == 1, E_INVALID_CONTROLS_BIT_STATE, caller);
378 }

References E_INVALID_CONTROLS_BIT_STATE, and QuESTAssert().

Referenced by multiStateControlledUnitary().

◆ validateControlTarget()

void validateControlTarget ( Qureg  qureg,
int  controlQubit,
int  targetQubit,
const char *  caller 
)

◆ validateDensityMatrQureg()

◆ validateFileOpened()

void validateFileOpened ( int  opened,
const char *  caller 
)

Definition at line 446 of file QuEST_validation.c.

446  {
447  QuESTAssert(found, E_CANNOT_OPEN_FILE, caller);
448 }

References E_CANNOT_OPEN_FILE, and QuESTAssert().

Referenced by initStateFromSingleFile(), and writeRecordedQASMToFile().

◆ validateMatchingQuregDims()

◆ validateMatchingQuregTypes()

void validateMatchingQuregTypes ( Qureg  qureg1,
Qureg  qureg2,
const char *  caller 
)

◆ validateMatrixInit()

void validateMatrixInit ( ComplexMatrixN  matr,
const char *  caller 
)

Definition at line 393 of file QuEST_validation.c.

393  {
394 
395  /* note that for (most) compilers which don't automatically initialise
396  * pointers to NULL, this can only be used to check the mallocs in createComplexMatrixN
397  * succeeded. It can not be used to differentiate whether a user actually attempted
398  * to initialise or create their ComplexMatrixN instance.
399  */
400  QuESTAssert(matr.real != NULL && matr.imag != NULL, E_COMPLEX_MATRIX_NOT_INIT, caller);
401 }

References E_COMPLEX_MATRIX_NOT_INIT, ComplexMatrixN::imag, QuESTAssert(), and ComplexMatrixN::real.

Referenced by createComplexMatrixN(), destroyComplexMatrixN(), initComplexMatrixN(), validateMultiQubitKrausMap(), and validateMultiQubitUnitaryMatrix().

◆ validateMeasurementProb()

void validateMeasurementProb ( qreal  prob,
const char *  caller 
)

Definition at line 430 of file QuEST_validation.c.

430  {
431  QuESTAssert(prob>REAL_EPS, E_COLLAPSE_STATE_ZERO_PROB, caller);
432 }

References E_COLLAPSE_STATE_ZERO_PROB, and QuESTAssert().

Referenced by collapseToOutcome().

◆ validateMultiControls()

void validateMultiControls ( Qureg  qureg,
int *  controlQubits,
const int  numControlQubits,
const char *  caller 
)

Definition at line 343 of file QuEST_validation.c.

343  {
344  validateNumControls(qureg, numControlQubits, caller);
345  for (int i=0; i < numControlQubits; i++)
346  validateControl(qureg, controlQubits[i], caller);
347 
348  QuESTAssert(areUniqueQubits(controlQubits, numControlQubits), E_CONTROLS_NOT_UNIQUE, caller);
349 }

References areUniqueQubits(), E_CONTROLS_NOT_UNIQUE, QuESTAssert(), validateControl(), and validateNumControls().

Referenced by validateMultiControlsMultiTargets(), and validateMultiControlsTarget().

◆ validateMultiControlsMultiTargets()

void validateMultiControlsMultiTargets ( Qureg  qureg,
int *  controlQubits,
const int  numControlQubits,
int *  targetQubits,
const int  numTargetQubits,
const char *  caller 
)

Definition at line 366 of file QuEST_validation.c.

366  {
367  validateMultiControls(qureg, controlQubits, numControlQubits, caller);
368  validateMultiTargets(qureg, targetQubits, numTargetQubits, caller);
369  long long int ctrlMask = getQubitBitMask(controlQubits, numControlQubits);
370  long long int targMask = getQubitBitMask(targetQubits, numTargetQubits);
371  int overlap = ctrlMask & targMask;
372  QuESTAssert(!overlap, E_CONTROL_TARGET_COLLISION, caller);
373 }

References E_CONTROL_TARGET_COLLISION, getQubitBitMask(), QuESTAssert(), validateMultiControls(), and validateMultiTargets().

Referenced by controlledMultiQubitUnitary(), controlledTwoQubitUnitary(), multiControlledMultiQubitUnitary(), and multiControlledTwoQubitUnitary().

◆ validateMultiControlsTarget()

void validateMultiControlsTarget ( Qureg  qureg,
int *  controlQubits,
const int  numControlQubits,
const int  targetQubit,
const char *  caller 
)

Definition at line 359 of file QuEST_validation.c.

359  {
360  validateTarget(qureg, targetQubit, caller);
361  validateMultiControls(qureg, controlQubits, numControlQubits, caller);
362  for (int i=0; i < numControlQubits; i++)
363  QuESTAssert(controlQubits[i] != targetQubit, E_TARGET_IN_CONTROLS, caller);
364 }

References E_TARGET_IN_CONTROLS, QuESTAssert(), validateMultiControls(), and validateTarget().

Referenced by multiControlledUnitary(), and multiStateControlledUnitary().

◆ validateMultiQubitKrausMap()

void validateMultiQubitKrausMap ( Qureg  qureg,
int  numTargs,
ComplexMatrixN ops,
int  numOps,
const char *  caller 
)

Definition at line 535 of file QuEST_validation.c.

535  {
536  int opNumQubits = numTargs;
537  int superOpNumQubits = 2*opNumQubits;
538  int maxNumOps = superOpNumQubits*superOpNumQubits;
539  QuESTAssert(numOps>0 && numOps <= maxNumOps, E_INVALID_NUM_N_QUBIT_KRAUS_OPS, caller);
540 
541  for (int n=0; n<numOps; n++) {
542  validateMatrixInit(ops[n], __func__);
543  QuESTAssert(ops[n].numQubits == numTargs, E_MISMATCHING_NUM_TARGS_KRAUS_SIZE, caller);
544  }
545 
546  validateMultiQubitMatrixFitsInNode(qureg, superOpNumQubits, caller);
547 
548  int isPos = isCompletelyPositiveMapN(ops, numOps);
549  QuESTAssert(isPos, E_INVALID_KRAUS_OPS, caller);
550 }

References E_INVALID_KRAUS_OPS, E_INVALID_NUM_N_QUBIT_KRAUS_OPS, E_MISMATCHING_NUM_TARGS_KRAUS_SIZE, isCompletelyPositiveMapN(), QuESTAssert(), validateMatrixInit(), and validateMultiQubitMatrixFitsInNode().

Referenced by mixMultiQubitKrausMap().

◆ validateMultiQubitMatrixFitsInNode()

void validateMultiQubitMatrixFitsInNode ( Qureg  qureg,
int  numTargets,
const char *  caller 
)

◆ validateMultiQubits()

void validateMultiQubits ( Qureg  qureg,
int *  qubits,
const int  numQubits,
const char *  caller 
)

Definition at line 351 of file QuEST_validation.c.

351  {
352  QuESTAssert(numQubits>0 && numQubits<=qureg.numQubitsRepresented, E_INVALID_NUM_QUBITS, caller);
353  for (int i=0; i < numQubits; i++)
354  QuESTAssert(qubits[i]>=0 && qubits[i]<qureg.numQubitsRepresented, E_INVALID_QUBIT_INDEX, caller);
355 
356  QuESTAssert(areUniqueQubits(qubits, numQubits), E_QUBITS_NOT_UNIQUE, caller);
357 }

References areUniqueQubits(), E_INVALID_NUM_QUBITS, E_INVALID_QUBIT_INDEX, E_QUBITS_NOT_UNIQUE, Qureg::numQubitsRepresented, and QuESTAssert().

Referenced by multiControlledPhaseFlip(), and multiControlledPhaseShift().

◆ validateMultiQubitUnitaryMatrix()

void validateMultiQubitUnitaryMatrix ( Qureg  qureg,
ComplexMatrixN  u,
int  numTargs,
const char *  caller 
)

◆ validateMultiTargets()

void validateMultiTargets ( Qureg  qurge,
int *  targetQubits,
const int  numTargetQubits,
const char *  caller 
)

Definition at line 335 of file QuEST_validation.c.

335  {
336  validateNumTargets(qureg, numTargetQubits, caller);
337  for (int i=0; i < numTargetQubits; i++)
338  validateTarget(qureg, targetQubits[i], caller);
339 
340  QuESTAssert(areUniqueQubits(targetQubits, numTargetQubits), E_TARGETS_NOT_UNIQUE, caller);
341 }

References areUniqueQubits(), E_TARGETS_NOT_UNIQUE, QuESTAssert(), validateNumTargets(), and validateTarget().

Referenced by calcExpecPauliProd(), mixMultiQubitKrausMap(), mixTwoQubitKrausMap(), multiQubitUnitary(), multiRotatePauli(), multiRotateZ(), twoQubitUnitary(), and validateMultiControlsMultiTargets().

◆ validateNormProbs()

void validateNormProbs ( qreal  prob1,
qreal  prob2,
const char *  caller 
)

Definition at line 454 of file QuEST_validation.c.

454  {
455  validateProb(prob1, caller);
456  validateProb(prob2, caller);
457 
458  qreal sum = prob1 + prob2;
459  QuESTAssert(absReal(1 - sum) < REAL_EPS, E_UNNORM_PROBS, caller);
460 }

References E_UNNORM_PROBS, qreal, QuESTAssert(), and validateProb().

◆ validateNumAmps()

void validateNumAmps ( Qureg  qureg,
long long int  startInd,
long long int  numAmps,
const char *  caller 
)

Definition at line 301 of file QuEST_validation.c.

301  {
302  validateAmpIndex(qureg, startInd, caller);
303  QuESTAssert(numAmps >= 0 && numAmps <= qureg.numAmpsTotal, E_INVALID_NUM_AMPS, caller);
304  QuESTAssert(numAmps + startInd <= qureg.numAmpsTotal, E_INVALID_OFFSET_NUM_AMPS, caller);
305 }

References E_INVALID_NUM_AMPS, E_INVALID_OFFSET_NUM_AMPS, Qureg::numAmpsTotal, QuESTAssert(), and validateAmpIndex().

Referenced by setAmps().

◆ validateNumPauliSumTerms()

void validateNumPauliSumTerms ( int  numTerms,
const char *  caller 
)

Definition at line 507 of file QuEST_validation.c.

507  {
508  QuESTAssert(numTerms > 0, E_INVALID_NUM_SUM_TERMS, caller);
509 }

References E_INVALID_NUM_SUM_TERMS, and QuESTAssert().

Referenced by applyPauliSum(), and calcExpecPauliSum().

◆ validateNumQubitsInMatrix()

void validateNumQubitsInMatrix ( int  numQubits,
const char *  caller 
)

Definition at line 287 of file QuEST_validation.c.

287  {
288  QuESTAssert(numQubits>0, E_INVALID_NUM_QUBITS, caller);
289 }

References E_INVALID_NUM_QUBITS, and QuESTAssert().

Referenced by createComplexMatrixN().

◆ validateNumQubitsInQureg()

void validateNumQubitsInQureg ( int  numQubits,
int  numRanks,
const char *  caller 
)

Definition at line 275 of file QuEST_validation.c.

275  {
276  QuESTAssert(numQubits>0, E_INVALID_NUM_CREATE_QUBITS, caller);
277 
278  // mustn't be more amplitudes than can fit in the type
279  unsigned int maxQubits = calcLog2(SIZE_MAX);
280  QuESTAssert( numQubits <= maxQubits, E_NUM_AMPS_EXCEED_TYPE, caller);
281 
282  // must be at least one amplitude per node
283  long unsigned int numAmps = (1<<numQubits);
284  QuESTAssert(numAmps >= numRanks, E_DISTRIB_QUREG_TOO_SMALL, caller);
285 }

References calcLog2(), E_DISTRIB_QUREG_TOO_SMALL, E_INVALID_NUM_CREATE_QUBITS, E_NUM_AMPS_EXCEED_TYPE, and QuESTAssert().

Referenced by createDensityQureg(), and createQureg().

◆ validateNumRanks()

void validateNumRanks ( int  numRanks,
const char *  caller 
)

Definition at line 261 of file QuEST_validation.c.

261  {
262 
263  /* silly but robust way to determine if numRanks is a power of 2,
264  * in lieu of bit-twiddling (e.g. AND with all-ones) which may be
265  * system / precsision dependent
266  */
267  int isValid = 0;
268  for (int exp2 = 1; exp2 <= numRanks; exp2 *= 2)
269  if (exp2 == numRanks)
270  isValid = 1;
271 
272  QuESTAssert(isValid, E_INVALID_NUM_RANKS, caller);
273 }

References E_INVALID_NUM_RANKS, and QuESTAssert().

Referenced by createQuESTEnv().

◆ validateOneQubitDampingProb()

void validateOneQubitDampingProb ( qreal  prob,
const char *  caller 
)

Definition at line 477 of file QuEST_validation.c.

477  {
478  validateProb(prob, caller);
479  QuESTAssert(prob <= 1.0, E_INVALID_ONE_QUBIT_DEPOL_PROB, caller);
480 }

References E_INVALID_ONE_QUBIT_DEPOL_PROB, QuESTAssert(), and validateProb().

Referenced by mixDamping().

◆ validateOneQubitDephaseProb()

void validateOneQubitDephaseProb ( qreal  prob,
const char *  caller 
)

Definition at line 462 of file QuEST_validation.c.

462  {
463  validateProb(prob, caller);
464  QuESTAssert(prob <= 1/2.0, E_INVALID_ONE_QUBIT_DEPHASE_PROB, caller);
465 }

References E_INVALID_ONE_QUBIT_DEPHASE_PROB, QuESTAssert(), and validateProb().

Referenced by mixDephasing().

◆ validateOneQubitDepolProb()

void validateOneQubitDepolProb ( qreal  prob,
const char *  caller 
)

Definition at line 472 of file QuEST_validation.c.

472  {
473  validateProb(prob, caller);
474  QuESTAssert(prob <= 3/4.0, E_INVALID_ONE_QUBIT_DEPOL_PROB, caller);
475 }

References E_INVALID_ONE_QUBIT_DEPOL_PROB, QuESTAssert(), and validateProb().

Referenced by mixDepolarising().

◆ validateOneQubitKrausMap()

void validateOneQubitKrausMap ( Qureg  qureg,
ComplexMatrix2 ops,
int  numOps,
const char *  caller 
)

Definition at line 511 of file QuEST_validation.c.

511  {
512  int opNumQubits = 1;
513  int superOpNumQubits = 2*opNumQubits;
514  int maxNumOps = superOpNumQubits*superOpNumQubits;
515  QuESTAssert(numOps > 0 && numOps <= maxNumOps, E_INVALID_NUM_ONE_QUBIT_KRAUS_OPS, caller);
516 
517  validateMultiQubitMatrixFitsInNode(qureg, superOpNumQubits, caller);
518 
519  int isPos = isCompletelyPositiveMap2(ops, numOps);
520  QuESTAssert(isPos, E_INVALID_KRAUS_OPS, caller);
521 }

References E_INVALID_KRAUS_OPS, E_INVALID_NUM_ONE_QUBIT_KRAUS_OPS, isCompletelyPositiveMap2(), QuESTAssert(), and validateMultiQubitMatrixFitsInNode().

Referenced by mixKrausMap().

◆ validateOneQubitPauliProbs()

void validateOneQubitPauliProbs ( qreal  probX,
qreal  probY,
qreal  probZ,
const char *  caller 
)

Definition at line 487 of file QuEST_validation.c.

487  {
488  validateProb(probX, caller);
489  validateProb(probY, caller);
490  validateProb(probZ, caller);
491 
492  qreal probNoError = 1 - probX - probY - probZ;
493  QuESTAssert(probX <= probNoError, E_INVALID_ONE_QUBIT_PAULI_PROBS, caller);
494  QuESTAssert(probY <= probNoError, E_INVALID_ONE_QUBIT_PAULI_PROBS, caller);
495  QuESTAssert(probZ <= probNoError, E_INVALID_ONE_QUBIT_PAULI_PROBS, caller);
496 }

References E_INVALID_ONE_QUBIT_PAULI_PROBS, qreal, QuESTAssert(), and validateProb().

Referenced by mixPauli().

◆ validateOneQubitUnitaryMatrix()

void validateOneQubitUnitaryMatrix ( ComplexMatrix2  u,
const char *  caller 
)

◆ validateOutcome()

void validateOutcome ( int  outcome,
const char *  caller 
)

Definition at line 426 of file QuEST_validation.c.

426  {
427  QuESTAssert(outcome==0 || outcome==1, E_INVALID_QUBIT_OUTCOME, caller);
428 }

References E_INVALID_QUBIT_OUTCOME, and QuESTAssert().

Referenced by calcProbOfOutcome(), collapseToOutcome(), and initStateOfSingleQubit().

◆ validatePauliCodes()

void validatePauliCodes ( enum pauliOpType pauliCodes,
int  numPauliCodes,
const char *  caller 
)

Definition at line 498 of file QuEST_validation.c.

498  {
499  for (int i=0; i < numPauliCodes; i++) {
500  int code = pauliCodes[i];
501  QuESTAssert(
502  code==PAULI_I || code==PAULI_X || code==PAULI_Y || code==PAULI_Z,
503  E_INVALID_PAULI_CODE, caller);
504  }
505 }

References E_INVALID_PAULI_CODE, PAULI_I, PAULI_X, PAULI_Y, PAULI_Z, and QuESTAssert().

Referenced by applyPauliSum(), calcExpecPauliProd(), calcExpecPauliSum(), and multiRotatePauli().

◆ validateProb()

void validateProb ( qreal  prob,
const char *  caller 
)

◆ validateSecondQuregStateVec()

void validateSecondQuregStateVec ( Qureg  qureg2,
const char *  caller 
)

Definition at line 442 of file QuEST_validation.c.

442  {
444 }

References E_SECOND_ARG_MUST_BE_STATEVEC, Qureg::isDensityMatrix, and QuESTAssert().

Referenced by calcFidelity(), and initPureState().

◆ validateStateIndex()

void validateStateIndex ( Qureg  qureg,
long long int  stateInd,
const char *  caller 
)

Definition at line 291 of file QuEST_validation.c.

291  {
292  long long int stateMax = 1LL << qureg.numQubitsRepresented;
293  QuESTAssert(stateInd>=0 && stateInd<stateMax, E_INVALID_STATE_INDEX, caller);
294 }

References E_INVALID_STATE_INDEX, Qureg::numQubitsRepresented, and QuESTAssert().

Referenced by initClassicalState().

◆ validateStateVecQureg()

void validateStateVecQureg ( Qureg  qureg,
const char *  caller 
)

◆ validateTarget()

◆ validateTwoQubitDephaseProb()

void validateTwoQubitDephaseProb ( qreal  prob,
const char *  caller 
)

Definition at line 467 of file QuEST_validation.c.

467  {
468  validateProb(prob, caller);
469  QuESTAssert(prob <= 3/4.0, E_INVALID_TWO_QUBIT_DEPHASE_PROB, caller);
470 }

References E_INVALID_TWO_QUBIT_DEPHASE_PROB, QuESTAssert(), and validateProb().

Referenced by mixTwoQubitDephasing().

◆ validateTwoQubitDepolProb()

void validateTwoQubitDepolProb ( qreal  prob,
const char *  caller 
)

Definition at line 482 of file QuEST_validation.c.

482  {
483  validateProb(prob, caller);
484  QuESTAssert(prob <= 15/16.0, E_INVALID_TWO_QUBIT_DEPOL_PROB, caller);
485 }

References E_INVALID_TWO_QUBIT_DEPOL_PROB, QuESTAssert(), and validateProb().

Referenced by mixTwoQubitDepolarising().

◆ validateTwoQubitKrausMap()

void validateTwoQubitKrausMap ( Qureg  qureg,
ComplexMatrix4 ops,
int  numOps,
const char *  caller 
)

Definition at line 523 of file QuEST_validation.c.

523  {
524  int opNumQubits = 2;
525  int superOpNumQubits = 2*opNumQubits;
526  int maxNumOps = superOpNumQubits*superOpNumQubits;
527  QuESTAssert(numOps > 0 && numOps <= maxNumOps, E_INVALID_NUM_TWO_QUBIT_KRAUS_OPS, caller);
528 
529  validateMultiQubitMatrixFitsInNode(qureg, superOpNumQubits, caller);
530 
531  int isPos = isCompletelyPositiveMap4(ops, numOps);
532  QuESTAssert(isPos, E_INVALID_KRAUS_OPS, caller);
533 }

References E_INVALID_KRAUS_OPS, E_INVALID_NUM_TWO_QUBIT_KRAUS_OPS, isCompletelyPositiveMap4(), QuESTAssert(), and validateMultiQubitMatrixFitsInNode().

Referenced by mixTwoQubitKrausMap().

◆ validateTwoQubitUnitaryMatrix()

void validateTwoQubitUnitaryMatrix ( Qureg  qureg,
ComplexMatrix4  u,
const char *  caller 
)

◆ validateUniqueTargets()

void validateUniqueTargets ( Qureg  qureg,
int  qubit1,
int  qubit2,
const char *  caller 
)

Definition at line 321 of file QuEST_validation.c.

321  {
322  validateTarget(qureg, qubit1, caller);
323  validateTarget(qureg, qubit2, caller);
324  QuESTAssert(qubit1 != qubit2, E_TARGETS_NOT_UNIQUE, caller);
325 }

References E_TARGETS_NOT_UNIQUE, QuESTAssert(), and validateTarget().

Referenced by mixTwoQubitDephasing(), mixTwoQubitDepolarising(), sqrtSwapGate(), and swapGate().

◆ validateUnitaryComplexPair()

void validateUnitaryComplexPair ( Complex  alpha,
Complex  beta,
const char *  caller 
)

Definition at line 410 of file QuEST_validation.c.

410  {
412 }

References E_NON_UNITARY_COMPLEX_PAIR, isComplexPairUnitary(), and QuESTAssert().

Referenced by compactUnitary(), and controlledCompactUnitary().

◆ validateVector()

void validateVector ( Vector  vector,
const char *  caller 
)

Definition at line 414 of file QuEST_validation.c.

414  {
415  QuESTAssert(getVectorMagnitude(vec) > REAL_EPS, E_ZERO_VECTOR, caller);
416 }

References E_ZERO_VECTOR, getVectorMagnitude(), and QuESTAssert().

Referenced by controlledRotateAroundAxis(), and rotateAroundAxis().

@ E_INVALID_TWO_QUBIT_DEPOL_PROB
@ E_NUM_AMPS_EXCEED_TYPE
void validateTarget(Qureg qureg, int targetQubit, const char *caller)
@ E_INVALID_QUBIT_OUTCOME
int isMatrix2Unitary(ComplexMatrix2 u)
@ PAULI_Z
Definition: QuEST.h:96
@ E_INVALID_PAULI_CODE
@ E_NON_UNITARY_MATRIX
@ PAULI_I
Definition: QuEST.h:96
@ E_INVALID_ONE_QUBIT_DEPHASE_PROB
void validateMultiQubitMatrixFitsInNode(Qureg qureg, int numTargets, const char *caller)
@ E_CANNOT_FIT_MULTI_QUBIT_MATRIX
@ E_INVALID_NUM_N_QUBIT_KRAUS_OPS
int isMatrix4Unitary(ComplexMatrix4 u)
@ E_MISMATCHING_QUREG_TYPES
int isCompletelyPositiveMap4(ComplexMatrix4 *ops, int numOps)
@ E_INVALID_QUBIT_INDEX
void validateProb(qreal prob, const char *caller)
@ E_NON_UNITARY_COMPLEX_PAIR
void validateMultiTargets(Qureg qureg, int *targetQubits, const int numTargetQubits, const char *caller)
@ E_INVALID_CONTROLS_BIT_STATE
@ E_INVALID_NUM_TWO_QUBIT_KRAUS_OPS
@ E_SECOND_ARG_MUST_BE_STATEVEC
@ E_INVALID_NUM_SUM_TERMS
@ E_DEFINED_ONLY_FOR_STATEVECS
#define qreal
void validateMatrixInit(ComplexMatrixN matr, const char *caller)
int isCompletelyPositiveMap2(ComplexMatrix2 *ops, int numOps)
unsigned int calcLog2(long unsigned int num)
returns log2 of numbers which must be gauranteed to be 2^n
void validateControl(Qureg qureg, int controlQubit, const char *caller)
@ PAULI_X
Definition: QuEST.h:96
@ E_INVALID_PROB
int isMatrixNUnitary(ComplexMatrixN u)
@ E_QUBITS_NOT_UNIQUE
void validateMultiControls(Qureg qureg, int *controlQubits, const int numControlQubits, const char *caller)
@ E_CONTROL_TARGET_COLLISION
long long int getQubitBitMask(int *qubits, const int numQubits)
Definition: QuEST_common.c:43
@ E_DEFINED_ONLY_FOR_DENSMATRS
@ E_INVALID_KRAUS_OPS
@ E_INVALID_STATE_INDEX
int areUniqueQubits(int *qubits, int numQubits)
@ E_TARGET_IN_CONTROLS
@ E_INVALID_NUM_QUBITS
long long int numAmpsPerChunk
Number of probability amplitudes held in stateVec by this process In the non-MPI version,...
Definition: QuEST.h:170
@ E_TARGET_IS_CONTROL
@ E_INVALID_UNITARY_SIZE
@ E_INVALID_ONE_QUBIT_PAULI_PROBS
@ E_MISMATCHING_NUM_TARGS_KRAUS_SIZE
@ E_INVALID_TARGET_QUBIT
@ E_COMPLEX_MATRIX_NOT_INIT
@ E_CANNOT_OPEN_FILE
@ E_DISTRIB_QUREG_TOO_SMALL
@ E_INVALID_NUM_ONE_QUBIT_KRAUS_OPS
@ PAULI_Y
Definition: QuEST.h:96
@ E_INVALID_AMP_INDEX
qreal ** real
Definition: QuEST.h:139
@ E_INVALID_NUM_RANKS
@ E_INVALID_TWO_QUBIT_DEPHASE_PROB
void QuESTAssert(int isValid, ErrorCode code, const char *func)
@ E_INVALID_NUM_AMPS
@ E_COLLAPSE_STATE_ZERO_PROB
void validateNumControls(Qureg qureg, const int numControlQubits, const char *caller)
@ E_TARGETS_NOT_UNIQUE
qreal ** imag
Definition: QuEST.h:140
@ E_MISMATCHING_QUREG_DIMENSIONS
void validateNumTargets(Qureg qureg, const int numTargetQubits, const char *caller)
@ E_INVALID_NUM_CREATE_QUBITS
int isDensityMatrix
Whether this instance is a density-state representation.
Definition: QuEST.h:163
int numQubits
Definition: QuEST.h:138
void validateAmpIndex(Qureg qureg, long long int ampInd, const char *caller)
qreal getVectorMagnitude(Vector vec)
Definition: QuEST_common.c:72
@ E_UNNORM_PROBS
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
int isCompletelyPositiveMapN(ComplexMatrixN *ops, int numOps)
@ E_INVALID_OFFSET_NUM_AMPS
int isComplexPairUnitary(Complex alpha, Complex beta)
@ E_INVALID_ONE_QUBIT_DEPOL_PROB
@ E_ZERO_VECTOR
@ E_CONTROLS_NOT_UNIQUE