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_hasOddNumY(
PauliStr str);
38void validateAndApplyAnyCtrlAnyTargUnitaryMatrix(
Qureg qureg,
int* ctrls,
int* states,
int numCtrls,
int* targs,
int numTargs, T matr,
const char* caller) {
39 validate_quregFields(qureg, caller);
40 validate_controlsAndTargets(qureg, ctrls, numCtrls, targs, numTargs, caller);
41 validate_controlStates(states, numCtrls, caller);
42 validate_matrixDimMatchesTargets(matr, numTargs, caller);
43 validate_matrixIsUnitary(matr, caller);
44 if (util_isDenseMatrixType<T>())
45 validate_mixedAmpsFitInNode(qureg, numTargs, caller);
47 auto ctrlVec = util_getVector(ctrls, numCtrls);
48 auto stateVec = util_getVector(states, numCtrls);
49 auto targVec = util_getVector(targs, numTargs);
52 localiser_statevec_anyCtrlAnyTargAnyMatr(qureg, ctrlVec, stateVec, targVec, matr, conj);
54 if (!qureg.isDensityMatrix)
58 ctrlVec = util_getBraQubits(ctrlVec, qureg);
59 targVec = util_getBraQubits(targVec, qureg);
60 localiser_statevec_anyCtrlAnyTargAnyMatr(qureg, ctrlVec, stateVec, targVec, matr, conj);
72 validate_quregFields(qureg, __func__);
73 validate_target(qureg, target, __func__);
74 validate_matrixFields(matrix, __func__);
77 localiser_statevec_anyCtrlOneTargDenseMatr(qureg, {}, {}, target, matrix, conj);
82 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, &target, 1, matrix, __func__);
87 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, &target, 1, matrix, __func__);
92 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, &target, 1, matrix, __func__);
97 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matrix, __func__);
108 validate_controlsMatchStates(controls.size(), states.size(), __func__);
122 validate_quregFields(qureg, __func__);
123 validate_twoTargets(qureg, target1, target2, __func__);
124 validate_matrixFields(matrix, __func__);
125 validate_mixedAmpsFitInNode(qureg, 2, __func__);
128 localiser_statevec_anyCtrlTwoTargDenseMatr(qureg, {}, {}, target1, target2, matrix, conj);
133 int targs[] = {target1, target2};
134 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, targs, 2, matrix, __func__);
139 int targs[] = {target1, target2};
140 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, targs, 2, matrix, __func__);
145 int targs[] = {target1, target2};
146 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, targs, 2, matrix, __func__);
151 int targs[] = {target1, target2};
152 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, targs, 2, matrix, __func__);
163 validate_controlsMatchStates(controls.size(), states.size(), __func__);
177 validate_quregFields(qureg, __func__);
178 validate_targets(qureg, targets, numTargets, __func__);
179 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
180 validate_mixedAmpsFitInNode(qureg, numTargets, __func__);
183 localiser_statevec_anyCtrlAnyTargDenseMatr(qureg, {}, {}, util_getVector(targets, numTargets), matrix, conj);
188 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, targets, numTargets, matrix, __func__);
193 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, targets, numTargets, matrix, __func__);
198 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, targets, numTargets, matrix, __func__);
203 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, targets, numTargets, matrix, __func__);
229 validate_controlsMatchStates(controls.size(), states.size(), __func__);
243 validate_quregFields(qureg, __func__);
244 validate_target(qureg, target, __func__);
245 validate_matrixFields(matrix, __func__);
248 localiser_statevec_anyCtrlOneTargDiagMatr(qureg, {}, {}, target, matrix, conj);
253 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, &target, 1, matrix, __func__);
258 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, &target, 1, matrix, __func__);
263 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, &target, 1, matrix, __func__);
268 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matrix, __func__);
279 validate_controlsMatchStates(controls.size(), states.size(), __func__);
293 validate_quregFields(qureg, __func__);
294 validate_twoTargets(qureg, target1, target2, __func__);
295 validate_matrixFields(matrix, __func__);
298 localiser_statevec_anyCtrlTwoTargDiagMatr(qureg, {}, {}, target1, target2, matrix, conj);
303 int targs[] = {target1, target2};
304 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, targs, 2, matrix, __func__);
309 int targs[] = {target1, target2};
310 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, targs, 2, matrix, __func__);
315 int targs[] = {target1, target2};
316 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, targs, 2, matrix, __func__);
321 int targs[] = {target1, target2};
322 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, targs, 2, matrix, __func__);
333 validate_controlsMatchStates(controls.size(), states.size(), __func__);
347 validate_quregFields(qureg, __func__);
348 validate_targets(qureg, targets, numTargets, __func__);
349 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
353 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, {}, {}, util_getVector(targets, numTargets), matrix, exponent, conj);
358 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, targets, numTargets, matrix, __func__);
363 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, targets, numTargets, matrix, __func__);
368 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, targets, numTargets, matrix, __func__);
373 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, targets, numTargets, matrix, __func__);
385 applyDiagMatr(qureg, targets.data(), targets.size(), matrix);
399 validate_controlsMatchStates(controls.size(), states.size(), __func__);
416 validate_quregFields(qureg, __func__);
417 validate_targets(qureg, targets, numTargets, __func__);
418 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
419 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
422 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, {}, {}, util_getVector(targets, numTargets), matrix, exponent, conj);
426 validate_quregFields(qureg, __func__);
427 validate_targets(qureg, targets, numTargets, __func__);
428 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
429 validate_matrixIsUnitary(matrix, __func__);
430 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
431 validate_unitaryExponentIsReal(exponent, __func__);
440 validate_quregFields(qureg, __func__);
441 validate_controlAndTargets(qureg, control, targets, numTargets, __func__);
442 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
443 validate_matrixIsUnitary(matrix, __func__);
444 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
445 validate_unitaryExponentIsReal(exponent, __func__);
454 validate_quregFields(qureg, __func__);
455 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
456 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
457 validate_matrixIsUnitary(matrix, __func__);
458 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
459 validate_unitaryExponentIsReal(exponent, __func__);
468 validate_quregFields(qureg, __func__);
469 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
470 validate_controlStates(states, numControls, __func__);
471 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
472 validate_matrixIsUnitary(matrix, __func__);
473 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
474 validate_unitaryExponentIsReal(exponent, __func__);
486 auto ctrlVec = util_getVector(controls, numControls);
487 auto stateVec = util_getVector(states, numControls);
488 auto targVec = util_getVector(targets, numTargets);
489 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, ctrlVec, stateVec, targVec, matrix, exponent, conj);
491 if (!qureg.isDensityMatrix)
495 ctrlVec = util_getBraQubits(ctrlVec, qureg);
496 targVec = util_getBraQubits(targVec, qureg);
497 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, ctrlVec, stateVec, targVec, matrix, exponent, conj);
523 validate_controlsMatchStates(controls.size(), states.size(), __func__);
537 validate_quregFields(qureg, __func__);
538 validate_matrixFields(matrix, __func__);
539 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
545 validate_quregFields(qureg, __func__);
546 validate_matrixFields(matrix, __func__);
547 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
548 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
550 bool onlyMultiply =
true;
551 (qureg.isDensityMatrix)?
552 localiser_densmatr_allTargDiagMatr(qureg, matrix, exponent, onlyMultiply):
553 localiser_statevec_allTargDiagMatr(qureg, matrix, exponent);
557 validate_quregFields(qureg, __func__);
558 validate_matrixFields(matrix, __func__);
559 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
560 validate_matrixIsUnitary(matrix, __func__);
566 validate_quregFields(qureg, __func__);
567 validate_matrixFields(matrix, __func__);
568 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
569 validate_matrixIsUnitary(matrix, __func__);
570 validate_unitaryExponentIsReal(exponent, __func__);
571 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
573 bool onlyMultiply =
false;
574 (qureg.isDensityMatrix)?
575 localiser_densmatr_allTargDiagMatr(qureg, matrix, exponent, onlyMultiply):
576 localiser_statevec_allTargDiagMatr(qureg, matrix, exponent);
590 validate_quregFields(qureg, __func__);
591 validate_target(qureg, target, __func__);
598 validate_quregFields(qureg, __func__);
599 validate_controlAndTarget(qureg, control, target, __func__);
606 validate_quregFields(qureg, __func__);
607 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
616 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matr, __func__);
627 validate_controlsMatchStates(controls.size(), states.size(), __func__);
641 validate_quregFields(qureg, __func__);
642 validate_target(qureg, target, __func__);
649 validate_quregFields(qureg, __func__);
650 validate_controlAndTarget(qureg, control, target, __func__);
657 validate_quregFields(qureg, __func__);
658 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
667 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matr, __func__);
678 validate_controlsMatchStates(controls.size(), states.size(), __func__);
692 validate_quregFields(qureg, __func__);
693 validate_target(qureg, target, __func__);
700 validate_quregFields(qureg, __func__);
701 validate_controlAndTarget(qureg, control, target, __func__);
708 validate_quregFields(qureg, __func__);
709 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
717 qcomp a = 1/std::sqrt(2);
722 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matr, __func__);
733 validate_controlsMatchStates(controls.size(), states.size(), __func__);
747 validate_quregFields(qureg, __func__);
748 validate_twoTargets(qureg, qubit1, qubit2, __func__);
750 localiser_statevec_anyCtrlSwap(qureg, {}, {}, qubit1, qubit2);
754 validate_quregFields(qureg, __func__);
755 validate_twoTargets(qureg, qubit1, qubit2, __func__);
762 validate_quregFields(qureg, __func__);
763 validate_controlAndTwoTargets(qureg, control, qubit1, qubit2, __func__);
770 validate_quregFields(qureg, __func__);
771 validate_controlsAndTwoTargets(qureg, controls, numControls, qubit1, qubit2, __func__);
778 validate_quregFields(qureg, __func__);
779 validate_controlsAndTwoTargets(qureg, controls, numControls, qubit1, qubit2, __func__);
780 validate_controlStates(states, numControls, __func__);
782 auto ctrlVec = util_getVector(controls, numControls);
783 auto stateVec = util_getVector(states, numControls);
784 localiser_statevec_anyCtrlSwap(qureg, ctrlVec, stateVec, qubit1, qubit2);
786 if (!qureg.isDensityMatrix)
789 ctrlVec = util_getBraQubits(ctrlVec, qureg);
790 qubit1 = util_getBraQubit(qubit1, qureg);
791 qubit2 = util_getBraQubit(qubit2, qureg);
792 localiser_statevec_anyCtrlSwap(qureg, ctrlVec, stateVec, qubit1, qubit2);
803 validate_controlsMatchStates(controls.size(), states.size(), __func__);
817 validate_quregFields(qureg, __func__);
818 validate_twoTargets(qureg,target1, target2, __func__);
825 validate_quregFields(qureg, __func__);
826 validate_controlAndTwoTargets(qureg, control, target1, target2, __func__);
833 validate_quregFields(qureg, __func__);
834 validate_controlsAndTwoTargets(qureg, controls, numControls, target1, target2, __func__);
841 validate_quregFields(qureg, __func__);
842 validate_controlsAndTwoTargets(qureg, controls, numControls, target1, target2, __func__);
843 validate_controlStates(states, numControls, __func__);
851 validate_mixedAmpsFitInNode(qureg, 2, __func__);
855 {0, .5+.5_i, .5-.5_i, 0},
856 {0, .5-.5_i, .5+.5_i, 0},
870 validate_controlsMatchStates(controls.size(), states.size(), __func__);
887 validate_quregFields(qureg, __func__);
888 validate_target(qureg, target, __func__);
895 validate_quregFields(qureg, __func__);
896 validate_target(qureg, target, __func__);
903 validate_quregFields(qureg, __func__);
904 validate_target(qureg, target, __func__);
911 validate_quregFields(qureg, __func__);
912 validate_controlAndTarget(qureg, control, target, __func__);
919 validate_quregFields(qureg, __func__);
920 validate_controlAndTarget(qureg, control, target, __func__);
927 validate_quregFields(qureg, __func__);
928 validate_controlAndTarget(qureg, control, target, __func__);
935 validate_quregFields(qureg, __func__);
936 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
943 validate_quregFields(qureg, __func__);
944 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
951 validate_quregFields(qureg, __func__);
952 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
959 validate_quregFields(qureg, __func__);
960 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
961 validate_controlStates(states, numControls, __func__);
968 validate_quregFields(qureg, __func__);
969 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
970 validate_controlStates(states, numControls, __func__);
977 validate_quregFields(qureg, __func__);
978 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
979 validate_controlStates(states, numControls, __func__);
1004 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1010 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1016 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1030 validate_quregFields(qureg, __func__);
1031 validate_pauliStrTargets(qureg, str, __func__);
1033 localiser_statevec_anyCtrlPauliTensor(qureg, {}, {}, str);
1037 validate_quregFields(qureg, __func__);
1038 validate_pauliStrTargets(qureg, str, __func__);
1045 validate_quregFields(qureg, __func__);
1046 validate_controlAndPauliStrTargets(qureg, control, str, __func__);
1053 validate_quregFields(qureg, __func__);
1054 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1061 validate_quregFields(qureg, __func__);
1062 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1063 validate_controlStates(states, numControls, __func__);
1066 auto ctrlVec = util_getVector(controls, numControls);
1067 auto stateVec = util_getVector(states, numControls);
1072 if (qureg.isDensityMatrix && numControls == 0) {
1073 factor = paulis_hasOddNumY(str)? -1 : 1;
1074 ctrlVec = util_getConcatenated(ctrlVec, util_getBraQubits(ctrlVec, qureg));
1075 stateVec = util_getConcatenated(stateVec, stateVec);
1076 str = paulis_getKetAndBraPauliStr(str, qureg);
1079 localiser_statevec_anyCtrlPauliTensor(qureg, ctrlVec, stateVec, str, factor);
1082 if (qureg.isDensityMatrix && numControls > 0) {
1083 factor = paulis_hasOddNumY(str)? -1 : 1;
1084 ctrlVec = util_getBraQubits(ctrlVec, qureg);
1085 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
1086 localiser_statevec_anyCtrlPauliTensor(qureg, ctrlVec, stateVec, str, factor);
1098 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1112 validate_quregFields(qureg, __func__);
1113 validate_quregFields(workspace, __func__);
1114 validate_quregCanBeWorkspace(qureg, workspace, __func__);
1115 validate_pauliStrSumFields(sum, __func__);
1116 validate_pauliStrSumTargets(sum, qureg, __func__);
1119 localiser_statevec_setQuregToSuperposition(0, workspace, 1, qureg, 0, qureg);
1120 localiser_statevec_initUniformState(qureg, 0);
1123 for (qindex i=0; i<sum.numTerms; i++) {
1124 localiser_statevec_anyCtrlPauliTensor(workspace, {}, {}, sum.strings[i]);
1125 localiser_statevec_setQuregToSuperposition(1, qureg, sum.coeffs[i], workspace, 0, workspace);
1126 localiser_statevec_anyCtrlPauliTensor(workspace, {}, {}, sum.strings[i]);
1132void applyFirstOrderTrotter(
Qureg qureg,
PauliStrSum sum, qreal angle,
bool reverse) {
1136 for (qindex i=0; i<sum.numTerms; i++) {
1137 int j = reverse? sum.numTerms - i - 1 : i;
1138 qreal arg = 2 * angle * std::real(sum.coeffs[j]);
1143void applyHigherOrderTrotter(
Qureg qureg,
PauliStrSum sum, qreal angle,
int order) {
1148 applyFirstOrderTrotter(qureg, sum, angle,
false);
1150 }
else if (order == 2) {
1151 applyFirstOrderTrotter(qureg, sum, angle/2,
false);
1152 applyFirstOrderTrotter(qureg, sum, angle/2,
true);
1155 qreal p = 1. / (4 - std::pow(4, 1./(order-1)));
1156 qreal a = p * angle;
1157 qreal b = (1-4*p) * angle;
1159 int lower = order - 2;
1160 applyFirstOrderTrotter(qureg, sum, a, lower);
1161 applyFirstOrderTrotter(qureg, sum, a, lower);
1162 applyFirstOrderTrotter(qureg, sum, b, lower);
1163 applyFirstOrderTrotter(qureg, sum, a, lower);
1164 applyFirstOrderTrotter(qureg, sum, a, lower);
1169 validate_quregFields(qureg, __func__);
1170 validate_pauliStrSumFields(sum, __func__);
1171 validate_pauliStrSumTargets(sum, qureg, __func__);
1172 validate_pauliStrSumIsHermitian(sum, __func__);
1173 validate_trotterParams(qureg, order, reps, __func__);
1183 for (
int r=0; r<reps; r++)
1184 applyHigherOrderTrotter(qureg, sum, angle/reps, order);
1200 validate_quregFields(qureg, __func__);
1201 validate_target(qureg, target, __func__);
1208 validate_quregFields(qureg, __func__);
1209 validate_target(qureg, target, __func__);
1216 validate_quregFields(qureg, __func__);
1217 validate_target(qureg, target, __func__);
1224 validate_quregFields(qureg, __func__);
1225 validate_controlAndTarget(qureg, control, target, __func__);
1232 validate_quregFields(qureg, __func__);
1233 validate_controlAndTarget(qureg, control, target, __func__);
1240 validate_quregFields(qureg, __func__);
1241 validate_controlAndTarget(qureg, control, target, __func__);
1248 validate_quregFields(qureg, __func__);
1249 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1256 validate_quregFields(qureg, __func__);
1257 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1264 validate_quregFields(qureg, __func__);
1265 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1272 validate_quregFields(qureg, __func__);
1273 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1274 validate_controlStates(states, numControls, __func__);
1281 validate_quregFields(qureg, __func__);
1282 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1283 validate_controlStates(states, numControls, __func__);
1290 validate_quregFields(qureg, __func__);
1291 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1292 validate_controlStates(states, numControls, __func__);
1316 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1322 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1328 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1342 validate_quregFields(qureg, __func__);
1343 validate_target(qureg, targ, __func__);
1344 validate_rotationAxisNotZeroVector(axisX, axisY, axisZ, __func__);
1350 validate_quregFields(qureg, __func__);
1351 validate_controlAndTarget(qureg, ctrl, targ, __func__);
1352 validate_rotationAxisNotZeroVector(axisX, axisY, axisZ, __func__);
1358 validate_quregFields(qureg, __func__);
1359 validate_controlsAndTarget(qureg, ctrls, numCtrls, targ, __func__);
1360 validate_rotationAxisNotZeroVector(axisX, axisY, axisZ, __func__);
1366 validate_quregFields(qureg, __func__);
1367 validate_controlsAndTarget(qureg, ctrls, numCtrls, targ, __func__);
1368 validate_controlStates(states, numCtrls, __func__);
1369 validate_rotationAxisNotZeroVector(axisX, axisY, axisZ, __func__);
1372 qreal norm = std::sqrt(std::pow(axisX,2) + std::pow(axisY,2) + std::pow(axisZ,2));
1375 qreal c = std::cos(angle/2);
1376 qreal s = std::sin(angle/2);
1377 qcomp u11 = c - (s * axisZ * 1_i) / norm;
1378 qcomp u12 = - (s * (axisY + axisX * 1_i)) / norm;
1379 qcomp u21 = (s * (axisY - axisX * 1_i)) / norm;
1380 qcomp u22 = c + (s * axisZ * 1_i) / norm;
1395 validate_controlsMatchStates(ctrls.size(), states.size(), __func__);
1409 validate_quregFields(qureg, __func__);
1410 validate_pauliStrTargets(qureg, str, __func__);
1412 qreal phase = util_getPhaseFromGateAngle(angle);
1413 localiser_statevec_anyCtrlPauliGadget(qureg, {}, {}, str, phase);
1417 validate_quregFields(qureg, __func__);
1418 validate_pauliStrTargets(qureg, str, __func__);
1424 validate_quregFields(qureg, __func__);
1425 validate_controlAndPauliStrTargets(qureg, control, str, __func__);
1431 validate_quregFields(qureg, __func__);
1432 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1438 validate_quregFields(qureg, __func__);
1439 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1440 validate_controlStates(states, numControls, __func__);
1448 qreal phase = util_getPhaseFromGateAngle(angle);
1449 auto ctrlVec = util_getVector(controls, numControls);
1450 auto stateVec = util_getVector(states, numControls);
1451 localiser_statevec_anyCtrlPauliGadget(qureg, ctrlVec, stateVec, str, phase);
1453 if (!qureg.isDensityMatrix)
1457 phase *= paulis_hasOddNumY(str) ? 1 : -1;
1458 ctrlVec = util_getBraQubits(ctrlVec, qureg);
1459 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
1460 localiser_statevec_anyCtrlPauliGadget(qureg, ctrlVec, stateVec, str, phase);
1471 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1485 validate_quregFields(qureg, __func__);
1486 validate_targets(qureg, targets, numTargets, __func__);
1488 qreal phase = util_getPhaseFromGateAngle(angle);
1489 localiser_statevec_anyCtrlPhaseGadget(qureg, {}, {}, util_getVector(targets,numTargets), phase);
1493 validate_quregFields(qureg, __func__);
1494 validate_targets(qureg, targets, numTargets, __func__);
1501 validate_quregFields(qureg, __func__);
1502 validate_controlAndTargets(qureg, control, targets, numTargets, __func__);
1509 validate_quregFields(qureg, __func__);
1510 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
1517 validate_quregFields(qureg, __func__);
1518 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
1519 validate_controlStates(states, numControls, __func__);
1521 qreal phase = util_getPhaseFromGateAngle(angle);
1522 auto ctrlVec = util_getVector(controls, numControls);
1523 auto targVec = util_getVector(targets, numTargets);
1524 auto stateVec = util_getVector(states, numControls);
1525 localiser_statevec_anyCtrlPhaseGadget(qureg, ctrlVec, stateVec, targVec, phase);
1527 if (!qureg.isDensityMatrix)
1531 ctrlVec = util_getBraQubits(ctrlVec, qureg);
1532 targVec = util_getBraQubits(targVec, qureg);
1533 localiser_statevec_anyCtrlPhaseGadget(qureg, ctrlVec, stateVec, targVec, phase);
1559 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1573 validate_quregFields(qureg, __func__);
1574 validate_target(qureg, target, __func__);
1581 validate_quregFields(qureg, __func__);
1582 validate_twoTargets(qureg, target1, target2, __func__);
1585 int targets[] = {target1, target2};
1590 validate_quregFields(qureg, __func__);
1591 validate_targets(qureg, targets, numTargets, __func__);
1616 validate_quregFields(qureg, __func__);
1617 validate_target(qureg, target, __func__);
1624 validate_quregFields(qureg, __func__);
1625 validate_twoTargets(qureg, target1, target2, __func__);
1628 int targets[] = {target1, target2};
1633 validate_quregFields(qureg, __func__);
1634 validate_targets(qureg, targets, numTargets, __func__);
1659 validate_quregFields(qureg, __func__);
1660 validate_targets(qureg, targets, numTargets, __func__);
1667 validate_quregFields(qureg, __func__);
1668 validate_targets(qureg, targets, numTargets, __func__);
1675 validate_quregFields(qureg, __func__);
1676 validate_controlAndTargets(qureg, control, targets, numTargets, __func__);
1683 validate_quregFields(qureg, __func__);
1684 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
1691 validate_quregFields(qureg, __func__);
1692 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
1693 validate_controlStates(states, numControls, __func__);
1725 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1739 validate_quregFields(qureg, __func__);
1740 validate_target(qureg, target, __func__);
1741 validate_measurementOutcomeIsValid(outcome, __func__);
1745 (qureg.isDensityMatrix)?
1746 localiser_densmatr_multiQubitProjector(qureg, {target}, {outcome}, prob):
1747 localiser_statevec_multiQubitProjector(qureg, {target}, {outcome}, prob);
1751 validate_quregFields(qureg, __func__);
1752 validate_targets(qureg, qubits, numQubits, __func__);
1753 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
1756 auto qubitVec = util_getVector(qubits, numQubits);
1757 auto outcomeVec = util_getVector(outcomes, numQubits);
1759 (qureg.isDensityMatrix)?
1760 localiser_densmatr_multiQubitProjector(qureg, qubitVec, outcomeVec, prob):
1761 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, prob);
1767 validate_measurementOutcomesMatchTargets(qubits.size(), outcomes.size(), __func__);
1781 validate_quregFields(qureg, __func__);
1782 validate_target(qureg, target, __func__);
1789 validate_quregFields(qureg, __func__);
1790 validate_target(qureg, target, __func__);
1796 vector<qreal> probs(2);
1799 validate_measurementProbsAreNormalised(probs, __func__);
1802 int outcome = rand_getRandomSingleQubitOutcome(probs[0]);
1803 *probability = probs[outcome];
1806 (qureg.isDensityMatrix)?
1807 localiser_densmatr_multiQubitProjector(qureg, {target}, {outcome}, *probability):
1808 localiser_statevec_multiQubitProjector(qureg, {target}, {outcome}, *probability);
1814 validate_quregFields(qureg, __func__);
1815 validate_target(qureg, target, __func__);
1816 validate_measurementOutcomeIsValid(outcome, __func__);
1822 validate_measurementOutcomeProbNotZero(outcome, prob, __func__);
1825 (qureg.isDensityMatrix)?
1826 localiser_densmatr_multiQubitProjector(qureg, {target}, {outcome}, prob):
1827 localiser_statevec_multiQubitProjector(qureg, {target}, {outcome}, prob);
1833 validate_quregFields(qureg, __func__);
1834 validate_targets(qureg, qubits, numQubits, __func__);
1843 validate_quregFields(qureg, __func__);
1844 validate_targets(qureg, qubits, numQubits, __func__);
1847 qindex numProbs = powerOf2(numQubits);
1850 vector<qreal> probs;
1851 auto callback = [&]() { validate_tempAllocSucceeded(
false, numProbs,
sizeof(qreal), __func__); };
1852 util_tryAllocVector(probs, numProbs, callback);
1858 validate_measurementProbsAreNormalised(probs, __func__);
1861 qindex outcome = rand_getRandomMultiQubitOutcome(probs);
1862 *probability = probs[outcome];
1865 auto qubitVec = util_getVector(qubits, numQubits);
1866 auto outcomeVec = vector<int>(numQubits);
1867 getBitsFromInteger(outcomeVec.data(), outcome, numQubits);
1870 (qureg.isDensityMatrix)?
1871 localiser_densmatr_multiQubitProjector(qureg, qubitVec, outcomeVec, *probability):
1872 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, *probability);
1878 validate_quregFields(qureg, __func__);
1879 validate_targets(qureg, qubits, numQubits, __func__);
1880 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
1882 auto qubitVec = util_getVector(qubits, numQubits);
1883 auto outcomeVec = util_getVector(outcomes, numQubits);
1887 validate_measurementOutcomesProbNotZero(outcomes, numQubits, prob, __func__);
1890 (qureg.isDensityMatrix)?
1891 localiser_densmatr_multiQubitProjector(qureg, qubitVec, outcomeVec, prob):
1892 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, prob);
1905 validate_measurementOutcomesMatchTargets(qubits.size(), outcomes.size(), __func__);
1919 validate_quregFields(qureg, __func__);
1920 validate_targets(qureg, targets, numTargets, __func__);
1926 for (
int n=numTargets-1; n>=0; n--) {
1928 for (
int m=0; m<n; m++) {
1929 qreal arg = const_PI / powerOf2(m+1);
1934 int mid = numTargets/2;
1935 for (
int n=0; n<mid; n++)
1936 applySwap(qureg, targets[n], targets[numTargets-1-n]);
1940 validate_quregFields(qureg, __func__);
1943 vector<int> targets(qureg.numQubits);
1944 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 applyRotateAroundAxis(Qureg qureg, int targ, qreal angle, qreal axisX, qreal axisY, qreal axisZ)
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 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)