-
Notifications
You must be signed in to change notification settings - Fork 197
Expand file tree
/
Copy pathvalidation.hpp
More file actions
551 lines (306 loc) · 16.5 KB
/
Copy pathvalidation.hpp
File metadata and controls
551 lines (306 loc) · 16.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
/** @file
* Validation of user inputs which check all preconditions of the API
* functions are satisfied, and otherwise throws a user-readable error.
*
* @author Tyson Jones
*/
#ifndef VALIDATION_HPP
#define VALIDATION_HPP
#include "quest/include/types.h"
#include "quest/include/environment.h"
#include "quest/include/qureg.h"
#include "quest/include/paulis.h"
#include "quest/include/matrices.h"
#include "quest/include/channels.h"
#include <vector>
#include <string>
using std::vector;
using std::string;
/*
* PLACEHOLDER STRUCT FIELDS
*/
const int validate_STRUCT_PROPERTY_UNKNOWN_FLAG = -1;
/*
* VALIDATION ERROR HANDLER
*/
void validateconfig_setErrorHandler(void (*callback)(const char* func, const char* msg));
/*
* VALIDATION TOGGLE
*/
void validateconfig_enable();
void validateconfig_disable();
bool validateconfig_isEnabled();
/*
* VALIDATION PRECISION
*/
void validateconfig_setEpsilon(qreal eps);
void validateconfig_setEpsilonToDefault();
qreal validateconfig_getEpsilon();
/*
* ENVIRONMENT CREATION
*/
void validate_envNeverInit(bool isQuESTInit, bool isQuESTFinal, const char* caller);
void validate_newEnvDeploymentMode(int isDistrib, int isGpuAccel, int isMultithread, const char* caller);
void validate_newEnvDistributedBetweenPower2Nodes(const char* caller);
void validate_newEnvNodesEachHaveUniqueGpu(const char* caller);
void validate_gpuIsCuQuantumCompatible(const char* caller);
/*
* EXISTING ENVIRONMENT
*/
void validate_envIsInit(const char* caller);
/*
* DEBUG UTILITIES
*/
void validate_randomSeeds(unsigned* seeds, int numSeeds, const char* caller);
void validate_newEpsilonValue(qreal eps, const char* caller);
void validate_newMaxNumReportedScalars(qindex numRows, qindex numCols, const char* caller);
void validate_newMaxNumReportedSigFigs(int numSigFigs, const char* caller);
void validate_newNumReportedNewlines(int numNewlines, const char* caller);
void validate_numReportedNewlinesAboveZero(const char* caller);
void validate_numPauliChars(const char* paulis, const char* caller);
void validate_reportedPauliStrStyleFlag(int flag, const char* caller);
/*
* QUREG CREATION
*/
void validate_newQuregParams(int numQubits, int isDensMatr, int isDistrib, int isGpuAccel, int numCpuThreads, QuESTEnv env, const char* caller);
void validate_newQuregAllocs(Qureg qureg, const char* caller);
/*
* EXISTING QUREG
*/
void validate_quregFields(Qureg qureg, const char* caller);
void validate_quregIsStateVector(Qureg qureg, const char* caller);
void validate_quregIsDensityMatrix(Qureg qureg, const char* caller);
/*
* MATRIX CREATION
*/
void validate_newCompMatrParams(int numQubits, const char* caller);
void validate_newDiagMatrParams(int numQubits, const char* caller);
void validate_newFullStateDiagMatrParams(int numQubits, int useDistrib, int useGpu, int useMultithread, const char* caller);
void validate_newMatrixAllocs(CompMatr matr, const char* caller);
void validate_newMatrixAllocs(DiagMatr matr, const char* caller);
void validate_newMatrixAllocs(FullStateDiagMatr matr, const char* caller);
/*
* MATRIX INITIALISATION
*/
void validate_matrixNumNewElems(int numQubits, vector<vector<qcomp>> elems, const char* caller);
void validate_matrixNumNewElems(int numQubits, vector<qcomp> elems, const char* caller);
void validate_matrixNewElemsPtrNotNull(qcomp* elems, const char* caller);
void validate_matrixNewElemsPtrNotNull(qcomp** elems, qindex numRows, const char* caller);
void validate_fullStateDiagMatrNewElems(FullStateDiagMatr matr, qindex startInd, qindex numElems, const char* caller);
void validate_matrixNumQubitsMatchesParam(int numMatrQubits, int numSetterQubits, const char* caller);
void validate_declaredNumElemsMatchesVectorLength(qindex numElems, qindex vecLength, const char* caller);
void validate_multiVarFuncQubits(int numMatrQubits, int* numQubitsPerVar, int numVars, const char* caller);
void validate_funcVarSignedFlag(int areSigned, const char* caller);
void validate_matrixRowsAllSameSize(vector<vector<qcomp>> matrix, const char* caller);
/*
* EXISTING MATRIX
*/
void validate_matrixFields(CompMatr1 matr, const char* caller);
void validate_matrixFields(CompMatr2 matr, const char* caller);
void validate_matrixFields(CompMatr matr, const char* caller);
void validate_matrixFields(DiagMatr1 matr, const char* caller);
void validate_matrixFields(DiagMatr2 matr, const char* caller);
void validate_matrixFields(DiagMatr matr, const char* caller);
void validate_matrixFields(FullStateDiagMatr matr, const char* caller);
void validate_matrixIsSynced(CompMatr matr, const char* caller);
void validate_matrixIsSynced(DiagMatr matr, const char* caller);
void validate_matrixIsSynced(FullStateDiagMatr matr, const char* caller);
void validate_matrixIsUnitary(CompMatr1 matr, const char* caller);
void validate_matrixIsUnitary(CompMatr2 matr, const char* caller);
void validate_matrixIsUnitary(CompMatr matr, const char* caller);
void validate_matrixIsUnitary(DiagMatr1 matr, const char* caller);
void validate_matrixIsUnitary(DiagMatr2 matr, const char* caller);
void validate_matrixIsUnitary(DiagMatr matr, const char* caller);
void validate_matrixIsUnitary(FullStateDiagMatr matr, const char* caller);
void validate_unitaryExponentIsReal(qcomp exponent, const char* caller);
void validate_matrixIsHermitian(CompMatr1 matr, const char* caller);
void validate_matrixIsHermitian(CompMatr2 matr, const char* caller);
void validate_matrixIsHermitian(CompMatr matr, const char* caller);
void validate_matrixIsHermitian(DiagMatr1 matr, const char* caller);
void validate_matrixIsHermitian(DiagMatr2 matr, const char* caller);
void validate_matrixIsHermitian(DiagMatr matr, const char* caller);
void validate_matrixIsHermitian(FullStateDiagMatr matr, const char* caller);
void validate_matrixExpIsHermitian(DiagMatr matr, qreal exponent, const char* caller);
void validate_matrixExpIsHermitian(FullStateDiagMatr matr, qreal exponent, const char* caller);
void validate_matrixExpIsNonDiverging(DiagMatr matr, qcomp exponent, const char* caller);
void validate_matrixExpIsNonDiverging(FullStateDiagMatr matr, qcomp exponent, const char* caller);
void validate_matrixDimMatchesTargets(CompMatr1 matr, int numTargs, const char* caller);
void validate_matrixDimMatchesTargets(CompMatr2 matr, int numTargs, const char* caller);
void validate_matrixDimMatchesTargets(CompMatr matr, int numTargs, const char* caller);
void validate_matrixDimMatchesTargets(DiagMatr1 matr, int numTargs, const char* caller);
void validate_matrixDimMatchesTargets(DiagMatr2 matr, int numTargs, const char* caller);
void validate_matrixDimMatchesTargets(DiagMatr matr, int numTargs, const char* caller);
void validate_matrixAndQuregAreCompatible(FullStateDiagMatr matr, Qureg qureg, bool expecOnly, const char* caller);
/*
* SUPEROPERATOR CREATION
*/
void validate_newSuperOpParams(int numQubits, const char* caller);
void validate_newSuperOpAllocs(SuperOp op, const char* caller);
void validate_newInlineSuperOpDimMatchesVectors(int numDeclaredQubits, vector<vector<qcomp>> matrix, const char* caller);
/*
* SUPEROPERATOR INITIALISATION
*/
void validate_superOpNewMatrixDims(SuperOp op, vector<vector<qcomp>> matrix, const char* caller);
void validate_superOpFieldsMatchPassedParams(SuperOp op, int numQb, const char* caller);
/*
* EXISTING SUPEROPERATOR
*/
void validate_superOpFields(SuperOp op, const char* caller);
void validate_superOpIsSynced(SuperOp op, const char* caller);
void validate_superOpDimMatchesTargs(SuperOp op, int numTargets, const char* caller);
/*
* KRAUS MAP CREATION
*/
void validate_newKrausMapParams(int numQubits, int numMatrices, const char* caller);
void validate_newKrausMapAllocs(KrausMap map, const char* caller);
void validate_newInlineKrausMapDimMatchesVectors(int numQubits, int numOperators, vector<vector<vector<qcomp>>> matrices, const char* caller);
/*
* KRAUS MAP INITIALISATION
*/
void validate_krausMapNewMatrixDims(KrausMap map, vector<vector<vector<qcomp>>> matrices, const char* caller);
void validate_krausMapFieldsMatchPassedParams(KrausMap map, int numQb, int numOps, const char* caller);
/*
* EXISTING KRAUS MAP
*/
void validate_krausMapFields(KrausMap map, const char* caller);
void validate_krausMapIsSynced(KrausMap map, const char* caller);
void validate_krausMapIsCPTP(KrausMap map, const char* caller);
void validate_krausMapMatchesTargets(KrausMap map, int numTargets, const char* caller);
/*
* PAULI STRINGS AND SUMS CREATION
*/
void validate_newPauliStrParams(const char* paulis, int* indices, int numPaulis, int maxNumPaulis, const char* caller);
void validate_newPauliStrParams(int* paulis, int* indices, int numPaulis, int maxNumPaulis, const char* caller);
void validate_newPauliStrNumChars(int numPaulis, int numIndices, const char* caller); // used by C++ only API
void validate_newPauliStrNumPaulis(int numPaulis, int maxNumPaulis, const char* caller); // used by C++ only API
void validate_newPauliStrSumParams(qindex numTerms, const char* caller);
void validate_newPauliStrSumMatchingListLens(qindex numStrs, qindex numCoeffs, const char* caller); // used by C++ only API
void validate_newPauliStrSumAllocs(PauliStrSum sum, qindex numBytesStrings, qindex numBytesCoeffs, const char* caller);
/*
* PAULI STRING SUM PARSING
*/
void validate_parsedPauliStrSumLineIsInterpretable(bool isInterpretable, string line, qindex lineIndex, const char* caller);
void validate_parsedPauliStrSumCoeffWithinQcompRange(bool isCoeffValid, string line, qindex lineIndex, const char* caller);
void validate_parsedPauliStrSumLineHasConsistentNumPaulis(int numPaulis, int numLinePaulis, string line, qindex lineIndex, const char* caller);
void validate_parsedStringIsNotEmpty(bool stringIsNotEmpty, const char* caller);
/*
* EXISTING PAULI STRING
*/
void validate_pauliStrTargets(Qureg qureg, PauliStr str, const char* caller);
void validate_controlAndPauliStrTargets(Qureg qureg, int ctrl, PauliStr str, const char* caller);
void validate_controlsAndPauliStrTargets(Qureg qureg, int* ctrls, int numCtrls, PauliStr str, const char* caller);
/*
* EXISTING PAULI STRING SUMS
*/
void validate_pauliStrSumFields(PauliStrSum sum, const char* caller);
void validate_pauliStrSumIsHermitian(PauliStrSum sum, const char* caller);
void validate_pauliStrSumTargets(PauliStrSum sum, Qureg qureg, const char* caller);
void validate_controlAndPauliStrSumTargets(Qureg qureg, int ctrl, PauliStrSum sum, const char* caller);
void validate_controlsAndPauliStrSumTargets(Qureg qureg, int* ctrls, int numCtrls, PauliStrSum sum, const char* caller);
void validate_pauliStrSumCanInitMatrix(FullStateDiagMatr matr, PauliStrSum sum, const char* caller);
/*
* BASIS STATE INDICES
*/
void validate_basisStateIndex(Qureg qureg, qindex ind, const char* caller);
void validate_basisStateRowCol(Qureg qureg, qindex row, qindex col, const char* caller);
void validate_basisStateIndices(Qureg qureg, qindex startInd, qindex numInds, const char* caller);
void validate_basisStateRowCols(Qureg qureg, qindex startRow, qindex startCol, qindex numRows, qindex numCols, const char* caller);
void validate_localAmpIndices(Qureg qureg, qindex localStartInd, qindex numInds, const char* caller);
/*
* QUBIT INDICES
*/
void validate_target(Qureg qureg, int target, const char* caller);
void validate_targets(Qureg qureg, int* targets, int numTargets, const char* caller);
void validate_controls(Qureg qureg, int* ctrls, int numCtrls, const char* caller);
void validate_controlStates(int* states, int numCtrls, const char* caller);
void validate_controlsMatchStates(int numCtrls, int numStates, const char* caller); // C++ only
void validate_controlAndTarget(Qureg qureg, int ctrl, int targ, const char* caller);
void validate_controlsAndTarget(Qureg qureg, int* ctrls, int numCtrls, int targ, const char* caller);
void validate_controlAndTargets(Qureg qureg, int ctrl, int* targs, int numTargs, const char* caller);
void validate_controlsAndTargets(Qureg qureg, int* ctrls, int numCtrls, int* targs, int numTargs, const char* caller);
void validate_twoTargets(Qureg qureg, int target1, int target2, const char* caller);
void validate_controlAndTwoTargets(Qureg qureg, int ctrl, int targ1, int targ2, const char* caller);
void validate_controlsAndTwoTargets(Qureg qureg, int* ctrls, int numCtrls, int targ1, int targ2, const char* caller);
/*
* MEASUREMENT PARAMETERS
*/
void validate_measurementOutcomeIsValid(int outcome, const char* caller);
void validate_measurementOutcomesAreValid(int* outcomes, int numOutcomes, const char* caller);
void validate_measurementOutcomeProbNotZero(int outcome, qreal prob, const char* caller);
void validate_measurementOutcomesProbNotZero(int* outcomes, int numQubits, qreal prob, const char* caller);
void validate_measurementOutcomesFitInGpuMem(Qureg qureg, int numQubits, const char* caller);
void validate_measurementProbsAreNormalised(vector<qreal> probs, const char* caller);
void validate_measurementOutcomesMatchTargets(int numQubits, int numOutcomes, const char* caller); // C++ interface
/*
* MISC GATE PARAMETERS
*/
void validate_rotationAxisNotZeroVector(qreal x, qreal y, qreal z, const char* caller);
void validate_mixedAmpsFitInNode(Qureg qureg, int numTargets, const char* caller);
/*
* TROTTERISATION PARAMETERS
*/
void validate_trotterParams(Qureg qureg, int order, int reps, const char* caller);
/*
* TIME EVOLUTION PARAMETERS
*/
void validate_lindbladJumpOps(PauliStrSum* jumps, int numJumps, Qureg qureg, const char* caller);
void validate_lindbladDampingRates(qreal* damps, int numJumps, const char* caller);
void validate_numLindbladSuperPropagatorTerms(qindex numSuperTerms, const char* caller);
/*
* DECOHERENCE
*/
void validate_probability(qreal prob, const char* caller);
void validate_probabilities(qreal* probs, int numProbs, const char* caller);
void validate_oneQubitDepashingProb(qreal prob, const char* caller);
void validate_twoQubitDepashingProb(qreal prob, const char* caller);
void validate_oneQubitDepolarisingProb(qreal prob, const char* caller);
void validate_twoQubitDepolarisingProb(qreal prob, const char* caller);
void validate_oneQubitDampingProb(qreal prob, const char* caller);
void validate_oneQubitPauliChannelProbs(qreal pX, qreal pY, qreal pZ, const char* caller);
/*
* QUREG COMBINATION
*/
void validate_numQuregsInSum(int numQuregs, const char* caller);
void validate_quregCanBeWorkspace(Qureg quregA, Qureg quregB, const char* caller);
void validate_quregsCanBeSummed(Qureg out, Qureg* in, int numIn, const char* caller);
void validate_quregsCanBeMixed(Qureg out, Qureg* in, int numIn, const char* caller);
void validate_quregPairCanBeMixed(Qureg out, Qureg in, const char* caller);
void validate_numQuregsMatchesCoeffs(size_t numQuregs, size_t numCoeffs, const char* caller);
void validate_numQuregsMatchesProbs(size_t numQuregs, size_t numProbs, const char* caller);
void validate_quregCanBeInitialisedToPureState(Qureg qureg, Qureg pure, const char* caller);
void validate_quregsCanBeCloned(Qureg quregA, Qureg quregB, const char* caller);
void validate_quregsCanBeProducted(Qureg quregA, Qureg quregB, const char* caller);
void validate_throwErrorBecauseCalcFidOfDensMatrNotYetImplemented(const char* caller);
void validate_fidelityIsReal(qcomp fid, const char* caller);
void validate_buresDistanceInnerProdIsNormalised(qreal mag, const char* caller); // may modify mag
void validate_purifiedDistanceIsNormalised(qcomp fid, const char* caller); // may modify mag
/*
* QUREG MODIFICATION
*/
void validate_quregRenormProbIsNotZero(qreal prob, const char* caller);
void validate_numInitRandomPureStates(qindex numPureStates, const char* caller);
/*
* EXPECTATION VALUES
*/
void validate_expecPauliStrValueIsReal(qcomp value, bool isDensMatr, const char* caller);
void validate_expecPauliStrSumValueIsReal(qcomp value, bool isDensMatr, const char* caller);
void validate_densMatrExpecDiagMatrValueIsReal(qcomp value, qcomp exponent, const char* caller);
/*
* PARTIAL TRACE
*/
void validate_quregCanBeReduced(Qureg qureg, int numTraceQubits, const char* caller);
void validate_quregCanBeSetToReducedDensMatr(Qureg out, Qureg in, int numTraceQubits, const char* caller);
/*
* FILE IO
*/
void validate_canReadFile(string fn, const char* caller);
/*
* TEMPORARY ALLOCATIONS
*/
void validate_tempAllocSucceeded(bool succeeded, qindex numElems, qindex numBytesPerElem, const char* caller);
/*
* ENVIRONMENT VARIABLES
*/
void validate_envVarPermitNodesToShareGpu(string varValue, const char* caller);
void validate_envVarDefaultValidationEpsilon(string varValue, const char* caller);
#endif // VALIDATION_HPP