9#include "quest/include/qureg.h"
10#include "quest/include/paulis.h"
11#include "quest/include/matrices.h"
12#include "quest/include/multiplication.h"
14#include "quest/src/core/validation.hpp"
15#include "quest/src/core/utilities.hpp"
16#include "quest/src/core/localiser.hpp"
17#include "quest/src/core/paulilogic.hpp"
32 validate_quregFields(qureg, __func__);
33 validate_target(qureg, target, __func__);
34 validate_matrixFields(matrix, __func__);
38 localiser_statevec_anyCtrlOneTargDenseMatr(qureg, {}, {}, target, matrix, conj, transp);
42 validate_quregFields(qureg, __func__);
43 validate_quregIsDensityMatrix(qureg, __func__);
44 validate_target(qureg, target, __func__);
45 validate_matrixFields(matrix, __func__);
50 int qubit = util_getBraQubit(target, qureg);
51 localiser_statevec_anyCtrlOneTargDenseMatr(qureg, {}, {}, qubit, matrix, conj, transp);
65 validate_quregFields(qureg, __func__);
66 validate_twoTargets(qureg, target1, target2, __func__);
67 validate_matrixFields(matrix, __func__);
68 validate_mixedAmpsFitInNode(qureg, 2, __func__);
72 localiser_statevec_anyCtrlTwoTargDenseMatr(qureg, {}, {}, target1, target2, matrix, conj, transp);
76 validate_quregFields(qureg, __func__);
77 validate_quregIsDensityMatrix(qureg, __func__);
78 validate_twoTargets(qureg, target1, target2, __func__);
79 validate_matrixFields(matrix, __func__);
80 validate_mixedAmpsFitInNode(qureg, 2, __func__);
85 int qubit1 = util_getBraQubit(target1, qureg);
86 int qubit2 = util_getBraQubit(target2, qureg);
87 localiser_statevec_anyCtrlTwoTargDenseMatr(qureg, {}, {}, qubit1, qubit2, matrix, conj, transp);
101 validate_quregFields(qureg, __func__);
102 validate_targets(qureg, targets, numTargets, __func__);
103 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
104 validate_mixedAmpsFitInNode(qureg, numTargets, __func__);
108 localiser_statevec_anyCtrlAnyTargDenseMatr(qureg, {}, {}, util_getVector(targets, numTargets), matrix, conj, transp);
112 validate_quregFields(qureg, __func__);
113 validate_quregIsDensityMatrix(qureg, __func__);
114 validate_targets(qureg, targets, numTargets, __func__);
115 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
116 validate_mixedAmpsFitInNode(qureg, numTargets, __func__);
121 auto qubits = util_getBraQubits(util_getVector(targets, numTargets), qureg);
122 localiser_statevec_anyCtrlAnyTargDenseMatr(qureg, {}, {}, qubits, matrix, conj, transp);
146 validate_quregFields(qureg, __func__);
147 validate_target(qureg, target, __func__);
148 validate_matrixFields(matrix, __func__);
151 localiser_statevec_anyCtrlOneTargDiagMatr(qureg, {}, {}, target, matrix, conj);
155 validate_quregFields(qureg, __func__);
156 validate_quregIsDensityMatrix(qureg, __func__);
157 validate_target(qureg, target, __func__);
158 validate_matrixFields(matrix, __func__);
161 int qubit = util_getBraQubit(target, qureg);
162 localiser_statevec_anyCtrlOneTargDiagMatr(qureg, {}, {}, qubit, matrix, conj);
176 validate_quregFields(qureg, __func__);
177 validate_twoTargets(qureg, target1, target2, __func__);
178 validate_matrixFields(matrix, __func__);
181 localiser_statevec_anyCtrlTwoTargDiagMatr(qureg, {}, {}, target1, target2, matrix, conj);
185 validate_quregFields(qureg, __func__);
186 validate_quregIsDensityMatrix(qureg, __func__);
187 validate_twoTargets(qureg, target1, target2, __func__);
188 validate_matrixFields(matrix, __func__);
191 int qubit1 = util_getBraQubit(target1, qureg);
192 int qubit2 = util_getBraQubit(target2, qureg);
193 localiser_statevec_anyCtrlTwoTargDiagMatr(qureg, {}, {}, qubit1, qubit2, matrix, conj);
207 validate_quregFields(qureg, __func__);
208 validate_targets(qureg, targets, numTargets, __func__);
209 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
213 auto qubits = util_getVector(targets, numTargets);
214 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, {}, {}, qubits, matrix, exponent, conj);
218 validate_quregFields(qureg, __func__);
219 validate_quregIsDensityMatrix(qureg, __func__);
220 validate_targets(qureg, targets, numTargets, __func__);
221 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
225 auto qubits = util_getBraQubits(util_getVector(targets, numTargets), qureg);
226 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, {}, {}, qubits, matrix, exponent, conj);
250 validate_quregFields(qureg, __func__);
251 validate_targets(qureg, targets, numTargets, __func__);
252 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
253 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
256 auto qubits = util_getVector(targets, numTargets);
257 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, {}, {}, qubits, matrix, exponent, conj);
261 validate_quregFields(qureg, __func__);
262 validate_quregIsDensityMatrix(qureg, __func__);
263 validate_targets(qureg, targets, numTargets, __func__);
264 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
265 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
268 auto qubits = util_getBraQubits(util_getVector(targets, numTargets), qureg);
269 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, {}, {}, qubits, matrix, exponent, conj);
293 validate_quregFields(qureg, __func__);
294 validate_matrixFields(matrix, __func__);
295 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
301 validate_quregFields(qureg, __func__);
302 validate_matrixFields(matrix, __func__);
303 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
304 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
307 bool leftMultiply =
true;
308 bool rightMultiply =
false;
309 bool rightConj =
false;
311 (qureg.isDensityMatrix)?
312 localiser_densmatr_allTargDiagMatr(qureg, matrix, exponent, leftMultiply, rightMultiply, rightConj):
313 localiser_statevec_allTargDiagMatr(qureg, matrix, exponent);
317 validate_quregFields(qureg, __func__);
318 validate_quregIsDensityMatrix(qureg, __func__);
319 validate_matrixFields(matrix, __func__);
320 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
326 validate_quregFields(qureg, __func__);
327 validate_quregIsDensityMatrix(qureg, __func__);
328 validate_matrixFields(matrix, __func__);
329 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
330 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
333 bool leftMultiply =
false;
334 bool rightMultiply =
true;
335 bool rightConj =
false;
336 localiser_densmatr_allTargDiagMatr(qureg, matrix, exponent, leftMultiply, rightMultiply, rightConj);
350 validate_quregFields(qureg, __func__);
351 validate_twoTargets(qureg, qubit1, qubit2, __func__);
353 localiser_statevec_anyCtrlSwap(qureg, {}, {}, qubit1, qubit2);
357 validate_quregFields(qureg, __func__);
358 validate_quregIsDensityMatrix(qureg, __func__);
359 validate_twoTargets(qureg, qubit1, qubit2, __func__);
361 qubit1 = util_getBraQubit(qubit1, qureg);
362 qubit2 = util_getBraQubit(qubit2, qureg);
363 localiser_statevec_anyCtrlSwap(qureg, {}, {}, qubit1, qubit2);
377 validate_quregFields(qureg, __func__);
378 validate_target(qureg, target, __func__);
381 localiser_statevec_anyCtrlPauliTensor(qureg, {}, {}, str);
385 validate_quregFields(qureg, __func__);
386 validate_target(qureg, target, __func__);
389 localiser_statevec_anyCtrlPauliTensor(qureg, {}, {}, str);
393 validate_quregFields(qureg, __func__);
394 validate_target(qureg, target, __func__);
397 localiser_statevec_anyCtrlPauliTensor(qureg, {}, {}, str);
401 validate_quregFields(qureg, __func__);
402 validate_quregIsDensityMatrix(qureg, __func__);
403 validate_target(qureg, target, __func__);
406 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
407 localiser_statevec_anyCtrlPauliTensor(qureg, {}, {}, str);
411 validate_quregFields(qureg, __func__);
412 validate_quregIsDensityMatrix(qureg, __func__);
413 validate_target(qureg, target, __func__);
417 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
418 localiser_statevec_anyCtrlPauliTensor(qureg, {}, {}, str, factor);
422 validate_quregFields(qureg, __func__);
423 validate_quregIsDensityMatrix(qureg, __func__);
424 validate_target(qureg, target, __func__);
427 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
428 localiser_statevec_anyCtrlPauliTensor(qureg, {}, {}, str);
442 validate_quregFields(qureg, __func__);
443 validate_pauliStrTargets(qureg, str, __func__);
445 localiser_statevec_anyCtrlPauliTensor(qureg, {}, {}, str);
449 validate_quregFields(qureg, __func__);
450 validate_quregIsDensityMatrix(qureg, __func__);
451 validate_pauliStrTargets(qureg, str, __func__);
453 qcomp factor = paulis_getSignOfPauliStrConj(str);
454 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
455 localiser_statevec_anyCtrlPauliTensor(qureg, {}, {}, str, factor);
469 validate_quregFields(qureg, __func__);
470 validate_pauliStrTargets(qureg, str, __func__);
472 qreal phase = util_getPhaseFromGateAngle(angle);
473 localiser_statevec_anyCtrlPauliGadget(qureg, {}, {}, str, phase);
477 validate_quregFields(qureg, __func__);
478 validate_quregIsDensityMatrix(qureg, __func__);
479 validate_pauliStrTargets(qureg, str, __func__);
481 qreal factor = paulis_getSignOfPauliStrConj(str);
482 qreal phase = factor * util_getPhaseFromGateAngle(angle);
483 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
484 localiser_statevec_anyCtrlPauliGadget(qureg, {}, {}, str, phase);
498 validate_quregFields(qureg, __func__);
499 validate_targets(qureg, targets, numTargets, __func__);
501 qreal phase = util_getPhaseFromGateAngle(angle);
502 auto qubits = util_getVector(targets, numTargets);
503 localiser_statevec_anyCtrlPhaseGadget(qureg, {}, {}, qubits, phase);
507 validate_quregFields(qureg, __func__);
508 validate_quregIsDensityMatrix(qureg, __func__);
509 validate_targets(qureg, targets, numTargets, __func__);
511 qreal phase = util_getPhaseFromGateAngle(angle);
512 auto qubits = util_getBraQubits(util_getVector(targets, numTargets), qureg);
513 localiser_statevec_anyCtrlPhaseGadget(qureg, {}, {}, qubits, phase);
537 validate_quregFields(qureg, __func__);
538 validate_targets(qureg, targets, numTargets, __func__);
546 validate_quregFields(qureg, __func__);
547 validate_quregIsDensityMatrix(qureg, __func__);
548 validate_targets(qureg, targets, numTargets, __func__);
576 validate_quregFields(qureg, __func__);
577 validate_target(qureg, qubit, __func__);
578 validate_measurementOutcomeIsValid(outcome, __func__);
581 localiser_statevec_multiQubitProjector(qureg, {qubit}, {outcome}, prob);
585 validate_quregFields(qureg, __func__);
586 validate_targets(qureg, qubits, numQubits, __func__);
587 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
590 auto qubitVec = util_getVector(qubits, numQubits);
591 auto outcomeVec = util_getVector(outcomes, numQubits);
592 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, prob);
596 validate_quregFields(qureg, __func__);
597 validate_quregIsDensityMatrix(qureg, __func__);
598 validate_target(qureg, qubit, __func__);
599 validate_measurementOutcomeIsValid(outcome, __func__);
602 localiser_statevec_multiQubitProjector(qureg, {util_getBraQubit(qubit,qureg)}, {outcome}, prob);
606 validate_quregFields(qureg, __func__);
607 validate_quregIsDensityMatrix(qureg, __func__);
608 validate_targets(qureg, qubits, numQubits, __func__);
609 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
612 auto qubitVec = util_getBraQubits(util_getVector(qubits, numQubits), qureg);
613 auto outcomeVec = util_getVector(outcomes, numQubits);
614 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, prob);
620 validate_measurementOutcomesMatchTargets(qubits.size(), outcomes.size(), __func__);
626 validate_measurementOutcomesMatchTargets(qubits.size(), outcomes.size(), __func__);
640 validate_quregFields(qureg, __func__);
641 validate_quregFields(workspace, __func__);
642 validate_quregCanBeWorkspace(qureg, workspace, __func__);
643 validate_pauliStrSumFields(sum, __func__);
644 validate_pauliStrSumTargets(sum, qureg, __func__);
647 localiser_statevec_setQuregToClone(workspace, qureg);
648 localiser_statevec_initUniformState(qureg, 0);
651 for (qindex i=0; i<sum.numTerms; i++) {
652 localiser_statevec_anyCtrlPauliTensor(workspace, {}, {}, sum.strings[i]);
653 localiser_statevec_setQuregToWeightedSum(qureg, {1, sum.coeffs[i]}, {qureg, workspace});
654 localiser_statevec_anyCtrlPauliTensor(workspace, {}, {}, sum.strings[i]);
661 validate_quregFields(qureg, __func__);
662 validate_quregFields(workspace, __func__);
663 validate_quregIsDensityMatrix(qureg, __func__);
664 validate_quregCanBeWorkspace(qureg, workspace, __func__);
665 validate_pauliStrSumFields(sum, __func__);
666 validate_pauliStrSumTargets(sum, qureg, __func__);
669 localiser_statevec_setQuregToClone(workspace, qureg);
670 localiser_statevec_initUniformState(qureg, 0);
673 for (qindex i=0; i<sum.numTerms; i++) {
674 PauliStr str = paulis_getShiftedPauliStr(sum.strings[i], qureg.numQubits);
675 qcomp factor = paulis_getSignOfPauliStrConj(str);
677 localiser_statevec_anyCtrlPauliTensor(workspace, {}, {}, str, factor);
678 localiser_statevec_setQuregToWeightedSum(qureg, {1, sum.coeffs[i]}, {qureg, workspace});
679 localiser_statevec_anyCtrlPauliTensor(workspace, {}, {}, str, factor);
void rightapplyCompMatr1(Qureg qureg, int target, CompMatr1 matrix)
void leftapplyCompMatr1(Qureg qureg, int target, CompMatr1 matrix)
void rightapplyCompMatr2(Qureg qureg, int target1, int target2, CompMatr2 matrix)
void leftapplyCompMatr2(Qureg qureg, int target1, int target2, CompMatr2 matrix)
void leftapplyCompMatr(Qureg qureg, int *targets, int numTargets, CompMatr matrix)
void rightapplyCompMatr(Qureg qureg, int *targets, int numTargets, CompMatr matrix)
void leftapplyDiagMatr1(Qureg qureg, int target, DiagMatr1 matrix)
void rightapplyDiagMatr1(Qureg qureg, int target, DiagMatr1 matrix)
void leftapplyDiagMatr2(Qureg qureg, int target1, int target2, DiagMatr2 matrix)
void rightapplyDiagMatr2(Qureg qureg, int target1, int target2, DiagMatr2 matrix)
void rightapplyDiagMatr(Qureg qureg, int *targets, int numTargets, DiagMatr matrix)
void leftapplyDiagMatrPower(Qureg qureg, int *targets, int numTargets, DiagMatr matrix, qcomp exponent)
void rightapplyDiagMatrPower(Qureg qureg, int *targets, int numTargets, DiagMatr matrix, qcomp exponent)
void leftapplyDiagMatr(Qureg qureg, int *targets, int numTargets, DiagMatr matrix)
void rightapplyFullStateDiagMatr(Qureg qureg, FullStateDiagMatr matrix)
void leftapplyFullStateDiagMatr(Qureg qureg, FullStateDiagMatr matrix)
void rightapplyFullStateDiagMatrPower(Qureg qureg, FullStateDiagMatr matrix, qcomp exponent)
void leftapplyFullStateDiagMatrPower(Qureg qureg, FullStateDiagMatr matrix, qcomp exponent)
void leftapplyMultiQubitNot(Qureg qureg, int *targets, int numTargets)
void rightapplyMultiQubitNot(Qureg qureg, int *targets, int numTargets)
void leftapplyPauliX(Qureg qureg, int target)
void rightapplyPauliY(Qureg qureg, int target)
void leftapplyPauliY(Qureg qureg, int target)
void leftapplyPauliZ(Qureg qureg, int target)
void rightapplyPauliX(Qureg qureg, int target)
void rightapplyPauliZ(Qureg qureg, int target)
void leftapplyPauliGadget(Qureg qureg, PauliStr str, qreal angle)
void rightapplyPauliGadget(Qureg qureg, PauliStr str, qreal angle)
void rightapplyPauliStr(Qureg qureg, PauliStr str)
void leftapplyPauliStr(Qureg qureg, PauliStr str)
void rightapplyPauliStrSum(Qureg qureg, PauliStrSum sum, Qureg workspace)
void leftapplyPauliStrSum(Qureg qureg, PauliStrSum sum, Qureg workspace)
void rightapplyPhaseGadget(Qureg qureg, int *targets, int numTargets, qreal angle)
void leftapplyPhaseGadget(Qureg qureg, int *targets, int numTargets, qreal angle)
void leftapplyMultiQubitProjector(Qureg qureg, int *qubits, int *outcomes, int numQubits)
void rightapplyQubitProjector(Qureg qureg, int qubit, int outcome)
void rightapplyMultiQubitProjector(Qureg qureg, int *qubits, int *outcomes, int numQubits)
void leftapplyQubitProjector(Qureg qureg, int qubit, int outcome)
void leftapplySwap(Qureg qureg, int qubit1, int qubit2)
void rightapplySwap(Qureg qureg, int qubit1, int qubit2)
PauliStr getPauliStr(const char *paulis, int *indices, int numPaulis)