10#include "quest/include/qureg.h"
11#include "quest/include/paulis.h"
12#include "quest/include/matrices.h"
13#include "quest/include/operations.h"
14#include "quest/include/calculations.h"
16#include "quest/src/core/validation.hpp"
17#include "quest/src/core/utilities.hpp"
18#include "quest/src/core/randomiser.hpp"
19#include "quest/src/core/localiser.hpp"
20#include "quest/src/core/bitwise.hpp"
21#include "quest/src/core/constants.hpp"
22#include "quest/src/core/paulilogic.hpp"
36void validateAndApplyAnyCtrlAnyTargUnitaryMatrix(
Qureg qureg,
int* ctrls,
int* states,
int numCtrls,
int* targs,
int numTargs, T matr,
const char* caller) {
37 validate_quregFields(qureg, caller);
38 validate_controlsAndTargets(qureg, ctrls, numCtrls, targs, numTargs, caller);
39 validate_controlStates(states, numCtrls, caller);
40 validate_matrixDimMatchesTargets(matr, numTargs, caller);
41 validate_matrixIsUnitary(matr, caller);
42 if (util_isDenseMatrixType<T>())
43 validate_mixedAmpsFitInNode(qureg, numTargs, caller);
45 List64 ctrlList = lists_getList64(ctrls, numCtrls);
46 List64 stateList = util_getList64OrAllOnes(states, numCtrls);
47 List64 targList = lists_getList64(targs, numTargs);
50 localiser_statevec_anyCtrlAnyTargAnyMatr(qureg, ctrlList, stateList, targList, matr, conj);
52 if (!qureg.isDensityMatrix)
56 ctrlList = util_getBraQubits(ctrlList, qureg);
57 targList = util_getBraQubits(targList, qureg);
58 localiser_statevec_anyCtrlAnyTargAnyMatr(qureg, ctrlList, stateList, targList, matr, conj);
77 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, &target, 1, matrix, __func__);
82 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, &target, 1, matrix, __func__);
87 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, &target, 1, matrix, __func__);
92 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matrix, __func__);
103 validate_controlsMatchStates(controls.size(), states.size(), __func__);
118 int targs[] = {target1, target2};
119 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, targs, 2, matrix, __func__);
124 int targs[] = {target1, target2};
125 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, targs, 2, matrix, __func__);
130 int targs[] = {target1, target2};
131 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, targs, 2, matrix, __func__);
136 int targs[] = {target1, target2};
137 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, targs, 2, matrix, __func__);
148 validate_controlsMatchStates(controls.size(), states.size(), __func__);
163 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, targets, numTargets, matrix, __func__);
168 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, targets, numTargets, matrix, __func__);
173 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, targets, numTargets, matrix, __func__);
178 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, targets, numTargets, matrix, __func__);
199 validate_controlsMatchStates(controls.size(), states.size(), __func__);
214 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, &target, 1, matrix, __func__);
219 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, &target, 1, matrix, __func__);
224 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, &target, 1, matrix, __func__);
229 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matrix, __func__);
240 validate_controlsMatchStates(controls.size(), states.size(), __func__);
255 int targs[] = {target1, target2};
256 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, targs, 2, matrix, __func__);
261 int targs[] = {target1, target2};
262 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, targs, 2, matrix, __func__);
267 int targs[] = {target1, target2};
268 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, targs, 2, matrix, __func__);
273 int targs[] = {target1, target2};
274 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, targs, 2, matrix, __func__);
285 validate_controlsMatchStates(controls.size(), states.size(), __func__);
300 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg,
nullptr,
nullptr, 0, targets, numTargets, matrix, __func__);
305 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control,
nullptr, 1, targets, numTargets, matrix, __func__);
310 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls,
nullptr, numControls, targets, numTargets, matrix, __func__);
315 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, targets, numTargets, matrix, __func__);
322 applyDiagMatr(qureg, targets.data(), targets.size(), matrix);
336 validate_controlsMatchStates(controls.size(), states.size(), __func__);
353 validate_quregFields(qureg, __func__);
354 validate_targets(qureg, targets, numTargets, __func__);
355 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
356 validate_matrixIsUnitary(matrix, __func__);
357 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
358 validate_unitaryExponentIsReal(exponent, __func__);
367 validate_quregFields(qureg, __func__);
368 validate_controlAndTargets(qureg, control, targets, numTargets, __func__);
369 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
370 validate_matrixIsUnitary(matrix, __func__);
371 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
372 validate_unitaryExponentIsReal(exponent, __func__);
381 validate_quregFields(qureg, __func__);
382 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
383 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
384 validate_matrixIsUnitary(matrix, __func__);
385 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
386 validate_unitaryExponentIsReal(exponent, __func__);
395 validate_quregFields(qureg, __func__);
396 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
397 validate_controlStates(states, numControls, __func__);
398 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
399 validate_matrixIsUnitary(matrix, __func__);
400 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
401 validate_unitaryExponentIsReal(exponent, __func__);
413 auto ctrlList = lists_getList64(controls, numControls);
414 auto stateList = util_getList64OrAllOnes(states, numControls);
415 auto targList = lists_getList64(targets, numTargets);
416 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, ctrlList, stateList, targList, matrix, exponent, conj);
418 if (!qureg.isDensityMatrix)
422 ctrlList = util_getBraQubits(ctrlList, qureg);
423 targList = util_getBraQubits(targList, qureg);
424 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, ctrlList, stateList, targList, matrix, exponent, conj);
445 validate_controlsMatchStates(controls.size(), states.size(), __func__);
459 validate_quregFields(qureg, __func__);
460 validate_matrixFields(matrix, __func__);
461 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
462 validate_matrixIsUnitary(matrix, __func__);
468 validate_quregFields(qureg, __func__);
469 validate_matrixFields(matrix, __func__);
470 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
471 validate_matrixIsUnitary(matrix, __func__);
472 validate_unitaryExponentIsReal(exponent, __func__);
473 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
476 bool leftMultiply =
true;
477 bool rightMultiply =
true;
478 bool rightConj =
true;
480 (qureg.isDensityMatrix)?
481 localiser_densmatr_allTargDiagMatr(qureg, matrix, exponent, leftMultiply, rightMultiply, rightConj):
482 localiser_statevec_allTargDiagMatr(qureg, matrix, exponent);
496 validate_quregFields(qureg, __func__);
497 validate_target(qureg, target, __func__);
504 validate_quregFields(qureg, __func__);
505 validate_controlAndTarget(qureg, control, target, __func__);
512 validate_quregFields(qureg, __func__);
513 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
522 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matr, __func__);
533 validate_controlsMatchStates(controls.size(), states.size(), __func__);
547 validate_quregFields(qureg, __func__);
548 validate_target(qureg, target, __func__);
555 validate_quregFields(qureg, __func__);
556 validate_controlAndTarget(qureg, control, target, __func__);
563 validate_quregFields(qureg, __func__);
564 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
573 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matr, __func__);
584 validate_controlsMatchStates(controls.size(), states.size(), __func__);
598 validate_quregFields(qureg, __func__);
599 validate_target(qureg, target, __func__);
606 validate_quregFields(qureg, __func__);
607 validate_controlAndTarget(qureg, control, target, __func__);
614 validate_quregFields(qureg, __func__);
615 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
623 static const qcomp a = 1 / std::sqrt(2);
628 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matr, __func__);
639 validate_controlsMatchStates(controls.size(), states.size(), __func__);
653 validate_quregFields(qureg, __func__);
654 validate_twoTargets(qureg, qubit1, qubit2, __func__);
661 validate_quregFields(qureg, __func__);
662 validate_controlAndTwoTargets(qureg, control, qubit1, qubit2, __func__);
669 validate_quregFields(qureg, __func__);
670 validate_controlsAndTwoTargets(qureg, controls, numControls, qubit1, qubit2, __func__);
677 validate_quregFields(qureg, __func__);
678 validate_controlsAndTwoTargets(qureg, controls, numControls, qubit1, qubit2, __func__);
679 validate_controlStates(states, numControls, __func__);
681 auto ctrlList = lists_getList64(controls, numControls);
682 auto stateList = util_getList64OrAllOnes(states, numControls);
683 localiser_statevec_anyCtrlSwap(qureg, ctrlList, stateList, qubit1, qubit2);
685 if (!qureg.isDensityMatrix)
688 ctrlList = util_getBraQubits(ctrlList, qureg);
689 qubit1 = util_getBraQubit(qubit1, qureg);
690 qubit2 = util_getBraQubit(qubit2, qureg);
691 localiser_statevec_anyCtrlSwap(qureg, ctrlList, stateList, qubit1, qubit2);
702 validate_controlsMatchStates(controls.size(), states.size(), __func__);
716 validate_quregFields(qureg, __func__);
717 validate_twoTargets(qureg,target1, target2, __func__);
724 validate_quregFields(qureg, __func__);
725 validate_controlAndTwoTargets(qureg, control, target1, target2, __func__);
732 validate_quregFields(qureg, __func__);
733 validate_controlsAndTwoTargets(qureg, controls, numControls, target1, target2, __func__);
740 validate_quregFields(qureg, __func__);
741 validate_controlsAndTwoTargets(qureg, controls, numControls, target1, target2, __func__);
742 validate_controlStates(states, numControls, __func__);
750 validate_mixedAmpsFitInNode(qureg, 2, __func__);
754 {0, .5+.5_i, .5-.5_i, 0},
755 {0, .5-.5_i, .5+.5_i, 0},
769 validate_controlsMatchStates(controls.size(), states.size(), __func__);
786 validate_quregFields(qureg, __func__);
787 validate_target(qureg, target, __func__);
794 validate_quregFields(qureg, __func__);
795 validate_target(qureg, target, __func__);
802 validate_quregFields(qureg, __func__);
803 validate_target(qureg, target, __func__);
810 validate_quregFields(qureg, __func__);
811 validate_controlAndTarget(qureg, control, target, __func__);
818 validate_quregFields(qureg, __func__);
819 validate_controlAndTarget(qureg, control, target, __func__);
826 validate_quregFields(qureg, __func__);
827 validate_controlAndTarget(qureg, control, target, __func__);
834 validate_quregFields(qureg, __func__);
835 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
842 validate_quregFields(qureg, __func__);
843 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
850 validate_quregFields(qureg, __func__);
851 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
858 validate_quregFields(qureg, __func__);
859 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
860 validate_controlStates(states, numControls, __func__);
872 static const CompMatr1 matrix = util_getPauliX();
873 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matrix, __func__);
877 validate_quregFields(qureg, __func__);
878 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
879 validate_controlStates(states, numControls, __func__);
882 static const CompMatr1 matrix = util_getPauliY();
883 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matrix, __func__);
887 validate_quregFields(qureg, __func__);
888 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
889 validate_controlStates(states, numControls, __func__);
892 static const DiagMatr1 matrix = util_getPauliZ();
893 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matrix, __func__);
914 validate_controlsMatchStates(controls.size(), states.size(), __func__);
920 validate_controlsMatchStates(controls.size(), states.size(), __func__);
926 validate_controlsMatchStates(controls.size(), states.size(), __func__);
940 validate_quregFields(qureg, __func__);
941 validate_pauliStrTargets(qureg, str, __func__);
948 validate_quregFields(qureg, __func__);
949 validate_controlAndPauliStrTargets(qureg, control, str, __func__);
956 validate_quregFields(qureg, __func__);
957 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
964 validate_quregFields(qureg, __func__);
965 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
966 validate_controlStates(states, numControls, __func__);
969 auto ctrlList = lists_getList64(controls, numControls);
970 auto stateList = util_getList64OrAllOnes(states, numControls);
975 if (qureg.isDensityMatrix && numControls == 0) {
976 factor = paulis_getSignOfPauliStrConj(str);
977 ctrlList = util_getConcatenated(ctrlList, util_getBraQubits(ctrlList, qureg));
978 stateList = util_getConcatenated(stateList, stateList);
979 str = paulis_getKetAndBraPauliStr(str, qureg);
982 localiser_statevec_anyCtrlPauliTensor(qureg, ctrlList, stateList, str, factor);
985 if (qureg.isDensityMatrix && numControls > 0) {
986 factor = paulis_getSignOfPauliStrConj(str);
987 ctrlList = util_getBraQubits(ctrlList, qureg);
988 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
989 localiser_statevec_anyCtrlPauliTensor(qureg, ctrlList, stateList, str, factor);
1001 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1015 validate_quregFields(qureg, __func__);
1016 validate_target(qureg, target, __func__);
1023 validate_quregFields(qureg, __func__);
1024 validate_target(qureg, target, __func__);
1031 validate_quregFields(qureg, __func__);
1032 validate_target(qureg, target, __func__);
1039 validate_quregFields(qureg, __func__);
1040 validate_controlAndTarget(qureg, control, target, __func__);
1047 validate_quregFields(qureg, __func__);
1048 validate_controlAndTarget(qureg, control, target, __func__);
1055 validate_quregFields(qureg, __func__);
1056 validate_controlAndTarget(qureg, control, target, __func__);
1063 validate_quregFields(qureg, __func__);
1064 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1071 validate_quregFields(qureg, __func__);
1072 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1079 validate_quregFields(qureg, __func__);
1080 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1087 validate_quregFields(qureg, __func__);
1088 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1089 validate_controlStates(states, numControls, __func__);
1097 CompMatr1 matrix = util_getExpPauliX(angle);
1098 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matrix, __func__);
1102 validate_quregFields(qureg, __func__);
1103 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1104 validate_controlStates(states, numControls, __func__);
1112 CompMatr1 matrix = util_getExpPauliY(angle);
1113 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matrix, __func__);
1117 validate_quregFields(qureg, __func__);
1118 validate_controlsAndTarget(qureg, controls, numControls, target, __func__);
1119 validate_controlStates(states, numControls, __func__);
1127 DiagMatr1 matrix = util_getExpPauliZ(angle);
1128 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, &target, 1, matrix, __func__);
1149 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1155 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1161 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1175 validate_quregFields(qureg, __func__);
1176 validate_target(qureg, targ, __func__);
1177 validate_rotationAxisNotZeroVector(axisX, axisY, axisZ, __func__);
1183 validate_quregFields(qureg, __func__);
1184 validate_controlAndTarget(qureg, ctrl, targ, __func__);
1185 validate_rotationAxisNotZeroVector(axisX, axisY, axisZ, __func__);
1191 validate_quregFields(qureg, __func__);
1192 validate_controlsAndTarget(qureg, ctrls, numCtrls, targ, __func__);
1193 validate_rotationAxisNotZeroVector(axisX, axisY, axisZ, __func__);
1199 validate_quregFields(qureg, __func__);
1200 validate_controlsAndTarget(qureg, ctrls, numCtrls, targ, __func__);
1201 validate_controlStates(states, numCtrls, __func__);
1202 validate_rotationAxisNotZeroVector(axisX, axisY, axisZ, __func__);
1205 qreal norm = std::sqrt(std::pow(axisX,2) + std::pow(axisY,2) + std::pow(axisZ,2));
1208 qreal c = std::cos(angle/2);
1209 qreal s = std::sin(angle/2);
1210 qcomp u11 = c - (s * axisZ * 1_i) / norm;
1211 qcomp u12 = - (s * (axisY + axisX * 1_i)) / norm;
1212 qcomp u21 = (s * (axisY - axisX * 1_i)) / norm;
1213 qcomp u22 = c + (s * axisZ * 1_i) / norm;
1228 validate_controlsMatchStates(ctrls.size(), states.size(), __func__);
1242 validate_quregFields(qureg, __func__);
1243 validate_pauliStrTargets(qureg, str, __func__);
1249 validate_quregFields(qureg, __func__);
1250 validate_pauliStrTargets(qureg, str, __func__);
1252 qcomp phase = util_getPhaseFromGateAngle(angle);
1253 auto none = lists_getEmptyList64();
1254 localiser_statevec_anyCtrlPauliGadget(qureg, none, none, str, phase);
1256 if (!qureg.isDensityMatrix)
1260 phase = - std::conj(phase) * paulis_getSignOfPauliStrConj(str);
1261 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
1262 localiser_statevec_anyCtrlPauliGadget(qureg, none, none, str, phase);
1266 validate_quregFields(qureg, __func__);
1267 validate_controlAndPauliStrTargets(qureg, control, str, __func__);
1273 validate_quregFields(qureg, __func__);
1274 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1280 validate_quregFields(qureg, __func__);
1281 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1282 validate_controlStates(states, numControls, __func__);
1287 if (paulis_isIdentity(str) && numControls == 0 && qureg.isDensityMatrix)
1294 qreal phase = util_getPhaseFromGateAngle(angle);
1295 auto ctrlList = lists_getList64(controls, numControls);
1296 auto stateList = util_getList64OrAllOnes(states, numControls);
1297 localiser_statevec_anyCtrlPauliGadget(qureg, ctrlList, stateList, str, phase);
1299 if (!qureg.isDensityMatrix)
1303 phase *= - paulis_getSignOfPauliStrConj(str);
1304 ctrlList = util_getBraQubits(ctrlList, qureg);
1305 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
1306 localiser_statevec_anyCtrlPauliGadget(qureg, ctrlList, stateList, str, phase);
1317 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1331 validate_quregFields(qureg, __func__);
1332 validate_targets(qureg, targets, numTargets, __func__);
1339 validate_quregFields(qureg, __func__);
1340 validate_controlAndTargets(qureg, control, targets, numTargets, __func__);
1347 validate_quregFields(qureg, __func__);
1348 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
1355 validate_quregFields(qureg, __func__);
1356 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
1357 validate_controlStates(states, numControls, __func__);
1359 qreal phase = util_getPhaseFromGateAngle(angle);
1360 auto ctrlList = lists_getList64(controls, numControls);
1361 auto stateList = util_getList64OrAllOnes(states, numControls);
1362 auto targList = lists_getList64(targets, numTargets);
1363 localiser_statevec_anyCtrlPhaseGadget(qureg, ctrlList, stateList, targList, phase);
1365 if (!qureg.isDensityMatrix)
1369 ctrlList = util_getBraQubits(ctrlList, qureg);
1370 targList = util_getBraQubits(targList, qureg);
1371 localiser_statevec_anyCtrlPhaseGadget(qureg, ctrlList, stateList, targList, phase);
1392 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1406 validate_quregFields(qureg, __func__);
1407 validate_target(qureg, target, __func__);
1414 validate_quregFields(qureg, __func__);
1415 validate_twoTargets(qureg, target1, target2, __func__);
1418 int targets[] = {target1, target2};
1423 validate_quregFields(qureg, __func__);
1424 validate_targets(qureg, targets, numTargets, __func__);
1428 matr.
elems[1] = std::exp(1_i * angle);
1450 validate_quregFields(qureg, __func__);
1451 validate_target(qureg, target, __func__);
1458 validate_quregFields(qureg, __func__);
1459 validate_twoTargets(qureg, target1, target2, __func__);
1462 int targets[] = {target1, target2};
1467 validate_quregFields(qureg, __func__);
1468 validate_targets(qureg, targets, numTargets, __func__);
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__);
1546 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1560 validate_quregFields(qureg, __func__);
1561 validate_target(qureg, target, __func__);
1562 validate_measurementOutcomeIsValid(outcome, __func__);
1566 auto targList = lists_getList64({target});
1567 auto outcomeList = lists_getList64({outcome});
1570 (qureg.isDensityMatrix)?
1571 localiser_densmatr_multiQubitProjector(qureg, targList, outcomeList, prob):
1572 localiser_statevec_multiQubitProjector(qureg, targList, outcomeList, prob);
1576 validate_quregFields(qureg, __func__);
1577 validate_targets(qureg, qubits, numQubits, __func__);
1578 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
1581 auto qubitList = lists_getList64(qubits, numQubits);
1582 auto outcomeList = lists_getList64(outcomes, numQubits);
1585 (qureg.isDensityMatrix)?
1586 localiser_densmatr_multiQubitProjector(qureg, qubitList, outcomeList, prob):
1587 localiser_statevec_multiQubitProjector(qureg, qubitList, outcomeList, prob);
1593 validate_measurementOutcomesMatchTargets(qubits.size(), outcomes.size(), __func__);
1607 validate_quregFields(qureg, __func__);
1608 validate_target(qureg, target, __func__);
1615 validate_quregFields(qureg, __func__);
1616 validate_target(qureg, target, __func__);
1622 vector<qreal> probs(2);
1625 validate_measurementProbsAreNormalised(probs, __func__);
1628 int outcome = rand_getRandomSingleQubitOutcome(probs[0]);
1629 *probability = probs[outcome];
1631 auto targList = lists_getList64({target});
1632 auto outcomeList = lists_getList64({outcome});
1635 (qureg.isDensityMatrix)?
1636 localiser_densmatr_multiQubitProjector(qureg, targList, outcomeList, *probability):
1637 localiser_statevec_multiQubitProjector(qureg, targList, outcomeList, *probability);
1643 validate_quregFields(qureg, __func__);
1644 validate_target(qureg, target, __func__);
1645 validate_measurementOutcomeIsValid(outcome, __func__);
1651 validate_measurementOutcomeProbNotZero(outcome, prob, __func__);
1653 auto targList = lists_getList64({target});
1654 auto outcomeList = lists_getList64({outcome});
1657 (qureg.isDensityMatrix)?
1658 localiser_densmatr_multiQubitProjector(qureg, targList, outcomeList, prob):
1659 localiser_statevec_multiQubitProjector(qureg, targList, outcomeList, prob);
1665 validate_quregFields(qureg, __func__);
1666 validate_targets(qureg, qubits, numQubits, __func__);
1675 validate_quregFields(qureg, __func__);
1676 validate_targets(qureg, qubits, numQubits, __func__);
1679 qindex numProbs = powerOf2(numQubits);
1682 vector<qreal> probs;
1683 auto callback = [&]() { validate_tempListAllocSucceeded(
false, numProbs,
sizeof(qreal), __func__); };
1684 util_tryAllocVector(probs, numProbs, callback);
1690 validate_measurementProbsAreNormalised(probs, __func__);
1693 qindex outcome = rand_getRandomMultiQubitOutcome(probs);
1694 *probability = probs[outcome];
1697 auto qubitList = lists_getList64(qubits, numQubits);
1698 auto outcomeList = util_getConstantList(-1, numQubits);
1699 setToBitsOfInteger(outcomeList.data(), outcome, numQubits);
1702 (qureg.isDensityMatrix)?
1703 localiser_densmatr_multiQubitProjector(qureg, qubitList, outcomeList, *probability):
1704 localiser_statevec_multiQubitProjector(qureg, qubitList, outcomeList, *probability);
1710 validate_quregFields(qureg, __func__);
1711 validate_targets(qureg, qubits, numQubits, __func__);
1712 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
1714 auto qubitList = lists_getList64(qubits, numQubits);
1715 auto outcomeList = lists_getList64(outcomes, numQubits);
1719 validate_measurementOutcomesProbNotZero(outcomes, numQubits, prob, __func__);
1722 (qureg.isDensityMatrix)?
1723 localiser_densmatr_multiQubitProjector(qureg, qubitList, outcomeList, prob):
1724 localiser_statevec_multiQubitProjector(qureg, qubitList, outcomeList, prob);
1742 validate_measurementOutcomesMatchTargets(qubits.size(), outcomes.size(), __func__);
1756 validate_quregFields(qureg, __func__);
1757 validate_targets(qureg, targets, numTargets, __func__);
1763 int mid = numTargets/2;
1767 for (
int n=0; n<mid; n++)
1768 applySwap(qureg, targets[n], targets[numTargets-1-n]);
1770 for (
int n=0; n<numTargets; n++) {
1771 for (
int m=0; m<n; m++) {
1772 qreal arg = - const_PI / powerOf2(m+1);
1779 for (
int n=numTargets-1; n>=0; n--) {
1782 for (
int m=0; m<n; m++) {
1783 qreal arg = const_PI / powerOf2(m+1);
1788 for (
int n=0; n<mid; n++)
1789 applySwap(qureg, targets[n], targets[numTargets-1-n]);
1794 validate_quregFields(qureg, __func__);
1796 auto targets = util_getRange(qureg.numQubits);
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 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 applyMultiControlledCompMatr2(Qureg qureg, int *controls, int numControls, int target1, int target2, CompMatr2 matrix)
void applyControlledCompMatr2(Qureg qureg, int control, int target1, int target2, CompMatr2 matrix)
void applyCompMatr2(Qureg qureg, int target1, int target2, CompMatr2 matrix)
void applyMultiStateControlledCompMatr(Qureg qureg, int *controls, int *states, 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 applyMultiControlledCompMatr(Qureg qureg, int *controls, int numControls, int *targets, int numTargets, CompMatr matrix)
void applyDiagMatr1(Qureg qureg, int target, DiagMatr1 matrix)
void applyMultiControlledDiagMatr1(Qureg qureg, int *controls, int numControls, int target, DiagMatr1 matrix)
void applyControlledDiagMatr1(Qureg qureg, int control, int target, DiagMatr1 matrix)
void applyMultiStateControlledDiagMatr1(Qureg qureg, int *controls, int *states, int numControls, int target, DiagMatr1 matrix)
void applyDiagMatr2(Qureg qureg, int target1, int target2, DiagMatr2 matrix)
void applyMultiControlledDiagMatr2(Qureg qureg, int *controls, int numControls, int target1, int target2, DiagMatr2 matrix)
void applyControlledDiagMatr2(Qureg qureg, int control, int target1, int target2, DiagMatr2 matrix)
void applyMultiStateControlledDiagMatr2(Qureg qureg, int *controls, int *states, int numControls, int target1, int target2, DiagMatr2 matrix)
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 applyFullStateDiagMatrPower(Qureg qureg, FullStateDiagMatr matrix, qcomp exponent)
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 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 applyControlledPauliGadget(Qureg qureg, int control, PauliStr str, qreal angle)
void applyMultiStateControlledPauliGadget(Qureg qureg, int *controls, int *states, int numControls, PauliStr str, qreal angle)
void applyNonUnitaryPauliGadget(Qureg qureg, PauliStr str, qcomp angle)
void applyPauliGadget(Qureg qureg, PauliStr str, qreal angle)
void applyMultiControlledPauliStr(Qureg qureg, int *controls, int numControls, 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 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 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 applyQuantumFourierTransform(Qureg qureg, int *targets, int numTargets, bool inverse)
void applyFullQuantumFourierTransform(Qureg qureg, bool inverse)
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 applyControlledRotateAroundAxis(Qureg qureg, int ctrl, int targ, qreal angle, qreal axisX, qreal axisY, qreal axisZ)
void applyRotateZ(Qureg qureg, int target, qreal angle)
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 applyMultiStateControlledRotateAroundAxis(Qureg qureg, int *ctrls, int *states, 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 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 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)