10#include "quest/include/qureg.h"
11#include "quest/include/matrices.h"
12#include "quest/include/operations.h"
13#include "quest/include/calculations.h"
15#include "quest/src/core/validation.hpp"
16#include "quest/src/core/utilities.hpp"
17#include "quest/src/core/randomiser.hpp"
18#include "quest/src/core/localiser.hpp"
19#include "quest/src/core/bitwise.hpp"
20#include "quest/src/core/constants.hpp"
32extern bool paulis_isIdentity(
PauliStr str);
33extern bool paulis_hasOddNumY(
PauliStr str);
39void validateAndApplyAnyCtrlAnyTargUnitaryMatrix(
Qureg qureg,
int* ctrls,
int* states,
int numCtrls,
int* targs,
int numTargs, T matr,
const char* caller) {
40 validate_quregFields(qureg, caller);
41 validate_controlsAndTargets(qureg, ctrls, numCtrls, targs, numTargs, caller);
42 validate_controlStates(states, numCtrls, caller);
43 validate_matrixDimMatchesTargets(matr, numTargs, caller);
44 validate_matrixIsUnitary(matr, caller);
45 if (util_isDenseMatrixType<T>())
46 validate_mixedAmpsFitInNode(qureg, numTargs, caller);
48 auto ctrlVec = util_getVector(ctrls, numCtrls);
49 auto stateVec = util_getVector(states, numCtrls);
50 auto targVec = util_getVector(targs, numTargs);
53 localiser_statevec_anyCtrlAnyTargAnyMatr(qureg, ctrlVec, stateVec, targVec, matr, conj);
55 if (!qureg.isDensityMatrix)
59 ctrlVec = util_getBraQubits(ctrlVec, qureg);
60 targVec = util_getBraQubits(targVec, qureg);
61 localiser_statevec_anyCtrlAnyTargAnyMatr(qureg, ctrlVec, stateVec, targVec, matr, conj);
73 validate_quregFields(qureg, __func__);
74 validate_target(qureg, target, __func__);
75 validate_matrixFields(matrix, __func__);
78 localiser_statevec_anyCtrlOneTargDenseMatr(qureg, {}, {}, target, matrix, conj);
83 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, &target, 1, matrix, __func__);
88 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, &target, 1, matrix, __func__);
93 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, &target, 1, matrix, __func__);
98 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matrix, __func__);
109 validate_controlsMatchStates(controls.size(), states.size(), __func__);
123 validate_quregFields(qureg, __func__);
124 validate_twoTargets(qureg, target1, target2, __func__);
125 validate_matrixFields(matrix, __func__);
126 validate_mixedAmpsFitInNode(qureg, 2, __func__);
129 localiser_statevec_anyCtrlTwoTargDenseMatr(qureg, {}, {}, target1, target2, matrix, conj);
134 int targs[] = {target1, target2};
135 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, targs, 2, matrix, __func__);
140 int targs[] = {target1, target2};
141 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, targs, 2, matrix, __func__);
146 int targs[] = {target1, target2};
147 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, targs, 2, matrix, __func__);
152 int targs[] = {target1, target2};
153 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, targs, 2, matrix, __func__);
164 validate_controlsMatchStates(controls.size(), states.size(), __func__);
178 validate_quregFields(qureg, __func__);
179 validate_targets(qureg, targets, numTargets, __func__);
180 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
181 validate_mixedAmpsFitInNode(qureg, numTargets, __func__);
184 localiser_statevec_anyCtrlAnyTargDenseMatr(qureg, {}, {}, util_getVector(targets, numTargets), matrix, conj);
189 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, targets, numTargets, matrix, __func__);
194 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, targets, numTargets, matrix, __func__);
199 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, targets, numTargets, matrix, __func__);
204 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, targets, numTargets, matrix, __func__);
230 validate_controlsMatchStates(controls.size(), states.size(), __func__);
244 validate_quregFields(qureg, __func__);
245 validate_target(qureg, target, __func__);
246 validate_matrixFields(matrix, __func__);
249 localiser_statevec_anyCtrlOneTargDiagMatr(qureg, {}, {}, target, matrix, conj);
254 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, &target, 1, matrix, __func__);
259 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, &target, 1, matrix, __func__);
264 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, &target, 1, matrix, __func__);
269 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matrix, __func__);
280 validate_controlsMatchStates(controls.size(), states.size(), __func__);
294 validate_quregFields(qureg, __func__);
295 validate_twoTargets(qureg, target1, target2, __func__);
296 validate_matrixFields(matrix, __func__);
299 localiser_statevec_anyCtrlTwoTargDiagMatr(qureg, {}, {}, target1, target2, matrix, conj);
304 int targs[] = {target1, target2};
305 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, targs, 2, matrix, __func__);
310 int targs[] = {target1, target2};
311 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, targs, 2, matrix, __func__);
316 int targs[] = {target1, target2};
317 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, targs, 2, matrix, __func__);
322 int targs[] = {target1, target2};
323 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, targs, 2, matrix, __func__);
334 validate_controlsMatchStates(controls.size(), states.size(), __func__);
348 validate_quregFields(qureg, __func__);
349 validate_targets(qureg, targets, numTargets, __func__);
350 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
354 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, {}, {}, util_getVector(targets, numTargets), matrix, exponent, conj);
359 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, targets, numTargets, matrix, __func__);
364 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, targets, numTargets, matrix, __func__);
369 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, targets, numTargets, matrix, __func__);
374 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, targets, numTargets, matrix, __func__);
386 applyDiagMatr(qureg, targets.data(), targets.size(), matrix);
400 validate_controlsMatchStates(controls.size(), states.size(), __func__);
417 validate_quregFields(qureg, __func__);
418 validate_targets(qureg, targets, numTargets, __func__);
419 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
420 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
423 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, {}, {}, util_getVector(targets, numTargets), matrix, exponent, conj);
427 validate_quregFields(qureg, __func__);
428 validate_targets(qureg, targets, numTargets, __func__);
429 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
430 validate_matrixIsUnitary(matrix, __func__);
431 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
432 validate_unitaryExponentIsReal(exponent, __func__);
441 validate_quregFields(qureg, __func__);
442 validate_controlAndTargets(qureg, control, targets, numTargets, __func__);
443 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
444 validate_matrixIsUnitary(matrix, __func__);
445 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
446 validate_unitaryExponentIsReal(exponent, __func__);
455 validate_quregFields(qureg, __func__);
456 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
457 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
458 validate_matrixIsUnitary(matrix, __func__);
459 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
460 validate_unitaryExponentIsReal(exponent, __func__);
469 validate_quregFields(qureg, __func__);
470 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
471 validate_controlStates(states, numControls, __func__);
472 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
473 validate_matrixIsUnitary(matrix, __func__);
474 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
475 validate_unitaryExponentIsReal(exponent, __func__);
487 auto ctrlVec = util_getVector(controls, numControls);
488 auto stateVec = util_getVector(states, numControls);
489 auto targVec = util_getVector(targets, numTargets);
490 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, ctrlVec, stateVec, targVec, matrix, exponent, conj);
492 if (!qureg.isDensityMatrix)
496 ctrlVec = util_getBraQubits(ctrlVec, qureg);
497 targVec = util_getBraQubits(targVec, qureg);
498 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, ctrlVec, stateVec, targVec, matrix, exponent, conj);
524 validate_controlsMatchStates(controls.size(), states.size(), __func__);
538 validate_quregFields(qureg, __func__);
539 validate_matrixFields(matrix, __func__);
540 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
546 validate_quregFields(qureg, __func__);
547 validate_matrixFields(matrix, __func__);
548 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
549 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
551 bool onlyMultiply =
true;
552 (qureg.isDensityMatrix)?
553 localiser_densmatr_allTargDiagMatr(qureg, matrix, exponent, onlyMultiply):
554 localiser_statevec_allTargDiagMatr(qureg, matrix, exponent);
558 validate_quregFields(qureg, __func__);
559 validate_matrixFields(matrix, __func__);
560 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
561 validate_matrixIsUnitary(matrix, __func__);
567 validate_quregFields(qureg, __func__);
568 validate_matrixFields(matrix, __func__);
569 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
570 validate_matrixIsUnitary(matrix, __func__);
571 validate_unitaryExponentIsReal(exponent, __func__);
572 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
574 bool onlyMultiply =
false;
575 (qureg.isDensityMatrix)?
576 localiser_densmatr_allTargDiagMatr(qureg, matrix, exponent, onlyMultiply):
577 localiser_statevec_allTargDiagMatr(qureg, matrix, exponent);
591 validate_quregFields(qureg, __func__);
592 validate_target(qureg, target, __func__);
599 validate_quregFields(qureg, __func__);
600 validate_controlAndTarget(qureg, control, target, __func__);
607 validate_quregFields(qureg, __func__);
608 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
617 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matr, __func__);
628 validate_controlsMatchStates(controls.size(), states.size(), __func__);
642 validate_quregFields(qureg, __func__);
643 validate_target(qureg, target, __func__);
650 validate_quregFields(qureg, __func__);
651 validate_controlAndTarget(qureg, control, target, __func__);
658 validate_quregFields(qureg, __func__);
659 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
668 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matr, __func__);
679 validate_controlsMatchStates(controls.size(), states.size(), __func__);
693 validate_quregFields(qureg, __func__);
694 validate_target(qureg, target, __func__);
701 validate_quregFields(qureg, __func__);
702 validate_controlAndTarget(qureg, control, target, __func__);
709 validate_quregFields(qureg, __func__);
710 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
718 qcomp a = 1/std::sqrt(2);
723 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matr, __func__);
734 validate_controlsMatchStates(controls.size(), states.size(), __func__);
748 validate_quregFields(qureg, __func__);
749 validate_twoTargets(qureg, qubit1, qubit2, __func__);
751 localiser_statevec_anyCtrlSwap(qureg, {}, {}, qubit1, qubit2);
755 validate_quregFields(qureg, __func__);
756 validate_twoTargets(qureg, qubit1, qubit2, __func__);
763 validate_quregFields(qureg, __func__);
764 validate_controlAndTwoTargets(qureg, control, qubit1, qubit2, __func__);
771 validate_quregFields(qureg, __func__);
772 validate_controlsAndTwoTargets(qureg, controls, numControls, qubit1, qubit2, __func__);
779 validate_quregFields(qureg, __func__);
780 validate_controlsAndTwoTargets(qureg, controls, numControls, qubit1, qubit2, __func__);
781 validate_controlStates(states, numControls, __func__);
783 auto ctrlVec = util_getVector(controls, numControls);
784 auto stateVec = util_getVector(states, numControls);
785 localiser_statevec_anyCtrlSwap(qureg, ctrlVec, stateVec, qubit1, qubit2);
787 if (!qureg.isDensityMatrix)
790 ctrlVec = util_getBraQubits(ctrlVec, qureg);
791 qubit1 = util_getBraQubit(qubit1, qureg);
792 qubit2 = util_getBraQubit(qubit2, qureg);
793 localiser_statevec_anyCtrlSwap(qureg, ctrlVec, stateVec, qubit1, qubit2);
804 validate_controlsMatchStates(controls.size(), states.size(), __func__);
818 validate_quregFields(qureg, __func__);
819 validate_twoTargets(qureg,target1, target2, __func__);
826 validate_quregFields(qureg, __func__);
827 validate_controlAndTwoTargets(qureg, control, target1, target2, __func__);
834 validate_quregFields(qureg, __func__);
835 validate_controlsAndTwoTargets(qureg, controls, numControls, target1, target2, __func__);
842 validate_quregFields(qureg, __func__);
843 validate_controlsAndTwoTargets(qureg, controls, numControls, target1, target2, __func__);
844 validate_controlStates(states, numControls, __func__);
852 validate_mixedAmpsFitInNode(qureg, 2, __func__);
856 {0, .5+.5_i, .5-.5_i, 0},
857 {0, .5-.5_i, .5+.5_i, 0},
871 validate_controlsMatchStates(controls.size(), states.size(), __func__);
888 validate_quregFields(qureg, __func__);
889 validate_target(qureg, target, __func__);
896 validate_quregFields(qureg, __func__);
897 validate_target(qureg, target, __func__);
904 validate_quregFields(qureg, __func__);
905 validate_target(qureg, target, __func__);
912 validate_quregFields(qureg, __func__);
913 validate_controlAndTarget(qureg, control, target, __func__);
920 validate_quregFields(qureg, __func__);
921 validate_controlAndTarget(qureg, control, target, __func__);
928 validate_quregFields(qureg, __func__);
929 validate_controlAndTarget(qureg, control, target, __func__);
936 validate_quregFields(qureg, __func__);
937 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
944 validate_quregFields(qureg, __func__);
945 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
952 validate_quregFields(qureg, __func__);
953 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
960 validate_quregFields(qureg, __func__);
961 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
962 validate_controlStates(states, numControls, __func__);
969 validate_quregFields(qureg, __func__);
970 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
971 validate_controlStates(states, numControls, __func__);
978 validate_quregFields(qureg, __func__);
979 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
980 validate_controlStates(states, numControls, __func__);
1005 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1011 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1017 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1031 validate_quregFields(qureg, __func__);
1032 validate_pauliStrTargets(qureg, str, __func__);
1034 localiser_statevec_anyCtrlPauliTensor(qureg, {}, {}, str);
1038 validate_quregFields(qureg, __func__);
1039 validate_pauliStrTargets(qureg, str, __func__);
1046 validate_quregFields(qureg, __func__);
1047 validate_controlAndPauliStrTargets(qureg, control, str, __func__);
1054 validate_quregFields(qureg, __func__);
1055 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1062 validate_quregFields(qureg, __func__);
1063 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1064 validate_controlStates(states, numControls, __func__);
1067 auto ctrlVec = util_getVector(controls, numControls);
1068 auto stateVec = util_getVector(states, numControls);
1073 if (qureg.isDensityMatrix && numControls == 0) {
1074 factor = paulis_hasOddNumY(str)? -1 : 1;
1075 ctrlVec = util_getConcatenated(ctrlVec, util_getBraQubits(ctrlVec, qureg));
1076 stateVec = util_getConcatenated(stateVec, stateVec);
1077 str = paulis_getKetAndBraPauliStr(str, qureg);
1080 localiser_statevec_anyCtrlPauliTensor(qureg, ctrlVec, stateVec, str, factor);
1083 if (qureg.isDensityMatrix && numControls > 0) {
1084 factor = paulis_hasOddNumY(str)? -1 : 1;
1085 ctrlVec = util_getBraQubits(ctrlVec, qureg);
1086 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
1087 localiser_statevec_anyCtrlPauliTensor(qureg, ctrlVec, stateVec, str, factor);
1099 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1113 validate_quregFields(qureg, __func__);
1114 validate_quregFields(workspace, __func__);
1115 validate_quregCanBeWorkspace(qureg, workspace, __func__);
1116 validate_pauliStrSumFields(sum, __func__);
1117 validate_pauliStrSumTargets(sum, qureg, __func__);
1120 localiser_statevec_setQuregToSuperposition(0, workspace, 1, qureg, 0, qureg);
1121 localiser_statevec_initUniformState(qureg, 0);
1124 for (qindex i=0; i<sum.numTerms; i++) {
1125 localiser_statevec_anyCtrlPauliTensor(workspace, {}, {}, sum.strings[i]);
1126 localiser_statevec_setQuregToSuperposition(1, qureg, sum.coeffs[i], workspace, 0, workspace);
1127 localiser_statevec_anyCtrlPauliTensor(workspace, {}, {}, sum.strings[i]);
1133void applyFirstOrderTrotter(
Qureg qureg,
PauliStrSum sum, qreal angle,
bool reverse) {
1137 for (qindex i=0; i<sum.numTerms; i++) {
1138 int j = reverse? sum.numTerms - i - 1 : i;
1139 qreal arg = 2 * angle * std::real(sum.coeffs[j]);
1144void applyHigherOrderTrotter(
Qureg qureg,
PauliStrSum sum, qreal angle,
int order) {
1149 applyFirstOrderTrotter(qureg, sum, angle,
false);
1151 }
else if (order == 2) {
1152 applyFirstOrderTrotter(qureg, sum, angle/2,
false);
1153 applyFirstOrderTrotter(qureg, sum, angle/2,
true);
1156 qreal p = 1. / (4 - std::pow(4, 1./(order-1)));
1157 qreal a = p * angle;
1158 qreal b = (1-4*p) * angle;
1160 int lower = order - 2;
1161 applyFirstOrderTrotter(qureg, sum, a, lower);
1162 applyFirstOrderTrotter(qureg, sum, a, lower);
1163 applyFirstOrderTrotter(qureg, sum, b, lower);
1164 applyFirstOrderTrotter(qureg, sum, a, lower);
1165 applyFirstOrderTrotter(qureg, sum, a, lower);
1170 validate_quregFields(qureg, __func__);
1171 validate_pauliStrSumFields(sum, __func__);
1172 validate_pauliStrSumTargets(sum, qureg, __func__);
1173 validate_pauliStrSumIsHermitian(sum, __func__);
1174 validate_trotterParams(qureg, order, reps, __func__);
1182 bool wasValidationEnabled = validateconfig_isEnabled();
1183 validateconfig_disable();
1186 for (
int r=0; r<reps; r++)
1187 applyHigherOrderTrotter(qureg, sum, angle/reps, order);
1190 if (wasValidationEnabled)
1191 validateconfig_enable();
1212 validate_quregFields(qureg, __func__);
1213 validate_target(qureg, target, __func__);
1220 validate_quregFields(qureg, __func__);
1221 validate_target(qureg, target, __func__);
1228 validate_quregFields(qureg, __func__);
1229 validate_target(qureg, target, __func__);
1236 validate_quregFields(qureg, __func__);
1237 validate_controlAndTarget(qureg, control, target, __func__);
1244 validate_quregFields(qureg, __func__);
1245 validate_controlAndTarget(qureg, control, target, __func__);
1252 validate_quregFields(qureg, __func__);
1253 validate_controlAndTarget(qureg, control, target, __func__);
1260 validate_quregFields(qureg, __func__);
1261 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1268 validate_quregFields(qureg, __func__);
1269 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1276 validate_quregFields(qureg, __func__);
1277 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1284 validate_quregFields(qureg, __func__);
1285 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1286 validate_controlStates(states, numControls, __func__);
1293 validate_quregFields(qureg, __func__);
1294 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1295 validate_controlStates(states, numControls, __func__);
1302 validate_quregFields(qureg, __func__);
1303 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1304 validate_controlStates(states, numControls, __func__);
1328 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1334 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1340 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1354 validate_quregFields(qureg, __func__);
1355 validate_target(qureg, targ, __func__);
1356 validate_rotationAxisNotZeroVector(axisX, axisY, axisZ, __func__);
1362 validate_quregFields(qureg, __func__);
1363 validate_controlAndTarget(qureg, ctrl, targ, __func__);
1364 validate_rotationAxisNotZeroVector(axisX, axisY, axisZ, __func__);
1370 validate_quregFields(qureg, __func__);
1371 validate_controlsAndTarget(qureg, ctrls, numCtrls, targ, __func__);
1372 validate_rotationAxisNotZeroVector(axisX, axisY, axisZ, __func__);
1378 validate_quregFields(qureg, __func__);
1379 validate_controlsAndTarget(qureg, ctrls, numCtrls, targ, __func__);
1380 validate_controlStates(states, numCtrls, __func__);
1381 validate_rotationAxisNotZeroVector(axisX, axisY, axisZ, __func__);
1384 qreal norm = std::sqrt(std::pow(axisX,2) + std::pow(axisY,2) + std::pow(axisZ,2));
1387 qreal c = std::cos(angle/2);
1388 qreal s = std::sin(angle/2);
1389 qcomp u11 = c - (s * axisZ * 1_i) / norm;
1390 qcomp u12 = - (s * (axisY + axisX * 1_i)) / norm;
1391 qcomp u21 = (s * (axisY - axisX * 1_i)) / norm;
1392 qcomp u22 = c + (s * axisZ * 1_i) / norm;
1407 validate_controlsMatchStates(ctrls.size(), states.size(), __func__);
1421 validate_quregFields(qureg, __func__);
1422 validate_pauliStrTargets(qureg, str, __func__);
1424 qreal phase = util_getPhaseFromGateAngle(angle);
1425 localiser_statevec_anyCtrlPauliGadget(qureg, {}, {}, str, phase);
1429 validate_quregFields(qureg, __func__);
1430 validate_pauliStrTargets(qureg, str, __func__);
1436 validate_quregFields(qureg, __func__);
1437 validate_controlAndPauliStrTargets(qureg, control, str, __func__);
1443 validate_quregFields(qureg, __func__);
1444 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1450 validate_quregFields(qureg, __func__);
1451 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1452 validate_controlStates(states, numControls, __func__);
1457 if (paulis_isIdentity(str) && numControls == 0 && qureg.isDensityMatrix)
1464 qreal phase = util_getPhaseFromGateAngle(angle);
1465 auto ctrlVec = util_getVector(controls, numControls);
1466 auto stateVec = util_getVector(states, numControls);
1467 localiser_statevec_anyCtrlPauliGadget(qureg, ctrlVec, stateVec, str, phase);
1469 if (!qureg.isDensityMatrix)
1473 phase *= paulis_hasOddNumY(str) ? 1 : -1;
1474 ctrlVec = util_getBraQubits(ctrlVec, qureg);
1475 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
1476 localiser_statevec_anyCtrlPauliGadget(qureg, ctrlVec, stateVec, str, phase);
1487 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1501 validate_quregFields(qureg, __func__);
1502 validate_targets(qureg, targets, numTargets, __func__);
1504 qreal phase = util_getPhaseFromGateAngle(angle);
1505 localiser_statevec_anyCtrlPhaseGadget(qureg, {}, {}, util_getVector(targets,numTargets), phase);
1509 validate_quregFields(qureg, __func__);
1510 validate_targets(qureg, targets, numTargets, __func__);
1517 validate_quregFields(qureg, __func__);
1518 validate_controlAndTargets(qureg, control, targets, numTargets, __func__);
1525 validate_quregFields(qureg, __func__);
1526 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
1533 validate_quregFields(qureg, __func__);
1534 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
1535 validate_controlStates(states, numControls, __func__);
1537 qreal phase = util_getPhaseFromGateAngle(angle);
1538 auto ctrlVec = util_getVector(controls, numControls);
1539 auto targVec = util_getVector(targets, numTargets);
1540 auto stateVec = util_getVector(states, numControls);
1541 localiser_statevec_anyCtrlPhaseGadget(qureg, ctrlVec, stateVec, targVec, phase);
1543 if (!qureg.isDensityMatrix)
1547 ctrlVec = util_getBraQubits(ctrlVec, qureg);
1548 targVec = util_getBraQubits(targVec, qureg);
1549 localiser_statevec_anyCtrlPhaseGadget(qureg, ctrlVec, stateVec, targVec, phase);
1575 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1589 validate_quregFields(qureg, __func__);
1590 validate_target(qureg, target, __func__);
1597 validate_quregFields(qureg, __func__);
1598 validate_twoTargets(qureg, target1, target2, __func__);
1601 int targets[] = {target1, target2};
1606 validate_quregFields(qureg, __func__);
1607 validate_targets(qureg, targets, numTargets, __func__);
1632 validate_quregFields(qureg, __func__);
1633 validate_target(qureg, target, __func__);
1640 validate_quregFields(qureg, __func__);
1641 validate_twoTargets(qureg, target1, target2, __func__);
1644 int targets[] = {target1, target2};
1649 validate_quregFields(qureg, __func__);
1650 validate_targets(qureg, targets, numTargets, __func__);
1675 validate_quregFields(qureg, __func__);
1676 validate_targets(qureg, targets, numTargets, __func__);
1683 validate_quregFields(qureg, __func__);
1684 validate_targets(qureg, targets, numTargets, __func__);
1691 validate_quregFields(qureg, __func__);
1692 validate_controlAndTargets(qureg, control, targets, numTargets, __func__);
1699 validate_quregFields(qureg, __func__);
1700 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
1707 validate_quregFields(qureg, __func__);
1708 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
1709 validate_controlStates(states, numControls, __func__);
1741 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1755 validate_quregFields(qureg, __func__);
1756 validate_target(qureg, target, __func__);
1757 validate_measurementOutcomeIsValid(outcome, __func__);
1761 (qureg.isDensityMatrix)?
1762 localiser_densmatr_multiQubitProjector(qureg, {target}, {outcome}, prob):
1763 localiser_statevec_multiQubitProjector(qureg, {target}, {outcome}, prob);
1767 validate_quregFields(qureg, __func__);
1768 validate_targets(qureg, qubits, numQubits, __func__);
1769 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
1772 auto qubitVec = util_getVector(qubits, numQubits);
1773 auto outcomeVec = util_getVector(outcomes, numQubits);
1775 (qureg.isDensityMatrix)?
1776 localiser_densmatr_multiQubitProjector(qureg, qubitVec, outcomeVec, prob):
1777 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, prob);
1783 validate_measurementOutcomesMatchTargets(qubits.size(), outcomes.size(), __func__);
1797 validate_quregFields(qureg, __func__);
1798 validate_target(qureg, target, __func__);
1805 validate_quregFields(qureg, __func__);
1806 validate_target(qureg, target, __func__);
1812 vector<qreal> probs(2);
1815 validate_measurementProbsAreNormalised(probs, __func__);
1818 int outcome = rand_getRandomSingleQubitOutcome(probs[0]);
1819 *probability = probs[outcome];
1822 (qureg.isDensityMatrix)?
1823 localiser_densmatr_multiQubitProjector(qureg, {target}, {outcome}, *probability):
1824 localiser_statevec_multiQubitProjector(qureg, {target}, {outcome}, *probability);
1830 validate_quregFields(qureg, __func__);
1831 validate_target(qureg, target, __func__);
1832 validate_measurementOutcomeIsValid(outcome, __func__);
1838 validate_measurementOutcomeProbNotZero(outcome, prob, __func__);
1841 (qureg.isDensityMatrix)?
1842 localiser_densmatr_multiQubitProjector(qureg, {target}, {outcome}, prob):
1843 localiser_statevec_multiQubitProjector(qureg, {target}, {outcome}, prob);
1849 validate_quregFields(qureg, __func__);
1850 validate_targets(qureg, qubits, numQubits, __func__);
1859 validate_quregFields(qureg, __func__);
1860 validate_targets(qureg, qubits, numQubits, __func__);
1863 qindex numProbs = powerOf2(numQubits);
1866 vector<qreal> probs;
1867 auto callback = [&]() { validate_tempAllocSucceeded(
false, numProbs,
sizeof(qreal), __func__); };
1868 util_tryAllocVector(probs, numProbs, callback);
1874 validate_measurementProbsAreNormalised(probs, __func__);
1877 qindex outcome = rand_getRandomMultiQubitOutcome(probs);
1878 *probability = probs[outcome];
1881 auto qubitVec = util_getVector(qubits, numQubits);
1882 auto outcomeVec = vector<int>(numQubits);
1883 getBitsFromInteger(outcomeVec.data(), outcome, numQubits);
1886 (qureg.isDensityMatrix)?
1887 localiser_densmatr_multiQubitProjector(qureg, qubitVec, outcomeVec, *probability):
1888 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, *probability);
1894 validate_quregFields(qureg, __func__);
1895 validate_targets(qureg, qubits, numQubits, __func__);
1896 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
1898 auto qubitVec = util_getVector(qubits, numQubits);
1899 auto outcomeVec = util_getVector(outcomes, numQubits);
1903 validate_measurementOutcomesProbNotZero(outcomes, numQubits, prob, __func__);
1906 (qureg.isDensityMatrix)?
1907 localiser_densmatr_multiQubitProjector(qureg, qubitVec, outcomeVec, prob):
1908 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, prob);
1921 validate_measurementOutcomesMatchTargets(qubits.size(), outcomes.size(), __func__);
1935 validate_quregFields(qureg, __func__);
1936 validate_targets(qureg, targets, numTargets, __func__);
1942 for (
int n=numTargets-1; n>=0; n--) {
1944 for (
int m=0; m<n; m++) {
1945 qreal arg = const_PI / powerOf2(m+1);
1950 int mid = numTargets/2;
1951 for (
int n=0; n<mid; n++)
1952 applySwap(qureg, targets[n], targets[numTargets-1-n]);
1956 validate_quregFields(qureg, __func__);
1959 vector<int> targets(qureg.numQubits);
1960 for (
size_t i=0; i<targets.size(); i++)
qreal calcProbOfQubitOutcome(Qureg qureg, int qubit, int outcome)
void calcProbsOfAllMultiQubitOutcomes(qreal *outcomeProbs, Qureg qureg, int *qubits, int numQubits)
qreal calcProbOfMultiQubitOutcome(Qureg qureg, int *qubits, int *outcomes, int numQubits)
static CompMatr2 getCompMatr2(qcomp **in)
static CompMatr1 getCompMatr1(qcomp **in)
static DiagMatr1 getDiagMatr1(qcomp *in)
void applyCompMatr1(Qureg qureg, int target, CompMatr1 matrix)
void multiplyCompMatr1(Qureg qureg, int target, CompMatr1 matrix)
void applyMultiControlledCompMatr1(Qureg qureg, int *controls, int numControls, int target, CompMatr1 matrix)
void applyControlledCompMatr1(Qureg qureg, int control, int target, CompMatr1 matrix)
void applyMultiStateControlledCompMatr1(Qureg qureg, int *controls, int *states, int numControls, int target, CompMatr1 matrix)
void applyMultiStateControlledCompMatr2(Qureg qureg, int *controls, int *states, int numControls, int target1, int target2, CompMatr2 matrix)
void multiplyCompMatr2(Qureg qureg, int target1, int target2, CompMatr2 matrix)
void applyMultiControlledCompMatr2(Qureg qureg, int *controls, int numControls, int target1, int target2, CompMatr2 matrix)
void applyCompMatr2(Qureg qureg, int target1, int target2, CompMatr2 matrix)
void applyControlledCompMatr2(Qureg qureg, int control, int target1, int target2, CompMatr2 matrix)
void applyMultiStateControlledCompMatr(Qureg qureg, int *controls, int *states, int numControls, int *targets, int numTargets, CompMatr matrix)
void multiplyCompMatr(Qureg qureg, int *targets, int numTargets, CompMatr matrix)
void applyMultiControlledCompMatr(Qureg qureg, int *controls, int numControls, int *targets, int numTargets, CompMatr matrix)
void applyControlledCompMatr(Qureg qureg, int control, int *targets, int numTargets, CompMatr matrix)
void applyCompMatr(Qureg qureg, int *targets, int numTargets, CompMatr matrix)
void applyControlledDiagMatr1(Qureg qureg, int control, int target, DiagMatr1 matrix)
void multiplyDiagMatr1(Qureg qureg, int target, DiagMatr1 matrix)
void applyDiagMatr1(Qureg qureg, int target, DiagMatr1 matrix)
void applyMultiStateControlledDiagMatr1(Qureg qureg, int *controls, int *states, int numControls, int target, DiagMatr1 matrix)
void applyMultiControlledDiagMatr1(Qureg qureg, int *controls, int numControls, int target, DiagMatr1 matrix)
void applyMultiStateControlledDiagMatr2(Qureg qureg, int *controls, int *states, int numControls, int target1, int target2, DiagMatr2 matrix)
void applyMultiControlledDiagMatr2(Qureg qureg, int *controls, int numControls, int target1, int target2, DiagMatr2 matrix)
void applyDiagMatr2(Qureg qureg, int target1, int target2, DiagMatr2 matrix)
void applyControlledDiagMatr2(Qureg qureg, int control, int target1, int target2, DiagMatr2 matrix)
void multiplyDiagMatr2(Qureg qureg, int target1, int target2, DiagMatr2 matrix)
void multiplyDiagMatr(Qureg qureg, int *targets, int numTargets, DiagMatr matrix)
void multiplyDiagMatrPower(Qureg qureg, int *targets, int numTargets, DiagMatr matrix, qcomp exponent)
void applyDiagMatr(Qureg qureg, int *targets, int numTargets, DiagMatr matrix)
void applyMultiControlledDiagMatrPower(Qureg qureg, int *controls, int numControls, int *targets, int numTargets, DiagMatr matrix, qcomp exponent)
void applyMultiStateControlledDiagMatrPower(Qureg qureg, int *controls, int *states, int numControls, int *targets, int numTargets, DiagMatr matrix, qcomp exponent)
void applyDiagMatrPower(Qureg qureg, int *targets, int numTargets, DiagMatr matrix, qcomp exponent)
void applyControlledDiagMatr(Qureg qureg, int control, int *targets, int numTargets, DiagMatr matrix)
void applyMultiControlledDiagMatr(Qureg qureg, int *controls, int numControls, int *targets, int numTargets, DiagMatr matrix)
void applyControlledDiagMatrPower(Qureg qureg, int control, int *targets, int numTargets, DiagMatr matrix, qcomp exponent)
void applyMultiStateControlledDiagMatr(Qureg qureg, int *controls, int *states, int numControls, int *targets, int numTargets, DiagMatr matrix)
void applyControlledT(Qureg qureg, int control, int target)
void applyControlledS(Qureg qureg, int control, int target)
void applyMultiStateControlledHadamard(Qureg qureg, int *controls, int *states, int numControls, int target)
void applyMultiControlledHadamard(Qureg qureg, int *controls, int numControls, int target)
void applyS(Qureg qureg, int target)
void applyMultiControlledT(Qureg qureg, int *controls, int numControls, int target)
void applyMultiControlledS(Qureg qureg, int *controls, int numControls, int target)
void applyT(Qureg qureg, int target)
void applyMultiStateControlledS(Qureg qureg, int *controls, int *states, int numControls, int target)
void applyHadamard(Qureg qureg, int target)
void applyControlledHadamard(Qureg qureg, int control, int target)
void applyMultiStateControlledT(Qureg qureg, int *controls, int *states, int numControls, int target)
void applyFullStateDiagMatr(Qureg qureg, FullStateDiagMatr matrix)
void multiplyFullStateDiagMatrPower(Qureg qureg, FullStateDiagMatr matrix, qcomp exponent)
void applyFullStateDiagMatrPower(Qureg qureg, FullStateDiagMatr matrix, qcomp exponent)
void multiplyFullStateDiagMatr(Qureg qureg, FullStateDiagMatr matrix)
qreal applyForcedQubitMeasurement(Qureg qureg, int target, int outcome)
qindex applyMultiQubitMeasurement(Qureg qureg, int *qubits, int numQubits)
int applyQubitMeasurement(Qureg qureg, int target)
qreal applyForcedMultiQubitMeasurement(Qureg qureg, int *qubits, int *outcomes, int numQubits)
qindex applyMultiQubitMeasurementAndGetProb(Qureg qureg, int *qubits, int numQubits, qreal *probability)
int applyQubitMeasurementAndGetProb(Qureg qureg, int target, qreal *probability)
void applyMultiStateControlledMultiQubitNot(Qureg qureg, int *controls, int *states, int numControls, int *targets, int numTargets)
void multiplyMultiQubitNot(Qureg qureg, int *targets, int numTargets)
void applyMultiControlledMultiQubitNot(Qureg qureg, int *controls, int numControls, int *targets, int numTargets)
void applyMultiQubitNot(Qureg qureg, int *targets, int numTargets)
void applyControlledMultiQubitNot(Qureg qureg, int control, int *targets, int numTargets)
void applyMultiControlledPauliZ(Qureg qureg, int *controls, int numControls, int target)
void applyPauliX(Qureg qureg, int target)
void applyControlledPauliX(Qureg qureg, int control, int target)
void applyMultiStateControlledPauliY(Qureg qureg, int *controls, int *states, int numControls, int target)
void applyMultiControlledPauliY(Qureg qureg, int *controls, int numControls, int target)
void applyControlledPauliZ(Qureg qureg, int control, int target)
void applyMultiControlledPauliX(Qureg qureg, int *controls, int numControls, int target)
void applyPauliZ(Qureg qureg, int target)
void applyMultiStateControlledPauliZ(Qureg qureg, int *controls, int *states, int numControls, int target)
void applyPauliY(Qureg qureg, int target)
void applyControlledPauliY(Qureg qureg, int control, int target)
void applyMultiStateControlledPauliX(Qureg qureg, int *controls, int *states, int numControls, int target)
void applyMultiControlledPauliGadget(Qureg qureg, int *controls, int numControls, PauliStr str, qreal angle)
void multiplyPauliGadget(Qureg qureg, PauliStr str, qreal angle)
void applyControlledPauliGadget(Qureg qureg, int control, PauliStr str, qreal angle)
void applyMultiStateControlledPauliGadget(Qureg qureg, int *controls, int *states, int numControls, PauliStr str, qreal angle)
void applyPauliGadget(Qureg qureg, PauliStr str, qreal angle)
void applyMultiControlledPauliStr(Qureg qureg, int *controls, int numControls, PauliStr str)
void multiplyPauliStr(Qureg qureg, PauliStr str)
void applyPauliStr(Qureg qureg, PauliStr str)
void applyMultiStateControlledPauliStr(Qureg qureg, int *controls, int *states, int numControls, PauliStr str)
void applyControlledPauliStr(Qureg qureg, int control, PauliStr str)
void multiplyPauliStrSum(Qureg qureg, PauliStrSum sum, Qureg workspace)
void applyTrotterizedPauliStrSumGadget(Qureg qureg, PauliStrSum sum, qreal angle, int order, int reps)
void applyControlledPhaseGadget(Qureg qureg, int control, int *targets, int numTargets, qreal angle)
void applyMultiControlledPhaseGadget(Qureg qureg, int *controls, int numControls, int *targets, int numTargets, qreal angle)
void applyMultiQubitPhaseShift(Qureg qureg, int *targets, int numTargets, qreal angle)
void applyTwoQubitPhaseShift(Qureg qureg, int target1, int target2, qreal angle)
void applyTwoQubitPhaseFlip(Qureg qureg, int target1, int target2)
void applyMultiStateControlledPhaseGadget(Qureg qureg, int *controls, int *states, int numControls, int *targets, int numTargets, qreal angle)
void applyPhaseShift(Qureg qureg, int target, qreal angle)
void applyPhaseFlip(Qureg qureg, int target)
void multiplyPhaseGadget(Qureg qureg, int *targets, int numTargets, qreal angle)
void applyMultiQubitPhaseFlip(Qureg qureg, int *targets, int numTargets)
void applyPhaseGadget(Qureg qureg, int *targets, int numTargets, qreal angle)
void applyMultiQubitProjector(Qureg qureg, int *qubits, int *outcomes, int numQubits)
void applyQubitProjector(Qureg qureg, int target, int outcome)
void applyFullQuantumFourierTransform(Qureg qureg)
void applyQuantumFourierTransform(Qureg qureg, int *targets, int numTargets)
void applyMultiStateControlledRotateY(Qureg qureg, int *controls, int *states, int numControls, int target, qreal angle)
void applyControlledRotateZ(Qureg qureg, int control, int target, qreal angle)
void applyMultiControlledRotateX(Qureg qureg, int *controls, int numControls, int target, qreal angle)
void applyMultiStateControlledRotateX(Qureg qureg, int *controls, int *states, int numControls, int target, qreal angle)
void applyMultiControlledRotateZ(Qureg qureg, int *controls, int numControls, int target, qreal angle)
void applyMultiStateControlledRotateZ(Qureg qureg, int *controls, int *states, int numControls, int target, qreal angle)
void applyRotateZ(Qureg qureg, int target, qreal angle)
void applyMultiStateControlledRotateAroundAxis(Qureg qureg, int *ctrls, int *states, int numCtrls, int targ, qreal angle, qreal axisX, qreal axisY, qreal axisZ)
void applyControlledRotateX(Qureg qureg, int control, int target, qreal angle)
void applyRotateY(Qureg qureg, int target, qreal angle)
void applyRotateX(Qureg qureg, int target, qreal angle)
void applyRotateAroundAxis(Qureg qureg, int targ, qreal angle, qreal axisX, qreal axisY, qreal axisZ)
void applyMultiControlledRotateAroundAxis(Qureg qureg, int *ctrls, int numCtrls, int targ, qreal angle, qreal axisX, qreal axisY, qreal axisZ)
void applyMultiControlledRotateY(Qureg qureg, int *controls, int numControls, int target, qreal angle)
void applyControlledRotateAroundAxis(Qureg qureg, int ctrl, int targ, qreal angle, qreal axisX, qreal axisY, qreal axisZ)
void applyControlledRotateY(Qureg qureg, int control, int target, qreal angle)
void applyMultiControlledSwap(Qureg qureg, int *controls, int numControls, int qubit1, int qubit2)
void applyControlledSwap(Qureg qureg, int control, int qubit1, int qubit2)
void applyMultiStateControlledSwap(Qureg qureg, int *controls, int *states, int numControls, int qubit1, int qubit2)
void applySwap(Qureg qureg, int qubit1, int qubit2)
void applyControlledSqrtSwap(Qureg qureg, int control, int target1, int target2)
void multiplySwap(Qureg qureg, int qubit1, int qubit2)
void applySqrtSwap(Qureg qureg, int target1, int target2)
void applyMultiControlledSqrtSwap(Qureg qureg, int *controls, int numControls, int target1, int target2)
void applyMultiStateControlledSqrtSwap(Qureg qureg, int *controls, int *states, int numControls, int target1, int target2)
PauliStr getPauliStr(const char *paulis, int *indices, int numPaulis)