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/lists.hpp"
16#include "quest/src/core/utilities.hpp"
17#include "quest/src/core/localiser.hpp"
18#include "quest/src/core/paulilogic.hpp"
30List64 none = lists_getEmptyList64();
41 validate_quregFields(qureg, __func__);
42 validate_target(qureg, target, __func__);
43 validate_matrixFields(matrix, __func__);
47 localiser_statevec_anyCtrlOneTargDenseMatr(qureg, none, none, target, matrix, conj, transp);
51 validate_quregFields(qureg, __func__);
52 validate_quregIsDensityMatrix(qureg, __func__);
53 validate_target(qureg, target, __func__);
54 validate_matrixFields(matrix, __func__);
59 int qubit = util_getBraQubit(target, qureg);
60 localiser_statevec_anyCtrlOneTargDenseMatr(qureg, none, none, qubit, matrix, conj, transp);
74 validate_quregFields(qureg, __func__);
75 validate_twoTargets(qureg, target1, target2, __func__);
76 validate_matrixFields(matrix, __func__);
77 validate_mixedAmpsFitInNode(qureg, 2, __func__);
81 localiser_statevec_anyCtrlTwoTargDenseMatr(qureg, none, none, target1, target2, matrix, conj, transp);
85 validate_quregFields(qureg, __func__);
86 validate_quregIsDensityMatrix(qureg, __func__);
87 validate_twoTargets(qureg, target1, target2, __func__);
88 validate_matrixFields(matrix, __func__);
89 validate_mixedAmpsFitInNode(qureg, 2, __func__);
94 int qubit1 = util_getBraQubit(target1, qureg);
95 int qubit2 = util_getBraQubit(target2, qureg);
96 localiser_statevec_anyCtrlTwoTargDenseMatr(qureg, none, none, qubit1, qubit2, matrix, conj, transp);
110 validate_quregFields(qureg, __func__);
111 validate_targets(qureg, targets, numTargets, __func__);
112 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
113 validate_mixedAmpsFitInNode(qureg, numTargets, __func__);
117 localiser_statevec_anyCtrlAnyTargDenseMatr(qureg, none, none, lists_getList64(targets, numTargets), matrix, conj, transp);
121 validate_quregFields(qureg, __func__);
122 validate_quregIsDensityMatrix(qureg, __func__);
123 validate_targets(qureg, targets, numTargets, __func__);
124 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
125 validate_mixedAmpsFitInNode(qureg, numTargets, __func__);
130 auto qubits = util_getBraQubits(lists_getList64(targets, numTargets), qureg);
131 localiser_statevec_anyCtrlAnyTargDenseMatr(qureg, none, none, qubits, matrix, conj, transp);
155 validate_quregFields(qureg, __func__);
156 validate_target(qureg, target, __func__);
157 validate_matrixFields(matrix, __func__);
160 localiser_statevec_anyCtrlOneTargDiagMatr(qureg, none, none, target, matrix, conj);
164 validate_quregFields(qureg, __func__);
165 validate_quregIsDensityMatrix(qureg, __func__);
166 validate_target(qureg, target, __func__);
167 validate_matrixFields(matrix, __func__);
170 int qubit = util_getBraQubit(target, qureg);
171 localiser_statevec_anyCtrlOneTargDiagMatr(qureg, none, none, qubit, matrix, conj);
185 validate_quregFields(qureg, __func__);
186 validate_twoTargets(qureg, target1, target2, __func__);
187 validate_matrixFields(matrix, __func__);
190 localiser_statevec_anyCtrlTwoTargDiagMatr(qureg, none, none, target1, target2, matrix, conj);
194 validate_quregFields(qureg, __func__);
195 validate_quregIsDensityMatrix(qureg, __func__);
196 validate_twoTargets(qureg, target1, target2, __func__);
197 validate_matrixFields(matrix, __func__);
200 int qubit1 = util_getBraQubit(target1, qureg);
201 int qubit2 = util_getBraQubit(target2, qureg);
202 localiser_statevec_anyCtrlTwoTargDiagMatr(qureg, none, none, qubit1, qubit2, matrix, conj);
216 validate_quregFields(qureg, __func__);
217 validate_targets(qureg, targets, numTargets, __func__);
218 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
222 auto qubits = lists_getList64(targets, numTargets);
223 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, none, none, qubits, matrix, exponent, conj);
227 validate_quregFields(qureg, __func__);
228 validate_quregIsDensityMatrix(qureg, __func__);
229 validate_targets(qureg, targets, numTargets, __func__);
230 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
234 auto qubits = util_getBraQubits(lists_getList64(targets, numTargets), qureg);
235 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, none, none, qubits, matrix, exponent, conj);
259 validate_quregFields(qureg, __func__);
260 validate_targets(qureg, targets, numTargets, __func__);
261 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
262 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
265 auto qubits = lists_getList64(targets, numTargets);
266 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, none, none, qubits, matrix, exponent, conj);
270 validate_quregFields(qureg, __func__);
271 validate_quregIsDensityMatrix(qureg, __func__);
272 validate_targets(qureg, targets, numTargets, __func__);
273 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
274 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
277 auto qubits = util_getBraQubits(lists_getList64(targets, numTargets), qureg);
278 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, none, none, qubits, matrix, exponent, conj);
302 validate_quregFields(qureg, __func__);
303 validate_matrixFields(matrix, __func__);
304 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
310 validate_quregFields(qureg, __func__);
311 validate_matrixFields(matrix, __func__);
312 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
313 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
316 bool leftMultiply =
true;
317 bool rightMultiply =
false;
318 bool rightConj =
false;
320 (qureg.isDensityMatrix)?
321 localiser_densmatr_allTargDiagMatr(qureg, matrix, exponent, leftMultiply, rightMultiply, rightConj):
322 localiser_statevec_allTargDiagMatr(qureg, matrix, exponent);
326 validate_quregFields(qureg, __func__);
327 validate_quregIsDensityMatrix(qureg, __func__);
328 validate_matrixFields(matrix, __func__);
329 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
335 validate_quregFields(qureg, __func__);
336 validate_quregIsDensityMatrix(qureg, __func__);
337 validate_matrixFields(matrix, __func__);
338 validate_matrixAndQuregAreCompatible(matrix, qureg,
false, __func__);
339 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
342 bool leftMultiply =
false;
343 bool rightMultiply =
true;
344 bool rightConj =
false;
345 localiser_densmatr_allTargDiagMatr(qureg, matrix, exponent, leftMultiply, rightMultiply, rightConj);
359 validate_quregFields(qureg, __func__);
360 validate_twoTargets(qureg, qubit1, qubit2, __func__);
362 localiser_statevec_anyCtrlSwap(qureg, none, none, qubit1, qubit2);
366 validate_quregFields(qureg, __func__);
367 validate_quregIsDensityMatrix(qureg, __func__);
368 validate_twoTargets(qureg, qubit1, qubit2, __func__);
370 qubit1 = util_getBraQubit(qubit1, qureg);
371 qubit2 = util_getBraQubit(qubit2, qureg);
372 localiser_statevec_anyCtrlSwap(qureg, none, none, qubit1, qubit2);
386 validate_quregFields(qureg, __func__);
387 validate_target(qureg, target, __func__);
390 localiser_statevec_anyCtrlPauliTensor(qureg, none, none, str);
394 validate_quregFields(qureg, __func__);
395 validate_target(qureg, target, __func__);
398 localiser_statevec_anyCtrlPauliTensor(qureg, none, none, str);
402 validate_quregFields(qureg, __func__);
403 validate_target(qureg, target, __func__);
406 localiser_statevec_anyCtrlPauliTensor(qureg, none, none, str);
410 validate_quregFields(qureg, __func__);
411 validate_quregIsDensityMatrix(qureg, __func__);
412 validate_target(qureg, target, __func__);
415 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
416 localiser_statevec_anyCtrlPauliTensor(qureg, none, none, str);
420 validate_quregFields(qureg, __func__);
421 validate_quregIsDensityMatrix(qureg, __func__);
422 validate_target(qureg, target, __func__);
426 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
427 localiser_statevec_anyCtrlPauliTensor(qureg, none, none, str, factor);
431 validate_quregFields(qureg, __func__);
432 validate_quregIsDensityMatrix(qureg, __func__);
433 validate_target(qureg, target, __func__);
436 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
437 localiser_statevec_anyCtrlPauliTensor(qureg, none, none, str);
451 validate_quregFields(qureg, __func__);
452 validate_pauliStrTargets(qureg, str, __func__);
454 localiser_statevec_anyCtrlPauliTensor(qureg, none, none, str);
458 validate_quregFields(qureg, __func__);
459 validate_quregIsDensityMatrix(qureg, __func__);
460 validate_pauliStrTargets(qureg, str, __func__);
462 qcomp factor = paulis_getSignOfPauliStrConj(str);
463 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
464 localiser_statevec_anyCtrlPauliTensor(qureg, none, none, str, factor);
478 validate_quregFields(qureg, __func__);
479 validate_pauliStrTargets(qureg, str, __func__);
481 qreal phase = util_getPhaseFromGateAngle(angle);
482 localiser_statevec_anyCtrlPauliGadget(qureg, none, none, str, phase);
486 validate_quregFields(qureg, __func__);
487 validate_quregIsDensityMatrix(qureg, __func__);
488 validate_pauliStrTargets(qureg, str, __func__);
490 qreal factor = paulis_getSignOfPauliStrConj(str);
491 qreal phase = factor * util_getPhaseFromGateAngle(angle);
492 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
493 localiser_statevec_anyCtrlPauliGadget(qureg, none, none, str, phase);
507 validate_quregFields(qureg, __func__);
508 validate_targets(qureg, targets, numTargets, __func__);
510 qreal phase = util_getPhaseFromGateAngle(angle);
511 auto qubits = lists_getList64(targets, numTargets);
512 localiser_statevec_anyCtrlPhaseGadget(qureg, none, none, qubits, phase);
516 validate_quregFields(qureg, __func__);
517 validate_quregIsDensityMatrix(qureg, __func__);
518 validate_targets(qureg, targets, numTargets, __func__);
520 qreal phase = util_getPhaseFromGateAngle(angle);
521 auto qubits = util_getBraQubits(lists_getList64(targets, numTargets), qureg);
522 localiser_statevec_anyCtrlPhaseGadget(qureg, none, none, qubits, phase);
546 validate_quregFields(qureg, __func__);
547 validate_targets(qureg, targets, numTargets, __func__);
555 validate_quregFields(qureg, __func__);
556 validate_quregIsDensityMatrix(qureg, __func__);
557 validate_targets(qureg, targets, numTargets, __func__);
585 validate_quregFields(qureg, __func__);
586 validate_target(qureg, qubit, __func__);
587 validate_measurementOutcomeIsValid(outcome, __func__);
590 localiser_statevec_multiQubitProjector(qureg, lists_getList64({qubit}), lists_getList64({outcome}), prob);
594 validate_quregFields(qureg, __func__);
595 validate_targets(qureg, qubits, numQubits, __func__);
596 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
599 auto qubitVec = lists_getList64(qubits, numQubits);
600 auto outcomeVec = lists_getList64(outcomes, numQubits);
601 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, prob);
605 validate_quregFields(qureg, __func__);
606 validate_quregIsDensityMatrix(qureg, __func__);
607 validate_target(qureg, qubit, __func__);
608 validate_measurementOutcomeIsValid(outcome, __func__);
611 auto qubitList = lists_getList64({util_getBraQubit(qubit,qureg)});
612 localiser_statevec_multiQubitProjector(qureg, qubitList, lists_getList64({outcome}), prob);
616 validate_quregFields(qureg, __func__);
617 validate_quregIsDensityMatrix(qureg, __func__);
618 validate_targets(qureg, qubits, numQubits, __func__);
619 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
622 auto qubitVec = util_getBraQubits(lists_getList64(qubits, numQubits), qureg);
623 auto outcomeVec = lists_getList64(outcomes, numQubits);
624 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, prob);
630 validate_measurementOutcomesMatchTargets(qubits.size(), outcomes.size(), __func__);
636 validate_measurementOutcomesMatchTargets(qubits.size(), outcomes.size(), __func__);
650 validate_quregFields(qureg, __func__);
651 validate_quregFields(workspace, __func__);
652 validate_quregCanBeWorkspace(qureg, workspace, __func__);
653 validate_pauliStrSumFields(sum, __func__);
654 validate_pauliStrSumTargets(sum, qureg, __func__);
657 localiser_statevec_setQuregToClone(workspace, qureg);
658 localiser_statevec_initUniformState(qureg, 0);
661 for (qindex i=0; i<sum.numTerms; i++) {
662 localiser_statevec_anyCtrlPauliTensor(workspace, none, none, sum.strings[i]);
663 localiser_statevec_setQuregToWeightedSum(qureg, {1, sum.coeffs[i]}, {qureg, workspace});
664 localiser_statevec_anyCtrlPauliTensor(workspace, none, none, sum.strings[i]);
671 validate_quregFields(qureg, __func__);
672 validate_quregFields(workspace, __func__);
673 validate_quregIsDensityMatrix(qureg, __func__);
674 validate_quregCanBeWorkspace(qureg, workspace, __func__);
675 validate_pauliStrSumFields(sum, __func__);
676 validate_pauliStrSumTargets(sum, qureg, __func__);
679 localiser_statevec_setQuregToClone(workspace, qureg);
680 localiser_statevec_initUniformState(qureg, 0);
683 for (qindex i=0; i<sum.numTerms; i++) {
684 PauliStr str = paulis_getShiftedPauliStr(sum.strings[i], qureg.numQubits);
685 qcomp factor = paulis_getSignOfPauliStrConj(str);
687 localiser_statevec_anyCtrlPauliTensor(workspace, none, none, str, factor);
688 localiser_statevec_setQuregToWeightedSum(qureg, {1, sum.coeffs[i]}, {qureg, workspace});
689 localiser_statevec_anyCtrlPauliTensor(workspace, none, none, 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)