The Quantum Exact Simulation Toolkit v4.2.0
Loading...
Searching...
No Matches
Measurements

Functions for effecting destructive measurements. More...

Functions

qreal applyForcedMultiQubitMeasurement (Qureg qureg, int *qubits, int *outcomes, int numQubits)
 
qreal applyForcedQubitMeasurement (Qureg qureg, int target, int outcome)
 
qindex applyMultiQubitMeasurement (Qureg qureg, int *qubits, int numQubits)
 
qindex applyMultiQubitMeasurementAndGetProb (Qureg qureg, int *qubits, int numQubits, qreal *probability)
 
int applyQubitMeasurement (Qureg qureg, int target)
 
int applyQubitMeasurementAndGetProb (Qureg qureg, int target, qreal *probability)
 

Detailed Description

Functions for effecting destructive measurements.

Function Documentation

◆ applyForcedMultiQubitMeasurement()

qreal applyForcedMultiQubitMeasurement ( 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 1698 of file operations.cpp.

1698 {
1699 validate_quregFields(qureg, __func__);
1700 validate_targets(qureg, qubits, numQubits, __func__);
1701 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
1702
1703 auto qubitVec = util_getVector(qubits, numQubits);
1704 auto outcomeVec = util_getVector(outcomes, numQubits);
1705
1706 // ensure probability of the forced measurement outcome is not negligible
1707 qreal prob = calcProbOfMultiQubitOutcome(qureg, qubits, outcomes, numQubits); // harmlessly re-validates
1708 validate_measurementOutcomesProbNotZero(outcomes, numQubits, prob, __func__);
1709
1710 // project to the outcome, renormalising the surviving states
1711 (qureg.isDensityMatrix)?
1712 localiser_densmatr_multiQubitProjector(qureg, qubitVec, outcomeVec, prob):
1713 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, prob);
1714
1715 return prob;
1716}
qreal calcProbOfMultiQubitOutcome(Qureg qureg, int *qubits, int *outcomes, int numQubits)

Referenced by applyForcedMultiQubitMeasurement(), and TEST_CASE().

◆ applyForcedQubitMeasurement()

qreal applyForcedQubitMeasurement ( Qureg qureg,
int target,
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 1634 of file operations.cpp.

1634 {
1635 validate_quregFields(qureg, __func__);
1636 validate_target(qureg, target, __func__);
1637 validate_measurementOutcomeIsValid(outcome, __func__);
1638
1639 // note that we do not merely invoke applyForcedMultiQubitMeasurement()
1640 // because we must validate the renormalising probability and
1641 // report this function's name during the error message
1642 qreal prob = calcProbOfQubitOutcome(qureg, target, outcome); // harmlessly re-validates
1643 validate_measurementOutcomeProbNotZero(outcome, prob, __func__);
1644
1645 // project to the outcome, renormalising the surviving states
1646 (qureg.isDensityMatrix)?
1647 localiser_densmatr_multiQubitProjector(qureg, {target}, {outcome}, prob):
1648 localiser_statevec_multiQubitProjector(qureg, {target}, {outcome}, prob);
1649
1650 return prob;
1651}
qreal calcProbOfQubitOutcome(Qureg qureg, int qubit, int outcome)

Referenced by TEST_CASE().

◆ applyMultiQubitMeasurement()

qindex applyMultiQubitMeasurement ( 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 1653 of file operations.cpp.

1653 {
1654 validate_quregFields(qureg, __func__);
1655 validate_targets(qureg, qubits, numQubits, __func__);
1656
1657 qreal prob = 0; // ignored
1658
1659 // below validates post-measurement and would report 'AndGetProb' function suffix. Eh!
1660 return applyMultiQubitMeasurementAndGetProb(qureg, qubits, numQubits, &prob);
1661}
qindex applyMultiQubitMeasurementAndGetProb(Qureg qureg, int *qubits, int numQubits, qreal *probability)

Referenced by TEST_CASE().

◆ applyMultiQubitMeasurementAndGetProb()

qindex applyMultiQubitMeasurementAndGetProb ( Qureg qureg,
int * qubits,
int numQubits,
qreal * probability )
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 1663 of file operations.cpp.

1663 {
1664 validate_quregFields(qureg, __func__);
1665 validate_targets(qureg, qubits, numQubits, __func__);
1666
1667 // find the probability of all possible outcomes...
1668 qindex numProbs = powerOf2(numQubits);
1669
1670 // by allocating a temp vector, and validating successful (since exponentially big!)
1671 vector<qreal> probs;
1672 auto callback = [&]() { validate_tempAllocSucceeded(false, numProbs, sizeof(qreal), __func__); };
1673 util_tryAllocVector(probs, numProbs, callback);
1674
1675 // populate probs
1676 calcProbsOfAllMultiQubitOutcomes(probs.data(), qureg, qubits, numQubits); // harmlessly re-validates
1677
1678 // we cannot meaningfully sample these probs if not normalised
1679 validate_measurementProbsAreNormalised(probs, __func__);
1680
1681 // randomly choose an outcome
1682 qindex outcome = rand_getRandomMultiQubitOutcome(probs);
1683 *probability = probs[outcome];
1684
1685 // map outcome to individual qubit outcomes
1686 auto qubitVec = util_getVector(qubits, numQubits);
1687 auto outcomeVec = vector<int>(numQubits);
1688 getBitsFromInteger(outcomeVec.data(), outcome, numQubits);
1689
1690 // project to the outcomes, renormalising the surviving states
1691 (qureg.isDensityMatrix)?
1692 localiser_densmatr_multiQubitProjector(qureg, qubitVec, outcomeVec, *probability):
1693 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, *probability);
1694
1695 return outcome;
1696}
void calcProbsOfAllMultiQubitOutcomes(qreal *outcomeProbs, Qureg qureg, int *qubits, int numQubits)

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

◆ applyQubitMeasurement()

int applyQubitMeasurement ( Qureg qureg,
int target )
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 1601 of file operations.cpp.

1601 {
1602 validate_quregFields(qureg, __func__);
1603 validate_target(qureg, target, __func__);
1604
1605 qreal prob = 0; // ignored
1606 return applyQubitMeasurementAndGetProb(qureg, target, &prob); // harmlessly re-validates
1607}
int applyQubitMeasurementAndGetProb(Qureg qureg, int target, qreal *probability)

Referenced by TEST_CASE().

◆ applyQubitMeasurementAndGetProb()

int applyQubitMeasurementAndGetProb ( Qureg qureg,
int target,
qreal * probability )
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 1609 of file operations.cpp.

1609 {
1610 validate_quregFields(qureg, __func__);
1611 validate_target(qureg, target, __func__);
1612
1613 // we do not assume state normalisation (that is posteriori checked),
1614 // so we must perform two reductions; one for each outcome. We choose
1615 // to re-enumerate the state (potentially doubling caching costs) to
1616 // avoid the nuisances/race-cons of parallel adding to two scalars.
1617 vector<qreal> probs(2);
1618 probs[0] = calcProbOfQubitOutcome(qureg, target, 0); // harmlessly re-validates
1619 probs[1] = calcProbOfQubitOutcome(qureg, target, 1); // " "
1620 validate_measurementProbsAreNormalised(probs, __func__);
1621
1622 // randomly choose the outcome
1623 int outcome = rand_getRandomSingleQubitOutcome(probs[0]);
1624 *probability = probs[outcome];
1625
1626 // collapse to the outcome
1627 (qureg.isDensityMatrix)?
1628 localiser_densmatr_multiQubitProjector(qureg, {target}, {outcome}, *probability):
1629 localiser_statevec_multiQubitProjector(qureg, {target}, {outcome}, *probability);
1630
1631 return outcome;
1632}

Referenced by applyQubitMeasurement(), and TEST_CASE().