The Quantum Exact Simulation Toolkit v4.0.0
Loading...
Searching...
No Matches

Functions for non-destructively calculating the probabilities of measurement outcomes. More...

Functions

qreal calcProbOfBasisState (Qureg qureg, qindex index)
 
qreal calcProbOfMultiQubitOutcome (Qureg qureg, int *qubits, int *outcomes, int numQubits)
 
qreal calcProbOfMultiQubitOutcome (Qureg qureg, std::vector< int > qubits, std::vector< int > outcomes)
 
qreal calcProbOfQubitOutcome (Qureg qureg, int qubit, int outcome)
 
void calcProbsOfAllMultiQubitOutcomes (qreal *outcomeProbs, Qureg qureg, int *qubits, int numQubits)
 
std::vector< qreal > calcProbsOfAllMultiQubitOutcomes (Qureg qureg, std::vector< int > qubits)
 

Detailed Description

Functions for non-destructively calculating the probabilities of measurement outcomes.

Function Documentation

◆ calcProbOfBasisState()

qreal calcProbOfBasisState ( Qureg qureg,
qindex index )
Note
Documentation for this function or struct is under construction!
Attention
This function's input validation has not yet been unit tested, so erroneous usage may produce unexpected output. Please use with caution!

Definition at line 224 of file calculations.cpp.

224 {
225 validate_quregFields(qureg, __func__);
226 validate_basisStateIndex(qureg, index, __func__);
227
228 // |i><i| = ||(1+2^N)i>>
229 if (qureg.isDensityMatrix)
230 index *= 1 + powerOf2(qureg.numQubits);
231
232 qcomp amp = localiser_statevec_getAmp(qureg, index);
233 qreal prob = (qureg.isDensityMatrix)?
234 std::real(amp):
235 std::norm(amp);
236
237 return prob;
238}

Referenced by TEST_CASE().

◆ calcProbOfMultiQubitOutcome() [1/2]

qreal calcProbOfMultiQubitOutcome ( Qureg qureg,
int * qubits,
int * outcomes,
int numQubits )
Note
Documentation for this function or struct is under construction!
Attention
This function's input validation has not yet been unit tested, so erroneous usage may produce unexpected output. Please use with caution!

Definition at line 251 of file calculations.cpp.

251 {
252 validate_quregFields(qureg, __func__);
253 validate_targets(qureg, qubits, numQubits, __func__);
254 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
255
256 auto qubitVec = util_getVector(qubits, numQubits);
257 auto outcomeVec = util_getVector(outcomes, numQubits);
258
259 return (qureg.isDensityMatrix)?
260 localiser_densmatr_calcProbOfMultiQubitOutcome(qureg, qubitVec, outcomeVec):
261 localiser_statevec_calcProbOfMultiQubitOutcome(qureg, qubitVec, outcomeVec);
262}

Referenced by applyForcedMultiQubitMeasurement(), calcProbOfMultiQubitOutcome(), calcProbOfQubitOutcome(), and TEST_CASE().

◆ calcProbOfMultiQubitOutcome() [2/2]

qreal calcProbOfMultiQubitOutcome ( Qureg qureg,
std::vector< int > qubits,
std::vector< int > outcomes )
Warning
This function has not yet been unit tested and may contain bugs. Please use with caution!
Note
Documentation for this function or struct is under construction!
Attention
This function's input validation has not yet been unit tested, so erroneous usage may produce unexpected output. Please use with caution!
Remarks
This function is only available in C++.

Definition at line 418 of file calculations.cpp.

418 {
419
420 // C interface discards individual sizes, so we validate
421 validate_measurementOutcomesMatchTargets(qubits.size(), outcomes.size(), __func__);
422
423 // but C function performs all other validation
424 return calcProbOfMultiQubitOutcome(qureg, qubits.data(), outcomes.data(), qubits.size());
425}
qreal calcProbOfMultiQubitOutcome(Qureg qureg, int *qubits, int *outcomes, int numQubits)

◆ calcProbOfQubitOutcome()

qreal calcProbOfQubitOutcome ( Qureg qureg,
int qubit,
int outcome )
Note
Documentation for this function or struct is under construction!
Attention
This function's input validation has not yet been unit tested, so erroneous usage may produce unexpected output. Please use with caution!

Definition at line 241 of file calculations.cpp.

241 {
242 validate_quregFields(qureg, __func__);
243 validate_target(qureg, qubit, __func__);
244 validate_measurementOutcomeIsValid(outcome, __func__);
245
246 int numQubits = 1;
247 return calcProbOfMultiQubitOutcome(qureg, &qubit, &outcome, numQubits);
248}

Referenced by applyForcedQubitMeasurement(), applyQubitMeasurementAndGetProb(), and TEST_CASE().

◆ calcProbsOfAllMultiQubitOutcomes() [1/2]

void calcProbsOfAllMultiQubitOutcomes ( qreal * outcomeProbs,
Qureg qureg,
int * qubits,
int numQubits )
Note
Documentation for this function or struct is under construction!
Attention
This function's input validation has not yet been unit tested, so erroneous usage may produce unexpected output. Please use with caution!

Definition at line 265 of file calculations.cpp.

265 {
266 validate_quregFields(qureg, __func__);
267 validate_targets(qureg, qubits, numQubits, __func__);
268 validate_measurementOutcomesFitInGpuMem(qureg, numQubits, __func__);
269
270 auto qubitVec = util_getVector(qubits, numQubits);
271
272 (qureg.isDensityMatrix)?
273 localiser_densmatr_calcProbsOfAllMultiQubitOutcomes(outcomeProbs, qureg, qubitVec):
274 localiser_statevec_calcProbsOfAllMultiQubitOutcomes(outcomeProbs, qureg, qubitVec);
275}

Referenced by applyMultiQubitMeasurementAndGetProb(), calcProbsOfAllMultiQubitOutcomes(), and TEST_CASE().

◆ calcProbsOfAllMultiQubitOutcomes() [2/2]

std::vector< qreal > calcProbsOfAllMultiQubitOutcomes ( Qureg qureg,
std::vector< int > qubits )
Warning
This function has not yet been unit tested and may contain bugs. Please use with caution!
Note
Documentation for this function or struct is under construction!
Attention
This function's input validation has not yet been unit tested, so erroneous usage may produce unexpected output. Please use with caution!
Remarks
This function is only available in C++.

Definition at line 428 of file calculations.cpp.

428 {
429
430 // allocate temp vector, and validate successful (since it's exponentially large!)
431 vector<qreal> out;
432 qindex numOut = powerOf2(qubits.size());
433 auto callback = [&]() { validate_tempAllocSucceeded(false, numOut, sizeof(qreal), __func__); };
434 util_tryAllocVector(out, numOut, callback);
435
436 calcProbsOfAllMultiQubitOutcomes(out.data(), qureg, qubits.data(), qubits.size());
437 return out;
438}
void calcProbsOfAllMultiQubitOutcomes(qreal *outcomeProbs, Qureg qureg, int *qubits, int numQubits)