MCPcopy Create free account
hub / github.com/QuEST-Kit/QuEST / anyCtrlZTensorOrGadget

Function anyCtrlZTensorOrGadget

quest/src/core/localiser.cpp:1261–1282  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1259
1260
1261void 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
1285void anyCtrlPauliTensorOrGadget(Qureg qureg, vector<int> ctrls, vector<int> ctrlStates, PauliStr str, qcomp ampFac, qcomp pairAmpFac) {

Tested by

no test coverage detected