31#if !defined(DISABLE_DEPRECATION_WARNINGS) || DISABLE_DEPRECATION_WARNINGS == 0
35Deprecated functions have been included in compilation. The QuEST v3 API will be attemptedly \
36automatically substituted for the v4 API, although some uses of the old API will still fail to \
37compile. For example, access to v3 struct fields (e.g. 'ComplexMatrixN.real[0][0]') must be \
38manually replaced with v4 struct fields (e.g. 'CompMatr.cpuElems[0][0]'), though new v4 functions \
39make struct field access mostly redundant (e.g. via 'setCompMatr()'). Even when successfully \
40compiling, use of the deprecated v3 functions is dangerous; these are not unit-tested, and the \
41auto-porting to v4 may introduce new bugs. As such, you should only use this facility to help \
42refactor your code to v4, and should absolutely not continue to use the old v3 API for simulation."
62#define _EFFECT_PRAGMA(cmd) _Pragma(#cmd)
64#if DISABLE_DEPRECATION_WARNINGS
66 #define _WARN_TYPE_RENAMED(oldname, newname)
68 #define _WARN_FUNC_RENAMED(oldname, newname)
70 #define _WARN_FUNC_NOW_HAS_FEWER_ARGS(oldsig, newsig)
72 #define _WARN_GENERAL_MSG(msg)
76 #define _WARN_TYPE_RENAMED(oldname, newname) \
77 _EFFECT_PRAGMA(message( \
78 "The QuEST type '" oldname "' is deprecated. " \
79 "Please instead use '" newname "' which has been automatically invoked."))
81 #define _WARN_FUNC_RENAMED(oldname, newname) \
82 _EFFECT_PRAGMA(message( \
83 "The QuEST function '" oldname "' is deprecated. " \
84 "Please instead use '" newname "' which has been automatically invoked."))
86 #define _WARN_FUNC_NOW_HAS_FEWER_ARGS(oldsig, newsig) \
87 _EFFECT_PRAGMA(message( \
88 "The QuEST function '" oldsig "' now accepts fewer arguments, and has " \
89 "new signature '" newsig "' which has been automatically invoked."))
91 #define _WARN_GENERAL_MSG(msg) \
92 _EFFECT_PRAGMA(message(msg))
105#define _WARN_UNSUPPRESSABLE_MSG(msg) \
106 _EFFECT_PRAGMA(message(msg))
125#define _FORCE_COMPILATION_TO_FAIL() \
126 _FORCING_UNKNOWN_SYMBOL_ERROR_TO_STOP_COMPILATION
129#define _ERROR_GENERAL_MSG(msg) \
130 _EFFECT_PRAGMA(message(msg)) \
131 _FORCE_COMPILATION_TO_FAIL()
134#define _ERROR_FUNC_RENAMED(oldname, newfunc) \
135 _ERROR_GENERAL_MSG( \
136 "The QuEST function '" oldname "' is deprecated. " \
137 "Please instead use '" newfunc "' which could not here be automatically invoked.") \
138 _FORCE_COMPILATION_TO_FAIL()
141#define _ERROR_FUNC_REMOVED(oldname) \
142 _ERROR_GENERAL_MSG( \
143 "The QuEST function '" oldname "' is deprecated, and has no replacement.") \
144 _FORCE_COMPILATION_TO_FAIL()
147#define _ERROR_PREPROCESSOR_RENAMED(oldname, newname) \
148 _ERROR_GENERAL_MSG( \
149 "The QuEST preprocessor '" oldname "' is deprecated. " \
150 "Please instead use '" newname "' which could not here be automatically invoked.") \
151 _FORCE_COMPILATION_TO_FAIL()
154#define _ERROR_PREPROCESSOR_REMOVED(oldname) \
155 _ERROR_GENERAL_MSG( \
156 "The QuEST preprocessor '" oldname "' is deprecated, and has no replacement.") \
157 _FORCE_COMPILATION_TO_FAIL()
160#define _ERROR_PHASE_FUNC_REMOVED(oldname) \
161 _ERROR_GENERAL_MSG( \
162 "The QuEST function '" oldname "' is deprecated. Please instead create a 'DiagMatr' or 'FullStateDiagMatr', initialise it " \
163 "via functions like 'setDiagMatrFromMultiVarFunc()' or 'setDiagMatrFromMultiDimLists()', and apply it via 'applyDiagMatr() or " \
164 "'applyFullStateDiagMatr()'. This procedure cannot be automatically performed here." ) \
165 _FORCE_COMPILATION_TO_FAIL()
177#define REAL_STRING_FORMAT \
178 _ERROR_PREPROCESSOR_RENAMED("REAL_STRING_FORMAT", "QREAL_FORMAT_SPECIFIER")
180#define REAL_QASM_FORMAT \
181 _ERROR_PREPROCESSOR_REMOVED("REAL_QASM_FORMAT")
183#define MPI_QuEST_REAL \
184 _ERROR_PREPROCESSOR_REMOVED("MPI_QuEST_REAL")
186#define MPI_MAX_AMPS_IN_MSG \
187 _ERROR_PREPROCESSOR_REMOVED("MPI_MAX_AMPS_IN_MSG")
190 _ERROR_PREPROCESSOR_REMOVED("REAL_EPS")
192#define REAL_SPECIFIER \
193 _ERROR_PREPROCESSOR_REMOVED("REAL_SPECIFIER")
195#define absReal(...) \
196 _ERROR_PREPROCESSOR_REMOVED("absReal()")
236#define ComplexMatrix2 \
238 "The QuEST type 'ComplexMatrix2' is deprecated in favour of 'CompMatr1' which has a different memory layout. We will attempt to " \
239 "automatically replace your 'ComplexMatrix2' with a 'CompMatr1' instance in subsequently invoked functions.") \
242#define ComplexMatrix4 \
244 "The QuEST type 'ComplexMatrix4' is deprecated in favour of 'CompMatr2' which has a different memory layout. We will attempt to " \
245 "automatically replace your 'ComplexMatrix4' with a 'CompMatr2' instance in subsequently invoked functions.") \
252#define _GET_COMP_MATR_1_FROM_COMPLEX_MATRIX_2(m) \
257 {getQcomp(m.real[0][0], m.imag[0][0]), getQcomp(m.real[0][1], m.imag[0][1])}, \
258 {getQcomp(m.real[1][0], m.imag[1][0]), getQcomp(m.real[1][1], m.imag[1][1])}}}
260#define _GET_COMP_MATR_2_FROM_COMPLEX_MATRIX_4(m) \
265 {getQcomp(m.real[0][0], m.imag[0][0]), getQcomp(m.real[0][1], m.imag[0][1]), getQcomp(m.real[0][2], m.imag[0][2]), getQcomp(m.real[0][3], m.imag[0][3])}, \
266 {getQcomp(m.real[1][0], m.imag[1][0]), getQcomp(m.real[1][1], m.imag[1][1]), getQcomp(m.real[1][2], m.imag[1][2]), getQcomp(m.real[1][3], m.imag[1][3])}, \
267 {getQcomp(m.real[2][0], m.imag[2][0]), getQcomp(m.real[2][1], m.imag[2][1]), getQcomp(m.real[2][2], m.imag[2][2]), getQcomp(m.real[2][3], m.imag[2][3])}, \
268 {getQcomp(m.real[3][0], m.imag[3][0]), getQcomp(m.real[3][1], m.imag[3][1]), getQcomp(m.real[3][2], m.imag[3][2]), getQcomp(m.real[3][3], m.imag[3][3])}}}
276enum pauliOpType {PAULI_I=0, PAULI_X=1, PAULI_Y=2, PAULI_Z=3};
278#define _WARN_DEPRECATED_PAULI_ENUM(enum, intcode, char1, char2, char3) \
280 "The QuEST enum '" #enum "' is deprecated, although has been defined in the deprecation header for convenience. " \
281 "Please instead use integer " #intcode " or characters '" #char1 "', '" #char2 "', '" #char3 "'.") \
283typedef enum pauliOpType _NoWarnPauliOpType;
286 _WARN_GENERAL_MSG("The QuEST type 'enum pauliOpType' is deprecated, although it is still defined in the deprecation header for convenience.") \
290 _WARN_DEPRECATED_PAULI_ENUM(PAULI_I, 0, I, i, 0) \
294 _WARN_DEPRECATED_PAULI_ENUM(PAULI_X, 1, X, x, 1) \
298 _WARN_DEPRECATED_PAULI_ENUM(PAULI_Y, 2, Y, y, 2) \
302 _WARN_DEPRECATED_PAULI_ENUM(PAULI_Z, 3, Z, z, 3) \
312#define _GET_QCOMP_FROM_COMPLEX_STRUCT(x) \
313 getQcomp((x).real, (x).imag)
317 "The QuEST type 'Complex' is deprecated, and replaced with complex scalar primitive 'qcomp' which can be instantiated " \
318 "with literals and modified with overloaded arithmetic operators. References to 'Complex' will be automatically replaced " \
319 "with an anonymous inline struct, though the QuEST will only ever return 'qcomp' instances.") \
320 struct { qreal real; qreal imag; }
323#define ComplexMatrixN \
324 _WARN_TYPE_RENAMED("ComplexMatrixN", "CompMatr") \
329 _WARN_TYPE_RENAMED("PauliHamil", "PauliStrSum") \
334 _WARN_TYPE_RENAMED("DiagonalOp", "FullStateDiagMatr") \
338#define SubDiagonalOp \
339 _WARN_TYPE_RENAMED("SubDiagonalOp", "DiagMatr") \
344 _WARN_GENERAL_MSG("The QuEST type 'Vector' is deprecated, and will be automatically replaced with an inline struct.") \
345 struct { qreal x; qreal y; qreal z; }
349 _ERROR_GENERAL_MSG( \
350 "The QuEST type 'enum phaseFunc' is deprecated. The functions which replace the 'applyPhaseFunc' family, such as " \
351 "'setDiagMatrFromMultiVarFunc()' and 'setDiagMatrFromMultiDimArray()', do not use pre-defined enums." )
354 _ERROR_GENERAL_MSG( \
355 "The QuEST type 'enum bitEncoding' is deprecated. The new v4 function 'setDiagMatrFromMultiVarFunc()' instead accepts " \
356 "an int flag to indicate whether (1) or not (0) to interpret the basis state bits under two's complement singed encoding." )
365#define toComplex(...) \
366 _ERROR_FUNC_REMOVED("toComplex()")
368#define fromComplex(...) \
369 _ERROR_FUNC_REMOVED("fromComplex()")
372#define applyMultiControlledMatrixN(...) \
373 _ERROR_FUNC_REMOVED("applyMultiControlledMatrixN()")
376#define syncQuESTSuccess(...) \
377 _ERROR_FUNC_REMOVED("syncQuESTSuccess()")
380#define startRecordingQASM(...) \
381 _ERROR_FUNC_REMOVED("startRecordingQASM()")
383#define stopRecordingQASM(...) \
384 _ERROR_FUNC_REMOVED("stopRecordingQASM()")
386#define clearRecordedQASM(...) \
387 _ERROR_FUNC_REMOVED("clearRecordedQASM()")
389#define printRecordedQASM(...) \
390 _ERROR_FUNC_REMOVED("printRecordedQASM()")
392#define writeRecordedQASMToFile(...) \
393 _ERROR_FUNC_REMOVED("writeRecordedQASMToFile()")
396#define bindArraysToStackComplexMatrixN(...) \
397 _ERROR_FUNC_REMOVED("bindArraysToStackComplexMatrixN()")
399#define getStaticComplexMatrixN(...) \
400 _ERROR_FUNC_REMOVED("getStaticComplexMatrixN()")
403#define reportState(qureg) \
404 _ERROR_FUNC_REMOVED("reportState(qureg)", "reportQuregToFile(qureg, char* fn)")
413#define initComplexMatrixN(...) \
414 _ERROR_FUNC_RENAMED("initComplexMatrixN(ComplexMatrixN, qreal[][], qreal[][])", "setCompMatr(CompMatr, qcomp[][])")
417#define createPauliHamil(...) \
418 _ERROR_FUNC_RENAMED( \
419 "createPauliHamil(int numQubits, int numTerms)", \
420 "createPauliStrSum(PauliStr* strings, qcomp* coeffs, qindex numTerms)")
422#define initPauliHamil(...) \
423 _ERROR_FUNC_RENAMED( \
424 "initPauliHamil(PauliHamil hamil, qreal* coeffs, enum pauliOpType* codes)", \
425 "createPauliStrSum(PauliStr* strings, qcomp* coeffs, qindex numTerms)")
428#define initDiagonalOp(...) \
429 _ERROR_FUNC_RENAMED( \
430 "initDiagonalOp(DiagonalOp obj, qreal* allElemsRe, qreal* allElemsIm)", \
431 "setFullStateDiagMatr(FullStateDiagMatr obj, qindex startInd, qcomp* someElems, qindex numElems)")
433#define setDiagonalOpElems(...) \
434 _ERROR_FUNC_RENAMED( \
435 "setDiagonalOpElems(DiagonalOp, qindex, qreal*, qreal*, qindex)", \
436 "setFullStateDiagMatr(FullStateDiagMatr, qindex, qcomp*, qindex)")
439#define initStateFromAmps(...) \
440 _ERROR_FUNC_RENAMED("initStateFromAmps(Qureg, qreal*, qreal*)", "initArbitraryPureState(Qureg, qcomp*)")
442#define setAmps(...) \
443 _ERROR_FUNC_RENAMED("setAmps(Qureg, qindex, qreal*, qreal*, qindex)", "setQuregAmps(Qureg, qindex, qcomp*, qindex)")
445#define setDensityAmps(...) \
446 _ERROR_FUNC_RENAMED( \
447 "setDensityAmps(Qureg, qindex startRow, qindex startCol, qreal* flatAmpsRe, qreal* flatAmpsIm, qindex numFlatAmps)", \
448 "setDensityQuregAmps(Qureg, qindex startRow, qindex startCol, qcomp** amps, qindex numRows, qindex numCols)")
451#define getQuESTSeeds(...) \
452 _ERROR_GENERAL_MSG( \
453 "The QuEST function 'getQuESTSeeds(QuESTEnv env, unsigned long int* out, int numOut)' has been deprecated. " \
454 "Please instead use 'getSeeds(unsigned* out)' which accepts a pointer to pre-allocated memory of length " \
455 "equal to that returned by 'getNumSeeds()'. We cannot automatically invoke this replacement routine." )
458#define applyPhaseFunc(...) \
459 _ERROR_PHASE_FUNC_REMOVED("applyPhaseFunc")
461#define applyPhaseFuncOverrides(...) \
462 _ERROR_PHASE_FUNC_REMOVED("applyPhaseFuncOverrides")
464#define applyMultiVarPhaseFunc(...) \
465 _ERROR_PHASE_FUNC_REMOVED("applyMultiVarPhaseFunc")
467#define applyMultiVarPhaseFuncOverrides(...) \
468 _ERROR_PHASE_FUNC_REMOVED("applyMultiVarPhaseFuncOverrides")
470#define applyNamedPhaseFunc(...) \
471 _ERROR_PHASE_FUNC_REMOVED("applyNamedPhaseFunc")
473#define applyNamedPhaseFuncOverrides(...) \
474 _ERROR_PHASE_FUNC_REMOVED("applyNamedPhaseFuncOverrides")
476#define applyParamNamedPhaseFunc(...) \
477 _ERROR_PHASE_FUNC_REMOVED("applyParamNamedPhaseFunc")
479#define applyParamNamedPhaseFuncOverrides(...) \
480 _ERROR_PHASE_FUNC_REMOVED("applyParamNamedPhaseFuncOverrides")
495#define _GET_MACRO_WITH_1_OR_2_ARGS(_1, _2, macroname, ...) macroname
497#define _CALL_MACRO_WITH_1_OR_2_ARGS(prefix, ...) \
498 _GET_MACRO_WITH_1_OR_2_ARGS(__VA_ARGS__, prefix##_2, prefix##_1)(__VA_ARGS__)
501#define _CREATE_QUREG_1(n) \
504#define _CREATE_QUREG_2(n, env) \
505 _WARN_FUNC_NOW_HAS_FEWER_ARGS("createQureg(int, QuESTEnv)", "createQureg(int)") \
508#define createQureg(...) \
509 _CALL_MACRO_WITH_1_OR_2_ARGS(_CREATE_QUREG, __VA_ARGS__)
513#define _CREATE_DENSITY_QUREG_1(n) \
514 createDensityQureg(n)
516#define _CREATE_DENSITY_QUREG_2(n, env) \
517 _WARN_FUNC_NOW_HAS_FEWER_ARGS("createDensityQureg(int, QuESTEnv)", "createDensityQureg(int)") \
518 _CREATE_DENSITY_QUREG_1(n)
520#define createDensityQureg(...) \
521 _CALL_MACRO_WITH_1_OR_2_ARGS(_CREATE_DENSITY_QUREG, __VA_ARGS__)
525#define _CREATE_CLONE_QUREG_1(n) \
528#define _CREATE_CLONE_QUREG_2(n, env) \
529 _WARN_FUNC_NOW_HAS_FEWER_ARGS("createCloneQureg(Qureg, QuESTEnv)", "createCloneQureg(Qureg)") \
530 _CREATE_CLONE_QUREG_1(n)
532#define createCloneQureg(...) \
533 _CALL_MACRO_WITH_1_OR_2_ARGS(_CREATE_CLONE_QUREG, __VA_ARGS__)
537#define _DESTROY_QUREG_1(qureg) \
540#define _DESTROY_QUREG_2(n, env) \
541 _WARN_FUNC_NOW_HAS_FEWER_ARGS("destroyQureg(Qureg, QuESTEnv)", "destroyQureg(Qureg)") \
544#define destroyQureg(...) \
545 _CALL_MACRO_WITH_1_OR_2_ARGS(_DESTROY_QUREG, __VA_ARGS__)
549#define _GET_ENVIRONMENT_STRING_1(str) \
550 getEnvironmentString(str)
552#define _GET_ENVIRONMENT_STRING_2(str) \
553 _WARN_FUNC_NOW_HAS_FEWER_ARGS("getEnvironmentString(QuESTEnv, char[200])", "getEnvironmentString(char[200])") \
554 _GET_ENVIRONMENT_STRING_1(str)
556#define getEnvironmentString(...) \
557 _CALL_MACRO_WITH_1_OR_2_ARGS(_GET_ENVIRONMENT_STRING, __VA_ARGS__)
569#define _COUNT_ZERO_OR_ONE_ARGS(...) _COUNT_ZERO_OR_ONE_ARGS_INNER(__VA_ARGS__, 1, 0,)
570#define _COUNT_ZERO_OR_ONE_ARGS_INNER(_0, _1, X, ...) X
571#define _CONCAT_SYMBOLS(A, B) _CONCAT_SYMBOLS_INNER(A, B)
572#define _CONCAT_SYMBOLS_INNER(A, B) A ## B
573#define _COMMA_SEPERATOR ,
577#define _SYNC_QUEST_ENV_0(_) \
580#define _SYNC_QUEST_ENV_1(env) \
581 _WARN_FUNC_NOW_HAS_FEWER_ARGS("syncQuESTEnv(QuESTEnv)", "syncQuESTEnv()") \
584#define syncQuESTEnv(X) \
585 _CONCAT_SYMBOLS(_SYNC_QUEST_ENV_, _COUNT_ZERO_OR_ONE_ARGS(_COMMA_SEPERATOR ## X))(X)
589#define _REPORT_QUEST_ENV_0(_) \
592#define _REPORT_QUEST_ENV_1(env) \
593 _WARN_FUNC_NOW_HAS_FEWER_ARGS("reportQuESTEnv(QuESTEnv)", "reportQuESTEnv()") \
596#define reportQuESTEnv(X) \
597 _CONCAT_SYMBOLS(_REPORT_QUEST_ENV_, _COUNT_ZERO_OR_ONE_ARGS(_COMMA_SEPERATOR ## X))(X)
613#define _MIX_KRAUS_MAP_INNER(qureg, ops, numOps, targs, numTargs) \
614 int dim = 1 << numTargs; \
615 qcomp*** ptrs = (qcomp***) malloc(numOps * sizeof *ptrs); \
616 for (int n=0; n<numOps; n++) { \
617 ptrs[n] = (qcomp**) malloc(dim * sizeof **ptrs); \
618 for (int r=0; r<dim; r++) { \
619 ptrs[n][r] = (qcomp*) malloc(dim * sizeof ***ptrs); \
620 for (int c=0; c<dim; c++) \
621 ptrs[n][r][c] = getQcomp(ops[n].real[r][c], ops[n].imag[r][c]); \
625 KrausMap map = createKrausMap(numTargs, numOps); \
626 setKrausMap(map, ptrs); \
627 (mixKrausMap)(qureg, (targs), numTargs, map); \
628 destroyKrausMap(map); \
630 for (int n=0; n<numOps; n++) { \
631 for (int r=0; r<dim; r++) \
638 _MIX_KRAUS_MAP_INNER(qureg, ops, numOps, &targ, 1);
641#define mixKrausMap(...) \
642 _WARN_UNSUPPRESSABLE_MSG( \
643 "The QuEST function 'mixKrausMap()' has changed from v3 to v4. The old signature was " \
644 "'mixKrausMap(Qureg, int targ, ComplexMatrix2* ops, int numOps)' while the new signature is " \
645 "'mixKrausMap(Qureg, int* targs, int numTargs, KrausMap)'. Because the function name and its " \
646 "number of arguments have not changed, we are unable to automatically map a v3 invocation to " \
647 "the v4 API, nor can we detect when the v4 API has been used in order to avoid this message. " \
648 "Hence, this warning will either be obsolete (because you have already migrated to the v4 API), " \
649 "or precedes a compilation failure below due to continued use of the v3 API. To continue using " \
650 "the v3 API, replace 'mixKrausMap' with 'v3_mixKrausMap' which will issue no warning nor error. " \
651 "This warning cannot be suppressed.") \
652 mixKrausMap(__VA_ARGS__)
661 _MIX_KRAUS_MAP_INNER(qureg, ops, numOps, &targ, 1);
665#define mixNonTPKrausMap(...) \
666 _WARN_FUNC_RENAMED( \
667 "mixNonTPKrausMap(Qureg, int targ, ComplexMatrix2* ops, int numOps)", \
668 "mixUnnormalizedKrausMap(Qureg, int* targs, int numTargs, KrausMap)") \
669 _mixNonTPKrausMap(__VA_ARGS__)
673static inline void _mixTwoQubitKrausMap(
Qureg qureg,
int targ1,
int targ2,
_NoWarnComplexMatrix4 *ops,
int numOps,
int isNonCPTP) {
674 int targs[] = {targ1, targ2};
677 _MIX_KRAUS_MAP_INNER(qureg, ops, numOps, targs, 2);
681#define mixTwoQubitKrausMap(...) \
682 _WARN_FUNC_RENAMED( \
683 "mixTwoQubitKrausMap(Qureg, int targ1, int targ2, ComplexMatrix4* ops, int numOps)", \
684 "mixKrausMap(Qureg, int* targs, int numTargs, KrausMap)") \
685 _mixTwoQubitKrausMap(__VA_ARGS__, 0)
687#define mixNonTPTwoQubitKrausMap(...) \
688 _WARN_FUNC_RENAMED( \
689 "mixNonTPTwoQubitKrausMap(Qureg, int targ1, int targ2, ComplexMatrix4* ops, int numOps)", \
690 "mixUnnormalizedKrausMap(Qureg, int* targs, int numTargs, KrausMap)") \
691 _mixTwoQubitKrausMap(__VA_ARGS__, 1)
695static inline void _mixMultiQubitKrausMap(
Qureg qureg,
int* targs,
int numTargs,
CompMatr *ops,
int numOps,
int isNonCPTP) {
697 qcomp*** ptrs = (qcomp***) malloc(numOps *
sizeof *ptrs);
698 for (
int n=0; n<numOps; n++)
699 ptrs[n] = ops[n].cpuElems;
712#define mixMultiQubitKrausMap(...) \
713 _WARN_FUNC_RENAMED( \
714 "mixMultiQubitKrausMap(Qureg, int* targs, int numTargs, ComplexMatrixN* ops, int numOps)", \
715 "mixKrausMap(Qureg, int* targs, int numTargs, KrausMap)") \
716 _mixMultiQubitKrausMap(__VA_ARGS__, 0)
718#define mixNonTPMultiQubitKrausMap(...) \
719 _WARN_FUNC_RENAMED( \
720 "mixNonTPMultiQubitKrausMap(Qureg, int* targs, int numTargs, ComplexMatrixN* ops, int numOps)", \
721 "mixUnnormalisedKrausMap(Qureg, int* targs, int numTargs, KrausMap)") \
722 _mixMultiQubitKrausMap(__VA_ARGS__, 1)
737static inline QuESTEnv _createQuESTEnv() {
742#define createQuESTEnv() \
744 "The QuEST function 'createQuESTEnv()' is deprecated in favour of " \
745 "'initQuESTEnv()' which returns nothing, and 'getQuESTEnv()' which " \
746 "returns an immutable copy of the internally-managed environment. " \
747 "This second function is for convenience; the API no longer needs " \
748 "to receive the environment instance as a parameter. The above " \
749 "mentioned functions have been automatically invoked.") \
752#define destroyQuESTEnv(...) \
753 _WARN_FUNC_RENAMED("destroyQuESTEnv(QuESTEnv)", "finalizeQuESTEnv()") \
758#define createComplexMatrixN(...) \
759 _WARN_FUNC_RENAMED("createComplexMatrixN()", "createCompMatr()") \
760 createCompMatr(__VA_ARGS__)
762#define destroyComplexMatrixN(...) \
763 _WARN_FUNC_RENAMED("destroyComplexMatrixN()", "destroyCompMatr()") \
764 destroyCompMatr(__VA_ARGS__)
768#define destroyPauliHamil(...) \
769 _WARN_FUNC_RENAMED("destroyPauliHamil()", "destroyPauliStrSum()") \
770 destroyPauliStrSum(__VA_ARGS__)
772#define createPauliHamilFromFile(...) \
773 _WARN_FUNC_RENAMED("createPauliHamilFromFile()", "createPauliStrSumFromReversedFile()") \
774 createPauliStrSumFromReversedFile(__VA_ARGS__)
776#define reportPauliHamil(...) \
777 _WARN_FUNC_RENAMED("reportPauliHamil()", "reportPauliStrSum()") \
778 reportPauliStrSum(__VA_ARGS__)
782#define createDiagonalOp(numQb, env) \
783 _WARN_FUNC_RENAMED("createDiagonalOp(int, QuESTEnv)", "createFullStateDiagMatr(int)") \
784 createFullStateDiagMatr(numQb)
786#define destroyDiagonalOp(diagOp, env) \
787 _WARN_FUNC_RENAMED("destroyDiagonalOp(DiagonalOp, QuESTEnv)", "destroyFullStateDiagMatr(FullStateDiagMatr)") \
788 destroyFullStateDiagMatr(diagOp)
790#define syncDiagonalOp(...) \
791 _WARN_FUNC_RENAMED("syncDiagonalOp()", "syncFullStateDiagMatr()") \
792 syncFullStateDiagMatr(__VA_ARGS__)
794#define initDiagonalOpFromPauliHamil(...) \
795 _WARN_FUNC_RENAMED("initDiagonalOpFromPauliHamil()", "setFullStateDiagMatrFromPauliStrSum()") \
796 setFullStateDiagMatrFromPauliStrSum(__VA_ARGS__)
798#define createDiagonalOpFromPauliHamilFile(fn, env) \
799 _WARN_FUNC_RENAMED("createDiagonalOpFromPauliHamilFile(char*, QuESTEnv)", "createFullStateDiagMatrFromPauliStrSumFile(char*)") \
800 createFullStateDiagMatrFromPauliStrSumFile(fn)
802#define applyDiagonalOp(...) \
803 _WARN_FUNC_RENAMED("applyDiagonalOp()", "leftapplyFullStateDiagMatr()") \
804 leftapplyFullStateDiagMatr(__VA_ARGS__)
806#define calcExpecDiagonalOp(...) \
807 _WARN_FUNC_RENAMED("calcExpecDiagonalOp()", "calcExpecNonHermitianFullStateDiagMatr()") \
808 calcExpecNonHermitianFullStateDiagMatr(__VA_ARGS__)
812#define createSubDiagonalOp(...) \
813 _WARN_FUNC_RENAMED("createSubDiagonalOp()", "createDiagMatr()") \
814 createDiagMatr(__VA_ARGS__)
816#define destroySubDiagonalOp(...) \
817 _WARN_FUNC_RENAMED("destroySubDiagonalOp()", "destroyDiagMatr()") \
818 destroyDiagMatr(__VA_ARGS__)
820#define diagonalUnitary(...) \
821 _WARN_FUNC_RENAMED("diagonalUnitary()", "applyDiagMatr()") \
822 applyDiagMatr(__VA_ARGS__)
824#define applySubDiagonalOp(...) \
825 _WARN_FUNC_RENAMED("applySubDiagonalOp()", "leftapplyDiagMatr()") \
826 leftapplyDiagMatr(__VA_ARGS__)
828static inline void _applyGateSubDiagonalOp(
Qureg qureg,
int* targets,
int numTargets,
DiagMatr op) {
834#define applyGateSubDiagonalOp(...) \
836 "The QuEST function 'applyGateSubDiagonalOp()' is deprecated. To achieve the same thing, disable " \
837 "numerical validation via 'setValidationEpsilon(0)' before calling 'applyDiagMatr()'. You can " \
838 "save the existing epsilon via 'getValidationEpsilon()' to thereafter restore. This procedure " \
839 "has been performed here automatically.") \
840 _applyGateSubDiagonalOp(__VA_ARGS__)
844#define reportStateToScreen(qureg, env, rank) \
845 _WARN_FUNC_RENAMED("reportStateToScreen(qureg, env, rank)", "reportQureg(qureg)") \
850#define getNumQubits(qureg) \
851 _WARN_FUNC_RENAMED("getNumQubits(qureg)", "qureg.numQubits") \
854 #define getNumAmps(qureg) \
855 _WARN_FUNC_RENAMED("getNumAmps(qureg)", "qureg.numAmps") \
860#define setQuregToPauliHamil(...) \
861 _WARN_FUNC_RENAMED("setQuregToPauliHamil()", "setQuregToPauliStrSum()") \
862 setQuregToPauliStrSum(__VA_ARGS__)
864#define cloneQureg(...) \
865 _WARN_FUNC_RENAMED("cloneQureg()", "setQuregToClone()") \
866 setQuregToClone(__VA_ARGS__)
870static inline void _setWeightedQureg(qcomp f1,
Qureg q1, qcomp f2,
Qureg q2, qcomp fOut,
Qureg qOut) {
871 qcomp coeffs[] = {fOut, f1, f2};
872 Qureg quregs[] = {qOut, q1, q2};
876#define setWeightedQureg(f1, q1, f2, q2, fOut, qOut) \
878 "The QuEST function 'setWeightedQureg(f1,q1, f2,q2, fOut,qOut)' is deprecated, and replaced with " \
879 "'setQuregToWeightedSum(qOut, {f1,f2,...}, {q1,q2,..}, len)' which has been automatically invoked. " \
880 "Beware that the order of the arguments has changed, so that the first supplied Qureg is modified." ) \
882 _GET_QCOMP_FROM_COMPLEX_STRUCT(f1) ,q1, \
883 _GET_QCOMP_FROM_COMPLEX_STRUCT(f2) ,q2, \
884 _GET_QCOMP_FROM_COMPLEX_STRUCT(fOut), qOut)
888#define phaseShift(...) \
889 _WARN_FUNC_RENAMED("phaseShift()", "applyPhaseShift()") \
890 applyPhaseShift(__VA_ARGS__)
892#define controlledPhaseShift(...) \
893 _WARN_FUNC_RENAMED("controlledPhaseShift()", "applyTwoQubitPhaseShift()") \
894 applyTwoQubitPhaseShift(__VA_ARGS__)
896#define multiControlledPhaseShift(...) \
897 _WARN_FUNC_RENAMED("multiControlledPhaseShift()", "applyMultiQubitPhaseShift()") \
898 applyMultiQubitPhaseShift(__VA_ARGS__)
900#define controlledPhaseFlip(...) \
901 _WARN_FUNC_RENAMED("controlledPhaseFlip()", "applyTwoQubitPhaseFlip()") \
902 applyTwoQubitPhaseFlip(__VA_ARGS__)
904#define multiControlledPhaseFlip(...) \
905 _WARN_FUNC_RENAMED("multiControlledPhaseFlip()", "applyMultiQubitPhaseFlip()") \
906 applyMultiQubitPhaseFlip(__VA_ARGS__)
911 _WARN_FUNC_RENAMED("sGate()", "applyS()") \
915 _WARN_FUNC_RENAMED("tGate()", "applyT()") \
920#define copyStateToGPU(...) \
921 _WARN_FUNC_RENAMED("copyStateToGPU()", "syncQuregToGpu()") \
922 syncQuregToGpu(__VA_ARGS__)
924#define copyStateFromGPU(...) \
925 _WARN_FUNC_RENAMED("copyStateFromGPU()", "syncQuregFromGpu()") \
926 syncQuregFromGpu(__VA_ARGS__)
928#define copySubstateToGPU(...) \
929 _WARN_FUNC_RENAMED("copySubstateToGPU()", "syncSubQuregToGpu()") \
930 syncSubQuregToGpu(__VA_ARGS__)
932#define copySubstateFromGPU(...) \
933 _WARN_FUNC_RENAMED("copySubstateFromGPU()", "syncSubQuregFromGpu()") \
934 syncSubQuregFromGpu(__VA_ARGS__)
939 _WARN_FUNC_RENAMED("getAmp()", "getQuregAmp()") \
940 getQuregAmp(__VA_ARGS__)
942#define getDensityAmp(...) \
943 _WARN_FUNC_RENAMED("getDensityAmp()", "getDensityQuregAmp()") \
944 getDensityQuregAmp(__VA_ARGS__)
946#define getRealAmp(...) \
947 _WARN_FUNC_RENAMED("getRealAmp()", "real(getQuregAmp())") \
948 real(getQuregAmp(__VA_ARGS__))
950#define getImagAmp(...) \
951 _WARN_FUNC_RENAMED("getImagAmp()", "imag(getImagAmp())") \
952 imag(getQuregAmp(__VA_ARGS__))
954#define getProbAmp(...) \
955 _WARN_FUNC_RENAMED("getProbAmp()", "calcProbOfBasisState()") \
956 calcProbOfBasisState(__VA_ARGS__)
958#define calcProbOfOutcome(...) \
959 _WARN_FUNC_RENAMED("calcProbOfOutcome()", "calcProbOfQubitOutcome()") \
960 calcProbOfQubitOutcome(__VA_ARGS__)
962#define calcProbOfAllOutcomes(...) \
963 _WARN_FUNC_RENAMED("calcProbOfAllOutcomes()", "calcProbsOfAllMultiQubitOutcomes()") \
964 calcProbsOfAllMultiQubitOutcomes(__VA_ARGS__)
966#define calcDensityInnerProduct(...) \
967 _WARN_FUNC_RENAMED("calcDensityInnerProduct()", "calcInnerProduct()") \
968 calcInnerProduct(__VA_ARGS__)
970#define calcHilbertSchmidtDistance(...) \
971 _WARN_FUNC_RENAMED("calcHilbertSchmidtDistance()", "calcDistance()") \
972 calcDistance(__VA_ARGS__)
974#define calcExpecPauliHamil(qureg, hamil, workspace) \
975 _WARN_FUNC_RENAMED("calcExpecPauliHamil(Qureg, PauliHamil, Qureg)", "calcExpecPauliStrSum(Qureg, PauliStrSum)") \
976 calcExpecPauliStrSum(qureg, hamil)
980static inline qreal _calcExpecPauliStr(
Qureg qureg,
int* targs, _NoWarnPauliOpType* enums,
int numTargs) {
983 for (
int i=0; i<numTargs && i<100; i++)
989#define calcExpecPauliProd(qureg, targs, paulis, numTargs, workspace) \
990 _WARN_FUNC_RENAMED( \
991 "calcExpecPauliProd(qureg, targs, paulis, numTargs, workspace)", \
992 "calcExpecPauliStr(qureg, getPauliStr(paulis, targs, numTargs))") \
993 _calcExpecPauliStr(qureg, targs, paulis, numTargs)
997static inline PauliStrSum _createPauliStrSumFromCodes(
int numQubits, _NoWarnPauliOpType* allPauliCodes, qreal* termCoeffs,
int numTerms) {
999 int* targs = (
int*) malloc(numQubits *
sizeof *targs);
1000 for (
int i=0; i<numQubits; i++)
1004 for (
int i=0; i<numTerms; i++) {
1007 for (
int j=0; j<numQubits && j<100; j++)
1008 codes[j] = (
int) allPauliCodes[i*numQubits+j];
1010 strings[i] =
getPauliStr(codes, targs, numQubits);
1013 qcomp* coeffs = (qcomp*) malloc(numTerms *
sizeof *coeffs);
1014 for (
int i=0; i<numTerms; i++)
1015 coeffs[i] = termCoeffs[i];
1025static inline qreal _calcExpecPauliSum(
Qureg qureg, _NoWarnPauliOpType* allPauliCodes, qreal* termCoeffs,
int numTerms) {
1026 PauliStrSum sum = _createPauliStrSumFromCodes(qureg.numQubits, allPauliCodes, termCoeffs, numTerms);
1032#define calcExpecPauliSum(qureg, paulis, coeffs, numTerms, workspace) \
1033 _WARN_FUNC_RENAMED("calcExpecPauliSum(Qureg, ...)", "calcExpecPauliStrSum(Qureg, PauliStrSum)") \
1034 _calcExpecPauliSum(qureg, paulis, coeffs, numTerms)
1036static inline void _applyPauliSum(
Qureg inQureg, _NoWarnPauliOpType* allPauliCodes, qreal* termCoeffs,
int numSumTerms,
Qureg outQureg) {
1037 PauliStrSum sum = _createPauliStrSumFromCodes(inQureg.numQubits, allPauliCodes, termCoeffs, numSumTerms);
1043#define applyPauliSum(...) \
1044 _WARN_FUNC_RENAMED("applyPauliSum(inQureg, ..., outQureg)", "leftapplyPauliStrSum(outQureg, PauliStrSum)") \
1045 _applyPauliSum(__VA_ARGS__)
1052#define applyPauliHamil(...) \
1053 _WARN_FUNC_RENAMED("applyPauliHamil(inQureg, PauliHamil, outQureg)", "leftapplyPauliStrSum(qureg, PauliStrSum, workspace)") \
1054 _applyPauliHamil(__VA_ARGS__)
1058#define compactUnitary(q, t, a, b) \
1059 _WARN_FUNC_RENAMED( \
1060 "compactUnitary(qureg, t, a, b)", \
1061 "applyCompMatr1(qureg, t, getInlineCompMatr1({{a,-conj(b)},{b,conj(a)}}))") \
1062 applyCompMatr1(q, t, getInlineCompMatr1({ \
1063 {_GET_QCOMP_FROM_COMPLEX_STRUCT(a), - conj(_GET_QCOMP_FROM_COMPLEX_STRUCT(b))}, \
1064 {_GET_QCOMP_FROM_COMPLEX_STRUCT(b), conj(_GET_QCOMP_FROM_COMPLEX_STRUCT(a))}} ))
1066#define controlledCompactUnitary(q, c, t, a, b) \
1067 _WARN_FUNC_RENAMED( \
1068 "controlledCompactUnitary(qureg, c, t, a, b)", \
1069 "applyControlledCompMatr1(qureg, c, t, getInlineCompMatr1({{a,-conj(b)},{b,conj(a)}}))") \
1070 applyControlledCompMatr1(q, c, t, getInlineCompMatr1({ \
1071 {_GET_QCOMP_FROM_COMPLEX_STRUCT(a), - conj(_GET_QCOMP_FROM_COMPLEX_STRUCT(b))}, \
1072 {_GET_QCOMP_FROM_COMPLEX_STRUCT(b), conj(_GET_QCOMP_FROM_COMPLEX_STRUCT(a))}} ))
1076#define unitary(qureg, targ, ...) \
1077 _WARN_FUNC_RENAMED("unitary()", "applyCompMatr1()") \
1078 applyCompMatr1(qureg, targ, _GET_COMP_MATR_1_FROM_COMPLEX_MATRIX_2(__VA_ARGS__))
1080#define controlledUnitary(qureg, ctrl, targ, ...) \
1081 _WARN_FUNC_RENAMED("controlledUnitary()", "applyControlledCompMatr1()") \
1082 applyControlledCompMatr1(qureg, ctrl, targ, _GET_COMP_MATR_1_FROM_COMPLEX_MATRIX_2(__VA_ARGS__))
1084#define multiControlledUnitary(qureg, ctrls, numctrls, targ, ...) \
1085 _WARN_FUNC_RENAMED("multiControlledUnitary()", "applyMultiControlledCompMatr1()") \
1086 applyMultiControlledCompMatr1(qureg, ctrls, numctrls, targ, _GET_COMP_MATR_1_FROM_COMPLEX_MATRIX_2(__VA_ARGS__))
1088#define multiStateControlledUnitary(qureg, ctrls, states, numctrls, targ, ...) \
1089 _WARN_FUNC_RENAMED("multiStateControlledUnitary()", "applyMultiStateControlledCompMatr1()") \
1090 applyMultiStateControlledCompMatr1(qureg, ctrls, states, numctrls, targ, _GET_COMP_MATR_1_FROM_COMPLEX_MATRIX_2(__VA_ARGS__))
1092#define twoQubitUnitary(qureg, t1, t2, ...) \
1093 _WARN_FUNC_RENAMED("twoQubitUnitary()", "applyCompMatr2()") \
1094 applyCompMatr2(qureg, t1, t2, _GET_COMP_MATR_2_FROM_COMPLEX_MATRIX_4(__VA_ARGS__))
1096#define controlledTwoQubitUnitary(qureg, c, t1, t2, ...) \
1097 _WARN_FUNC_RENAMED("controlledTwoQubitUnitary()", "applyControlledCompMatr2()") \
1098 applyControlledCompMatr2(qureg, c, t1, t2, _GET_COMP_MATR_2_FROM_COMPLEX_MATRIX_4(__VA_ARGS__))
1100#define multiControlledTwoQubitUnitary(qureg, ctrls, nctrls, t1, t2, ...) \
1101 _WARN_FUNC_RENAMED("multiControlledTwoQubitUnitary()", "applyMultiControlledCompMatr2()") \
1102 applyMultiControlledCompMatr2(qureg, ctrls, nctrls, t1, t2, _GET_COMP_MATR_2_FROM_COMPLEX_MATRIX_4(__VA_ARGS__))
1104#define multiQubitUnitary(...) \
1105 _WARN_FUNC_RENAMED("multiQubitUnitary()", "applyCompMatr()") \
1106 applyCompMatr(__VA_ARGS__)
1108#define controlledMultiQubitUnitary(...) \
1109 _WARN_FUNC_RENAMED("controlledMultiQubitUnitary()", "applyControlledCompMatr()") \
1110 applyControlledCompMatr(__VA_ARGS__)
1112#define multiControlledMultiQubitUnitary(...) \
1113 _WARN_FUNC_RENAMED("multiControlledMultiQubitUnitary()", "applyMultiControlledCompMatr()") \
1114 applyMultiControlledCompMatr(__VA_ARGS__)
1118#define applyMatrix2(qureg, targ, ...) \
1119 _WARN_FUNC_RENAMED("applyMatrix2()", "leftapplyCompMatr1()") \
1120 leftapplyCompMatr1(qureg, targ, _GET_COMP_MATR_1_FROM_COMPLEX_MATRIX_2(__VA_ARGS__))
1122#define applyMatrix4(qureg, targ1, targ2, ...) \
1123 _WARN_FUNC_RENAMED("applyMatrix4()", "leftapplyCompMatr2()") \
1124 leftapplyCompMatr2(qureg, targ1, targ2, _GET_COMP_MATR_2_FROM_COMPLEX_MATRIX_4(__VA_ARGS__))
1126#define applyMatrixN(...) \
1127 _WARN_FUNC_RENAMED("applyMatrixN()", "leftapplyCompMatr()") \
1128 leftapplyCompMatr(__VA_ARGS__)
1132static inline void _applyGateMatrixN(
Qureg qureg,
int* targs,
int numTargs,
CompMatr u) {
1139#define applyGateMatrixN(...) \
1140 _WARN_GENERAL_MSG( \
1141 "The QuEST function 'applyGateMatrixN()' is deprecated. To achieve the same thing, disable " \
1142 "numerical validation via 'setValidationEpsilon(0)' before calling 'applyCompMatr()'. You can " \
1143 "save the existing epsilon via 'getValidationEpsilon()' to thereafter restore. This procedure " \
1144 "has been performed here automatically.") \
1145 _applyGateMatrixN(__VA_ARGS__)
1147static inline void _applyMultiControlledGateMatrixN(
Qureg qureg,
int* ctrls,
int numCtrls,
int* targs,
int numTargs,
CompMatr u) {
1154#define applyMultiControlledGateMatrixN(...) \
1155 _WARN_GENERAL_MSG( \
1156 "The QuEST function 'applyMultiControlledGateMatrixN()' is deprecated. To achieve the same thing, disable " \
1157 "numerical validation via 'setValidationEpsilon(0)' before calling 'applyMultiControlledCompMatr()'. You can " \
1158 "save the existing epsilon via 'getValidationEpsilon()' to thereafter restore. This procedure has been " \
1159 "performed here automatically.") \
1160 _applyMultiControlledGateMatrixN(__VA_ARGS__)
1164#define pauliX(...) \
1165 _WARN_FUNC_RENAMED("pauliX()", "applyPauliX()") \
1166 applyPauliX(__VA_ARGS__)
1168#define pauliY(...) \
1169 _WARN_FUNC_RENAMED("pauliY()", "applyPauliY()") \
1170 applyPauliY(__VA_ARGS__)
1172#define pauliZ(...) \
1173 _WARN_FUNC_RENAMED("pauliZ()", "applyPauliZ()") \
1174 applyPauliZ(__VA_ARGS__)
1176#define controlledPauliX(...) \
1177 _WARN_FUNC_RENAMED("controlledPauliX()", "applyControlledPauliX()") \
1178 applyControlledPauliX(__VA_ARGS__)
1180#define controlledPauliY(...) \
1181 _WARN_FUNC_RENAMED("controlledPauliY()", "applyControlledPauliY()") \
1182 applyControlledPauliY(__VA_ARGS__)
1184#define controlledPauliZ(...) \
1185 _WARN_FUNC_RENAMED("controlledPauliZ()", "applyControlledPauliZ()") \
1186 applyControlledPauliZ(__VA_ARGS__)
1190#define rotateX(...) \
1191 _WARN_FUNC_RENAMED("rotateX()", "applyRotateX()") \
1192 applyRotateX(__VA_ARGS__)
1194#define rotateY(...) \
1195 _WARN_FUNC_RENAMED("rotateY()", "applyRotateY()") \
1196 applyRotateY(__VA_ARGS__)
1198#define rotateZ(...) \
1199 _WARN_FUNC_RENAMED("rotateZ()", "applyRotateZ()") \
1200 applyRotateZ(__VA_ARGS__)
1202#define rotateAroundAxis(q, t, a, v) \
1203 _WARN_FUNC_RENAMED( \
1204 "rotateAroundAxis(Qureg, int, qreal, Vector)", \
1205 "applyRotateAroundAxis(Qureg, int, qreal, qreal vx, qreal vy, qreal vz)") \
1206 applyRotateAroundAxis(q, t, a, v.x, v.y, v.z)
1208#define controlledRotateX(...) \
1209 _WARN_FUNC_RENAMED("controlledRotateX()", "applyControlledRotateX()") \
1210 applyControlledRotateX(__VA_ARGS__)
1212#define controlledRotateY(...) \
1213 _WARN_FUNC_RENAMED("controlledRotateY()", "applyControlledRotateY()") \
1214 applyControlledRotateY(__VA_ARGS__)
1216#define controlledRotateZ(...) \
1217 _WARN_FUNC_RENAMED("controlledRotateZ()", "applyControlledRotateZ()") \
1218 applyControlledRotateZ(__VA_ARGS__)
1220#define controlledRotateAroundAxis(q, c, t, a, v) \
1221 _WARN_FUNC_RENAMED( \
1222 "controlledRotateAroundAxis(Qureg, int, int, qreal, Vector)", \
1223 "applyControlledRotateAroundAxis(Qureg, int, int, qreal, qreal vx, qreal vy, qreal vz)") \
1224 applyControlledRotateAroundAxis(q, c, t, a, v.x, v.y, v.z)
1228#define hadamard(...) \
1229 _WARN_FUNC_RENAMED("hadamard()", "applyHadamard()") \
1230 applyHadamard(__VA_ARGS__)
1232#define controlledNot(...) \
1233 _WARN_FUNC_RENAMED("controlledNot()", "applyControlledPauliX()") \
1234 applyControlledPauliX(__VA_ARGS__)
1238#define multiRotateZ(...) \
1239 _WARN_FUNC_RENAMED("multiRotateZ()", "applyPhaseGadget()") \
1240 applyPhaseGadget(__VA_ARGS__)
1242#define multiControlledMultiRotateZ(...) \
1243 _WARN_FUNC_RENAMED("multiControlledMultiRotateZ()", "applyMultiControlledPhaseGadget()") \
1244 applyMultiControlledPhaseGadget(__VA_ARGS__)
1246static inline void _multiRotatePauli(
Qureg qureg,
int* targs, _NoWarnPauliOpType* enums,
int numTargs, qreal angle) {
1248 for (
int i=0; i<numTargs && i<100; i++)
1249 codes[i] = enums[i];
1252#define multiRotatePauli(...) \
1253 _WARN_FUNC_RENAMED( \
1254 "multiRotatePauli(qureg, targs, paulis, numTargs, angle)", \
1255 "applyPauliGadget(qureg, getPauliStr(paulis, targs, numTargs), angle)") \
1256 _multiRotatePauli(__VA_ARGS__)
1258static inline void _multiControlledMultiRotatePauli(
Qureg qureg,
int* ctrls,
int numCtrls,
int* targs, _NoWarnPauliOpType* enums,
int numTargs, qreal angle) {
1260 for (
int i=0; i<numTargs && i<100; i++)
1261 codes[i] = enums[i];
1264#define multiControlledMultiRotatePauli(...) \
1265 _WARN_FUNC_RENAMED( \
1266 "multiControlledMultiRotatePauli(qureg, ctrls, numCtrls, targs, paulis, numTargs, angle)", \
1267 "applyMultiControlledPauliGadget(qureg, ctrls, numCtrls, getPauliStr(paulis, targs, numTargs), angle)") \
1268 _multiControlledMultiRotatePauli(__VA_ARGS__)
1270#define multiQubitNot(...) \
1271 _WARN_FUNC_RENAMED("multiQubitNot()", "applyMultiQubitNot()") \
1272 applyMultiQubitNot(__VA_ARGS__)
1274#define multiControlledMultiQubitNot(...) \
1275 _WARN_FUNC_RENAMED("multiControlledMultiQubitNot()", "applyMultiControlledMultiQubitNot()") \
1276 applyMultiControlledMultiQubitNot(__VA_ARGS__)
1280#define collapseToOutcome(...) \
1281 _WARN_FUNC_RENAMED("collapseToOutcome()", "applyForcedQubitMeasurement()") \
1282 applyForcedQubitMeasurement(__VA_ARGS__)
1284#define measure(...) \
1285 _WARN_FUNC_RENAMED("measure()", "applyQubitMeasurement()") \
1286 applyQubitMeasurement(__VA_ARGS__)
1288#define measureWithStats(...) \
1289 _WARN_FUNC_RENAMED("measureWithStats()", "applyQubitMeasurementAndGetProb()") \
1290 applyQubitMeasurementAndGetProb(__VA_ARGS__)
1292#define applyProjector(...) \
1293 _WARN_FUNC_RENAMED("applyProjector()", "applyQubitProjector()") \
1294 applyQubitProjector(__VA_ARGS__)
1298#define mixPauli(...) \
1299 _WARN_FUNC_RENAMED("mixPauli()", "mixPaulis()") \
1300 mixPaulis(__VA_ARGS__)
1302#define mixDensityMatrix(outQureg, prob, inQureg) \
1303 _WARN_FUNC_RENAMED("mixDensityMatrix(outQureg, prob, inQureg)", "mixQureg(outQureg, inQureg, prob)") \
1304 mixQureg(outQureg, inQureg, prob)
1308#define swapGate(...) \
1309 _WARN_FUNC_RENAMED("swapGate()", "applySwap()") \
1310 applySwap(__VA_ARGS__)
1312#define sqrtSwapGate(...) \
1313 _WARN_FUNC_RENAMED("sqrtSwapGate()", "applySqrtSwap()") \
1314 applySqrtSwap(__VA_ARGS__)
1318#define applyTrotterCircuit(...) \
1319 _WARN_FUNC_RENAMED("applyTrotterCircuit(..., PauliHamil, ...)", "applyTrotterizedPauliStrSumGadget(..., PauliStrSum, ...)") \
1320 applyTrotterizedPauliStrSumGadget(__VA_ARGS__)
1322#define applyFullQFT(...) \
1323 _WARN_FUNC_RENAMED("applyFullQFT()", "applyFullQuantumFourierTransform()") \
1324 applyFullQuantumFourierTransform(__VA_ARGS__)
1326#define applyQFT(...) \
1327 _WARN_FUNC_RENAMED("applyQFT()", "applyQuantumFourierTransform()") \
1328 applyQuantumFourierTransform(__VA_ARGS__)
1332#define seedQuESTDefault(...) \
1333 _WARN_FUNC_RENAMED("seedQuESTDefault(QuESTEnv)", "setSeedsToDefault()") \
1336#define seedQuEST(env, seeds, numSeeds) \
1337 _WARN_FUNC_RENAMED("seedQuEST(QuESTEnv, unsigned long int*, int)", "setSeeds(unsigned*, int)") \
1338 setSeeds(seeds, numSeeds)
qreal calcExpecPauliStrSum(Qureg qureg, PauliStrSum sum)
qreal calcExpecPauliStr(Qureg qureg, PauliStr str)
KrausMap createKrausMap(int numQubits, int numOperators)
void destroyKrausMap(KrausMap map)
void setKrausMap(KrausMap map, qcomp ***matrices)
qreal getValidationEpsilon()
void setValidationEpsilon(qreal eps)
void mixKrausMap(Qureg qureg, int *targets, int numTargets, KrausMap map)
void setQuregToWeightedSum(Qureg out, qcomp *coeffs, Qureg *in, int numIn)
void setQuregToClone(Qureg outQureg, Qureg inQureg)
void leftapplyPauliStrSum(Qureg qureg, PauliStrSum sum, Qureg workspace)
void applyMultiControlledCompMatr(Qureg qureg, int *controls, int numControls, int *targets, int numTargets, CompMatr matr)
void applyCompMatr(Qureg qureg, int *targets, int numTargets, CompMatr matr)
void applyDiagMatr(Qureg qureg, int *targets, int numTargets, DiagMatr matrix)
void applyMultiControlledPauliGadget(Qureg qureg, int *controls, int numControls, PauliStr str, qreal angle)
void applyPauliGadget(Qureg qureg, PauliStr str, qreal angle)
PauliStrSum createPauliStrSum(PauliStr *strings, qcomp *coeffs, qindex numTerms)
PauliStr getPauliStr(const char *paulis, int *indices, int numPaulis)
void destroyPauliStrSum(PauliStrSum sum)