| 1259 | |
| 1260 | |
| 1261 | void anyCtrlZTensorOrGadget(Qureg qureg, vector<int> ctrls, vector<int> ctrlStates, vector<int> targs, bool isGadget, qcomp phase) { |
| 1262 | assertValidCtrlStates(ctrls, ctrlStates); |
| 1263 | setDefaultCtrlStates(ctrls, ctrlStates); |
| 1264 | |
| 1265 | // node has nothing to do if all local amps violate control condition |
| 1266 | if (!doAnyLocalStatesHaveQubitValues(qureg, ctrls, ctrlStates)) |
| 1267 | return; |
| 1268 | |
| 1269 | // retain only suffix control qubits, as relevant to local amp modification |
| 1270 | removePrefixQubitsAndStates(qureg, ctrls, ctrlStates); |
| 1271 | |
| 1272 | // prefixZ merely applies a node-wide factor to fac0 and fac1 |
| 1273 | auto [prefixZ, suffixZ] = util_getPrefixAndSuffixQubits(targs, qureg); |
| 1274 | int sign = paulis_getPrefixZSign(qureg, prefixZ); |
| 1275 | |
| 1276 | // tensor multiplies +-1, gadget multiplies exp(+- i phase) |
| 1277 | qcomp fac0 = (isGadget)? std::exp(+ phase * sign * 1_i) : +1 * sign; |
| 1278 | qcomp fac1 = (isGadget)? std::exp(- phase * sign * 1_i) : -1 * sign; |
| 1279 | |
| 1280 | // simulation is always embarrassingly parallel |
| 1281 | accel_statevector_anyCtrlAnyTargZOrPhaseGadget_sub(qureg, ctrls, ctrlStates, suffixZ, fac0, fac1); |
| 1282 | } |
| 1283 | |
| 1284 | |
| 1285 | void anyCtrlPauliTensorOrGadget(Qureg qureg, vector<int> ctrls, vector<int> ctrlStates, PauliStr str, qcomp ampFac, qcomp pairAmpFac) { |
no test coverage detected