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 auto ctrlVec = util_getVector(ctrls, numCtrls);
46 auto stateVec = util_getVector(states, numCtrls);
47 auto targVec = util_getVector(targs, numTargs);
50 localiser_statevec_anyCtrlAnyTargAnyMatr(qureg, ctrlVec, stateVec, targVec, matr, conj);
52 if (!qureg.isDensityMatrix)
56 ctrlVec = util_getBraQubits(ctrlVec, qureg);
57 targVec = util_getBraQubits(targVec, qureg);
58 localiser_statevec_anyCtrlAnyTargAnyMatr(qureg, ctrlVec, stateVec, targVec, 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 ctrlVec = util_getVector(controls, numControls);
414 auto stateVec = util_getVector(states, numControls);
415 auto targVec = util_getVector(targets, numTargets);
416 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, ctrlVec, stateVec, targVec, matrix, exponent, conj);
418 if (!qureg.isDensityMatrix)
422 ctrlVec = util_getBraQubits(ctrlVec, qureg);
423 targVec = util_getBraQubits(targVec, qureg);
424 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, ctrlVec, stateVec, targVec, 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 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 ctrlVec = util_getVector(controls, numControls);
682 auto stateVec = util_getVector(states, numControls);
683 localiser_statevec_anyCtrlSwap(qureg, ctrlVec, stateVec, qubit1, qubit2);
685 if (!qureg.isDensityMatrix)
688 ctrlVec = util_getBraQubits(ctrlVec, qureg);
689 qubit1 = util_getBraQubit(qubit1, qureg);
690 qubit2 = util_getBraQubit(qubit2, qureg);
691 localiser_statevec_anyCtrlSwap(qureg, ctrlVec, stateVec, 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__);
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__);
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__);
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 ctrlVec = util_getVector(controls, numControls);
970 auto stateVec = util_getVector(states, numControls);
975 if (qureg.isDensityMatrix && numControls == 0) {
976 factor = paulis_getSignOfPauliStrConj(str);
977 ctrlVec = util_getConcatenated(ctrlVec, util_getBraQubits(ctrlVec, qureg));
978 stateVec = util_getConcatenated(stateVec, stateVec);
979 str = paulis_getKetAndBraPauliStr(str, qureg);
982 localiser_statevec_anyCtrlPauliTensor(qureg, ctrlVec, stateVec, str, factor);
985 if (qureg.isDensityMatrix && numControls > 0) {
986 factor = paulis_getSignOfPauliStrConj(str);
987 ctrlVec = util_getBraQubits(ctrlVec, qureg);
988 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
989 localiser_statevec_anyCtrlPauliTensor(qureg, ctrlVec, stateVec, 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 localiser_statevec_anyCtrlPauliGadget(qureg, {}, {}, str, phase);
1255 if (!qureg.isDensityMatrix)
1259 phase = - std::conj(phase) * paulis_getSignOfPauliStrConj(str);
1260 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
1261 localiser_statevec_anyCtrlPauliGadget(qureg, {}, {}, str, phase);
1265 validate_quregFields(qureg, __func__);
1266 validate_controlAndPauliStrTargets(qureg, control, str, __func__);
1272 validate_quregFields(qureg, __func__);
1273 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1279 validate_quregFields(qureg, __func__);
1280 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1281 validate_controlStates(states, numControls, __func__);
1286 if (paulis_isIdentity(str) && numControls == 0 && qureg.isDensityMatrix)
1293 qreal phase = util_getPhaseFromGateAngle(angle);
1294 auto ctrlVec = util_getVector(controls, numControls);
1295 auto stateVec = util_getVector(states, numControls);
1296 localiser_statevec_anyCtrlPauliGadget(qureg, ctrlVec, stateVec, str, phase);
1298 if (!qureg.isDensityMatrix)
1302 phase *= - paulis_getSignOfPauliStrConj(str);
1303 ctrlVec = util_getBraQubits(ctrlVec, qureg);
1304 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
1305 localiser_statevec_anyCtrlPauliGadget(qureg, ctrlVec, stateVec, str, phase);
1316 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1330 validate_quregFields(qureg, __func__);
1331 validate_targets(qureg, targets, numTargets, __func__);
1338 validate_quregFields(qureg, __func__);
1339 validate_controlAndTargets(qureg, control, targets, numTargets, __func__);
1346 validate_quregFields(qureg, __func__);
1347 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
1354 validate_quregFields(qureg, __func__);
1355 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
1356 validate_controlStates(states, numControls, __func__);
1358 qreal phase = util_getPhaseFromGateAngle(angle);
1359 auto ctrlVec = util_getVector(controls, numControls);
1360 auto targVec = util_getVector(targets, numTargets);
1361 auto stateVec = util_getVector(states, numControls);
1362 localiser_statevec_anyCtrlPhaseGadget(qureg, ctrlVec, stateVec, targVec, phase);
1364 if (!qureg.isDensityMatrix)
1368 ctrlVec = util_getBraQubits(ctrlVec, qureg);
1369 targVec = util_getBraQubits(targVec, qureg);
1370 localiser_statevec_anyCtrlPhaseGadget(qureg, ctrlVec, stateVec, targVec, phase);
1391 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1405 validate_quregFields(qureg, __func__);
1406 validate_target(qureg, target, __func__);
1413 validate_quregFields(qureg, __func__);
1414 validate_twoTargets(qureg, target1, target2, __func__);
1417 int targets[] = {target1, target2};
1422 validate_quregFields(qureg, __func__);
1423 validate_targets(qureg, targets, numTargets, __func__);
1448 validate_quregFields(qureg, __func__);
1449 validate_target(qureg, target, __func__);
1456 validate_quregFields(qureg, __func__);
1457 validate_twoTargets(qureg, target1, target2, __func__);
1460 int targets[] = {target1, target2};
1465 validate_quregFields(qureg, __func__);
1466 validate_targets(qureg, targets, numTargets, __func__);
1491 validate_quregFields(qureg, __func__);
1492 validate_targets(qureg, targets, numTargets, __func__);
1499 validate_quregFields(qureg, __func__);
1500 validate_controlAndTargets(qureg, control, targets, numTargets, __func__);
1507 validate_quregFields(qureg, __func__);
1508 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
1515 validate_quregFields(qureg, __func__);
1516 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
1517 validate_controlStates(states, numControls, __func__);
1544 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1558 validate_quregFields(qureg, __func__);
1559 validate_target(qureg, target, __func__);
1560 validate_measurementOutcomeIsValid(outcome, __func__);
1565 (qureg.isDensityMatrix)?
1566 localiser_densmatr_multiQubitProjector(qureg, {target}, {outcome}, prob):
1567 localiser_statevec_multiQubitProjector(qureg, {target}, {outcome}, prob);
1571 validate_quregFields(qureg, __func__);
1572 validate_targets(qureg, qubits, numQubits, __func__);
1573 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
1576 auto qubitVec = util_getVector(qubits, numQubits);
1577 auto outcomeVec = util_getVector(outcomes, numQubits);
1580 (qureg.isDensityMatrix)?
1581 localiser_densmatr_multiQubitProjector(qureg, qubitVec, outcomeVec, prob):
1582 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, prob);
1588 validate_measurementOutcomesMatchTargets(qubits.size(), outcomes.size(), __func__);
1602 validate_quregFields(qureg, __func__);
1603 validate_target(qureg, target, __func__);
1610 validate_quregFields(qureg, __func__);
1611 validate_target(qureg, target, __func__);
1617 vector<qreal> probs(2);
1620 validate_measurementProbsAreNormalised(probs, __func__);
1623 int outcome = rand_getRandomSingleQubitOutcome(probs[0]);
1624 *probability = probs[outcome];
1627 (qureg.isDensityMatrix)?
1628 localiser_densmatr_multiQubitProjector(qureg, {target}, {outcome}, *probability):
1629 localiser_statevec_multiQubitProjector(qureg, {target}, {outcome}, *probability);
1635 validate_quregFields(qureg, __func__);
1636 validate_target(qureg, target, __func__);
1637 validate_measurementOutcomeIsValid(outcome, __func__);
1643 validate_measurementOutcomeProbNotZero(outcome, prob, __func__);
1646 (qureg.isDensityMatrix)?
1647 localiser_densmatr_multiQubitProjector(qureg, {target}, {outcome}, prob):
1648 localiser_statevec_multiQubitProjector(qureg, {target}, {outcome}, prob);
1654 validate_quregFields(qureg, __func__);
1655 validate_targets(qureg, qubits, numQubits, __func__);
1664 validate_quregFields(qureg, __func__);
1665 validate_targets(qureg, qubits, numQubits, __func__);
1668 qindex numProbs = powerOf2(numQubits);
1671 vector<qreal> probs;
1672 auto callback = [&]() { validate_tempAllocSucceeded(
false, numProbs,
sizeof(qreal), __func__); };
1673 util_tryAllocVector(probs, numProbs, callback);
1679 validate_measurementProbsAreNormalised(probs, __func__);
1682 qindex outcome = rand_getRandomMultiQubitOutcome(probs);
1683 *probability = probs[outcome];
1686 auto qubitVec = util_getVector(qubits, numQubits);
1687 auto outcomeVec = vector<int>(numQubits);
1688 getBitsFromInteger(outcomeVec.data(), outcome, numQubits);
1691 (qureg.isDensityMatrix)?
1692 localiser_densmatr_multiQubitProjector(qureg, qubitVec, outcomeVec, *probability):
1693 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, *probability);
1699 validate_quregFields(qureg, __func__);
1700 validate_targets(qureg, qubits, numQubits, __func__);
1701 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
1703 auto qubitVec = util_getVector(qubits, numQubits);
1704 auto outcomeVec = util_getVector(outcomes, numQubits);
1708 validate_measurementOutcomesProbNotZero(outcomes, numQubits, prob, __func__);
1711 (qureg.isDensityMatrix)?
1712 localiser_densmatr_multiQubitProjector(qureg, qubitVec, outcomeVec, prob):
1713 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, prob);
1726 validate_measurementOutcomesMatchTargets(qubits.size(), outcomes.size(), __func__);
1740 validate_quregFields(qureg, __func__);
1741 validate_targets(qureg, targets, numTargets, __func__);
1747 for (
int n=numTargets-1; n>=0; n--) {
1749 for (
int m=0; m<n; m++) {
1750 qreal arg = const_PI / powerOf2(m+1);
1755 int mid = numTargets/2;
1756 for (
int n=0; n<mid; n++)
1757 applySwap(qureg, targets[n], targets[numTargets-1-n]);
1761 validate_quregFields(qureg, __func__);
1764 vector<int> targets(qureg.numQubits);
1765 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 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 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 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 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 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 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 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)