QuEST_validation.c File Reference
#include "QuEST.h"
#include "QuEST_precision.h"
#include "QuEST_internal.h"
#include "QuEST_validation.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

Go to the source code of this file.

Macros

#define macro_isCompletelyPositiveMap(ops, numOps, opDim)
 
#define macro_isMatrixUnitary(m, dim, retVal)
 

Enumerations

enum  ErrorCode {
  E_SUCCESS =0, E_INVALID_NUM_RANKS, E_INVALID_NUM_CREATE_QUBITS, E_INVALID_QUBIT_INDEX,
  E_INVALID_TARGET_QUBIT, E_INVALID_CONTROL_QUBIT, E_INVALID_STATE_INDEX, E_INVALID_AMP_INDEX,
  E_INVALID_NUM_AMPS, E_INVALID_OFFSET_NUM_AMPS, E_TARGET_IS_CONTROL, E_TARGET_IN_CONTROLS,
  E_CONTROL_TARGET_COLLISION, E_QUBITS_NOT_UNIQUE, E_TARGETS_NOT_UNIQUE, E_CONTROLS_NOT_UNIQUE,
  E_INVALID_NUM_QUBITS, E_INVALID_NUM_TARGETS, E_INVALID_NUM_CONTROLS, E_NON_UNITARY_MATRIX,
  E_NON_UNITARY_COMPLEX_PAIR, E_ZERO_VECTOR, E_SYS_TOO_BIG_TO_PRINT, E_COLLAPSE_STATE_ZERO_PROB,
  E_INVALID_QUBIT_OUTCOME, E_CANNOT_OPEN_FILE, E_SECOND_ARG_MUST_BE_STATEVEC, E_MISMATCHING_QUREG_DIMENSIONS,
  E_MISMATCHING_QUREG_TYPES, E_DEFINED_ONLY_FOR_STATEVECS, E_DEFINED_ONLY_FOR_DENSMATRS, E_INVALID_PROB,
  E_UNNORM_PROBS, E_INVALID_ONE_QUBIT_DEPHASE_PROB, E_INVALID_TWO_QUBIT_DEPHASE_PROB, E_INVALID_ONE_QUBIT_DEPOL_PROB,
  E_INVALID_TWO_QUBIT_DEPOL_PROB, E_INVALID_ONE_QUBIT_PAULI_PROBS, E_INVALID_CONTROLS_BIT_STATE, E_INVALID_PAULI_CODE,
  E_INVALID_NUM_SUM_TERMS, E_CANNOT_FIT_MULTI_QUBIT_MATRIX, E_INVALID_UNITARY_SIZE, E_COMPLEX_MATRIX_NOT_INIT,
  E_INVALID_NUM_ONE_QUBIT_KRAUS_OPS, E_INVALID_NUM_TWO_QUBIT_KRAUS_OPS, E_INVALID_NUM_N_QUBIT_KRAUS_OPS, E_INVALID_KRAUS_OPS,
  E_MISMATCHING_NUM_TARGS_KRAUS_SIZE, E_DISTRIB_QUREG_TOO_SMALL, E_NUM_AMPS_EXCEED_TYPE
}
 

Functions

int areUniqueQubits (int *qubits, int numQubits)
 
unsigned int calcLog2 (long unsigned int num)
 returns log2 of numbers which must be gauranteed to be 2^n More...
 
void exitWithError (const char *msg, const char *func)
 
void invalidQuESTInputError (const char *errMsg, const char *errFunc)
 An internal function called when invalid arguments are passed to a QuEST API call, which the user can optionally override by redefining. More...
 
int isCompletelyPositiveMap2 (ComplexMatrix2 *ops, int numOps)
 
int isCompletelyPositiveMap4 (ComplexMatrix4 *ops, int numOps)
 
int isCompletelyPositiveMapN (ComplexMatrixN *ops, int numOps)
 
int isComplexPairUnitary (Complex alpha, Complex beta)
 
int isComplexUnit (Complex alpha)
 
int isMatrix2Unitary (ComplexMatrix2 u)
 
int isMatrix4Unitary (ComplexMatrix4 u)
 
int isMatrixNUnitary (ComplexMatrixN u)
 
int isVectorUnit (qreal ux, qreal uy, qreal uz)
 
void QuESTAssert (int isValid, ErrorCode code, const char *func)
 
void validateAmpIndex (Qureg qureg, long long int ampInd, const char *caller)
 
void validateControl (Qureg qureg, int controlQubit, 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 found, 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 qureg, 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 validateNumControls (Qureg qureg, const int numControlQubits, 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 validateNumTargets (Qureg qureg, const int numTargetQubits, 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 vec, const char *caller)
 

Variables

static const char * errorMessages []
 

Detailed Description

Provides validation of user input

Author
Tyson Jones
Ania Brown (exitWithError(), QuESTAssert(), original testing of: qubit indices, unitarity, valid collapse probability)
Balint Koczor (Kraus maps)
Nicolas Vogt of HQS (one-qubit damping)

Definition in file QuEST_validation.c.

Macro Definition Documentation

◆ macro_isCompletelyPositiveMap

#define macro_isCompletelyPositiveMap (   ops,
  numOps,
  opDim 
)
Value:
{ \
for (int r=0; r<(opDim); r++) { \
for (int c=0; c<(opDim); c++) { \
qreal elemRe_ = 0; \
qreal elemIm_ = 0; \
for (int n=0; n<(numOps); n++) { \
for (int k=0; k<(opDim); k++) { \
elemRe_ += ops[n].real[k][r]*ops[n].real[k][c] + ops[n].imag[k][r]*ops[n].imag[k][c]; \
elemIm_ += ops[n].real[k][r]*ops[n].imag[k][c] - ops[n].imag[k][r]*ops[n].real[k][c]; \
} \
} \
qreal dist_ = absReal(elemIm_) + absReal(elemRe_ - ((r==c)? 1:0)); \
if (dist_ > REAL_EPS) \
return 0; \
} \
} \
return 1; \
}

Definition at line 212 of file QuEST_validation.c.

◆ macro_isMatrixUnitary

#define macro_isMatrixUnitary (   m,
  dim,
  retVal 
)
Value:
{ \
/* elemRe_ and elemIm_ must not exist in caller scope */ \
qreal elemRe_, elemIm_; \
retVal = 1; \
/* check m * ConjugateTranspose(m) == Identity */ \
for (int r=0; r < (dim); r++) { \
for (int c=0; c < (dim); c++) { \
/* m[r][...] * ConjugateTranspose(m)[...][c] */ \
elemRe_ = 0; \
elemIm_ = 0; \
for (int i=0; i < (dim); i++) { \
/* m[r][i] * conj(m[c][i]) */ \
elemRe_ += m.real[r][i]*m.real[c][i] + m.imag[r][i]*m.imag[c][i]; \
elemIm_ += m.imag[r][i]*m.real[c][i] - m.real[r][i]*m.imag[c][i]; \
} \
/* check distance from identity */ \
if ((absReal(elemIm_) > REAL_EPS) || \
(r == c && absReal(elemRe_ - 1) > REAL_EPS) || \
(r != c && absReal(elemRe_ ) > REAL_EPS)) { \
retVal = 0; \
break; \
} \
} \
if (retVal == 0) \
break; \
} \
}

Definition at line 166 of file QuEST_validation.c.

Enumeration Type Documentation

◆ ErrorCode

enum ErrorCode
Enumerator
E_SUCCESS 
E_INVALID_NUM_RANKS 
E_INVALID_NUM_CREATE_QUBITS 
E_INVALID_QUBIT_INDEX 
E_INVALID_TARGET_QUBIT 
E_INVALID_CONTROL_QUBIT 
E_INVALID_STATE_INDEX 
E_INVALID_AMP_INDEX 
E_INVALID_NUM_AMPS 
E_INVALID_OFFSET_NUM_AMPS 
E_TARGET_IS_CONTROL 
E_TARGET_IN_CONTROLS 
E_CONTROL_TARGET_COLLISION 
E_QUBITS_NOT_UNIQUE 
E_TARGETS_NOT_UNIQUE 
E_CONTROLS_NOT_UNIQUE 
E_INVALID_NUM_QUBITS 
E_INVALID_NUM_TARGETS 
E_INVALID_NUM_CONTROLS 
E_NON_UNITARY_MATRIX 
E_NON_UNITARY_COMPLEX_PAIR 
E_ZERO_VECTOR 
E_SYS_TOO_BIG_TO_PRINT 
E_COLLAPSE_STATE_ZERO_PROB 
E_INVALID_QUBIT_OUTCOME 
E_CANNOT_OPEN_FILE 
E_SECOND_ARG_MUST_BE_STATEVEC 
E_MISMATCHING_QUREG_DIMENSIONS 
E_MISMATCHING_QUREG_TYPES 
E_DEFINED_ONLY_FOR_STATEVECS 
E_DEFINED_ONLY_FOR_DENSMATRS 
E_INVALID_PROB 
E_UNNORM_PROBS 
E_INVALID_ONE_QUBIT_DEPHASE_PROB 
E_INVALID_TWO_QUBIT_DEPHASE_PROB 
E_INVALID_ONE_QUBIT_DEPOL_PROB 
E_INVALID_TWO_QUBIT_DEPOL_PROB 
E_INVALID_ONE_QUBIT_PAULI_PROBS 
E_INVALID_CONTROLS_BIT_STATE 
E_INVALID_PAULI_CODE 
E_INVALID_NUM_SUM_TERMS 
E_CANNOT_FIT_MULTI_QUBIT_MATRIX 
E_INVALID_UNITARY_SIZE 
E_COMPLEX_MATRIX_NOT_INIT 
E_INVALID_NUM_ONE_QUBIT_KRAUS_OPS 
E_INVALID_NUM_TWO_QUBIT_KRAUS_OPS 
E_INVALID_NUM_N_QUBIT_KRAUS_OPS 
E_INVALID_KRAUS_OPS 
E_MISMATCHING_NUM_TARGS_KRAUS_SIZE 
E_DISTRIB_QUREG_TOO_SMALL 
E_NUM_AMPS_EXCEED_TYPE 

Definition at line 26 of file QuEST_validation.c.

26  {
27  E_SUCCESS=0,
78 } ErrorCode;

Function Documentation

◆ areUniqueQubits()

int areUniqueQubits ( int *  qubits,
int  numQubits 
)

Definition at line 241 of file QuEST_validation.c.

241  {
242  long long int mask = 0;
243  long long int bit;
244  for (int q=0; q < numQubits; q++) {
245  bit = 1LL << qubits[q];
246  if (mask & bit)
247  return 0;
248  mask |= bit;
249  }
250  return 1;
251 }

Referenced by validateMultiControls(), validateMultiQubits(), and validateMultiTargets().

◆ exitWithError()

void exitWithError ( const char *  msg,
const char *  func 
)

Definition at line 133 of file QuEST_validation.c.

133  {
134  printf("!!!\n");
135  printf("QuEST Error in function %s: %s\n", func, msg);
136  printf("!!!\n");
137  printf("exiting..\n");
138  exit(1);
139 }

Referenced by invalidQuESTInputError().

◆ isCompletelyPositiveMap2()

int isCompletelyPositiveMap2 ( ComplexMatrix2 ops,
int  numOps 
)

Definition at line 230 of file QuEST_validation.c.

230  {
231  macro_isCompletelyPositiveMap(ops, numOps, 2);
232 }

References macro_isCompletelyPositiveMap.

Referenced by validateOneQubitKrausMap().

◆ isCompletelyPositiveMap4()

int isCompletelyPositiveMap4 ( ComplexMatrix4 ops,
int  numOps 
)

Definition at line 233 of file QuEST_validation.c.

233  {
234  macro_isCompletelyPositiveMap(ops, numOps, 4);
235 }

References macro_isCompletelyPositiveMap.

Referenced by validateTwoQubitKrausMap().

◆ isCompletelyPositiveMapN()

int isCompletelyPositiveMapN ( ComplexMatrixN ops,
int  numOps 
)

Definition at line 236 of file QuEST_validation.c.

236  {
237  int opDim = 1 << ops[0].numQubits;
238  macro_isCompletelyPositiveMap(ops, numOps, opDim);
239 }

References macro_isCompletelyPositiveMap, and ComplexMatrixN::numQubits.

Referenced by validateMultiQubitKrausMap().

◆ isComplexPairUnitary()

int isComplexPairUnitary ( Complex  alpha,
Complex  beta 
)

Definition at line 158 of file QuEST_validation.c.

158  {
159  return ( absReal( -1
160  + alpha.real*alpha.real
161  + alpha.imag*alpha.imag
162  + beta.real*beta.real
163  + beta.imag*beta.imag) < REAL_EPS );
164 }

References Complex::imag, and Complex::real.

Referenced by validateUnitaryComplexPair().

◆ isComplexUnit()

int isComplexUnit ( Complex  alpha)

Definition at line 150 of file QuEST_validation.c.

150  {
151  return (absReal(1 - sqrt(alpha.real*alpha.real + alpha.imag*alpha.imag)) < REAL_EPS);
152 }

References Complex::imag, and Complex::real.

◆ isMatrix2Unitary()

int isMatrix2Unitary ( ComplexMatrix2  u)

Definition at line 193 of file QuEST_validation.c.

193  {
194  int dim = 2;
195  int retVal;
196  macro_isMatrixUnitary(u, dim, retVal);
197  return retVal;
198 }

References macro_isMatrixUnitary.

Referenced by validateOneQubitUnitaryMatrix().

◆ isMatrix4Unitary()

int isMatrix4Unitary ( ComplexMatrix4  u)

Definition at line 199 of file QuEST_validation.c.

199  {
200  int dim = 4;
201  int retVal;
202  macro_isMatrixUnitary(u, dim, retVal);
203  return retVal;
204 }

References macro_isMatrixUnitary.

Referenced by validateTwoQubitUnitaryMatrix().

◆ isMatrixNUnitary()

int isMatrixNUnitary ( ComplexMatrixN  u)

Definition at line 205 of file QuEST_validation.c.

205  {
206  int dim = 1 << u.numQubits;
207  int retVal;
208  macro_isMatrixUnitary(u, dim, retVal);
209  return retVal;
210 }

References macro_isMatrixUnitary, and ComplexMatrixN::numQubits.

Referenced by validateMultiQubitUnitaryMatrix().

◆ isVectorUnit()

int isVectorUnit ( qreal  ux,
qreal  uy,
qreal  uz 
)

Definition at line 154 of file QuEST_validation.c.

154  {
155  return (absReal(1 - sqrt(ux*ux + uy*uy + uz*uz)) < REAL_EPS );
156 }

◆ QuESTAssert()

◆ 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().

◆ validateControl()

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

Definition at line 311 of file QuEST_validation.c.

311  {
312  QuESTAssert(controlQubit>=0 && controlQubit<qureg.numQubitsRepresented, E_INVALID_CONTROL_QUBIT, caller);
313 }

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

Referenced by validateControlTarget(), and validateMultiControls().

◆ 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  found,
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  qureg,
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().

◆ validateNumControls()

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

Definition at line 331 of file QuEST_validation.c.

331  {
332  QuESTAssert(numControlQubits>0 && numControlQubits<qureg.numQubitsRepresented, E_INVALID_NUM_CONTROLS, caller);
333 }

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

Referenced by validateMultiControls().

◆ 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().

◆ validateNumTargets()

void validateNumTargets ( Qureg  qureg,
const int  numTargetQubits,
const char *  caller 
)

Definition at line 327 of file QuEST_validation.c.

327  {
328  QuESTAssert(numTargetQubits>0 && numTargetQubits<=qureg.numQubitsRepresented, E_INVALID_NUM_TARGETS, caller);
329 }

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

Referenced by validateMultiTargets().

◆ 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  vec,
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().

Variable Documentation

◆ errorMessages

const char* errorMessages[]
static

Definition at line 80 of file QuEST_validation.c.

Referenced by QuESTAssert().

@ 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)
#define macro_isCompletelyPositiveMap(ops, numOps, opDim)
@ 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_CONTROL_QUBIT
@ 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)
#define macro_isMatrixUnitary(m, dim, retVal)
@ 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
void invalidQuESTInputError(const char *errMsg, const char *errFunc)
An internal function called when invalid arguments are passed to a QuEST API call,...
@ 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
static const char * errorMessages[]
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
ErrorCode
@ E_INVALID_NUM_CONTROLS
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
qreal real
Definition: QuEST.h:105
int isCompletelyPositiveMapN(ComplexMatrixN *ops, int numOps)
qreal imag
Definition: QuEST.h:106
@ E_INVALID_NUM_TARGETS
@ E_SYS_TOO_BIG_TO_PRINT
@ E_INVALID_OFFSET_NUM_AMPS
int isComplexPairUnitary(Complex alpha, Complex beta)
@ E_INVALID_ONE_QUBIT_DEPOL_PROB
@ E_SUCCESS
@ E_ZERO_VECTOR
@ E_CONTROLS_NOT_UNIQUE