| 658 | } |
| 659 | |
| 660 | void rightapplyPauliStrSum(Qureg qureg, PauliStrSum sum, Qureg workspace) { |
| 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__); |
| 667 | |
| 668 | // clone qureg to workspace, set qureg to blank |
| 669 | localiser_statevec_setQuregToClone(workspace, qureg); |
| 670 | localiser_statevec_initUniformState(qureg, 0); |
| 671 | |
| 672 | // post-multiply each term in-turn, mixing into output qureg, then undo using idempotency |
| 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); // undoes transpose |
| 676 | |
| 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); |
| 680 | } |
| 681 | |
| 682 | // workspace -> qureg, and qureg -> sum * qureg |
| 683 | } |
| 684 | |
| 685 | } // end de-mangler |
no test coverage detected