The Quantum Exact Simulation Toolkit v4.3.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!

Definition at line 1709 of file operations.cpp.

1709 {
1710 validate_quregFields(qureg, __func__);
1711 validate_targets(qureg, qubits, numQubits, __func__);
1712 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
1713
1714 auto qubitList = lists_getList64(qubits, numQubits);
1715 auto outcomeList = lists_getList64(outcomes, numQubits);
1716
1717 // ensure probability of the forced measurement outcome is not negligible
1718 qreal prob = calcProbOfMultiQubitOutcome(qureg, qubits, outcomes, numQubits); // harmlessly re-validates
1719 validate_measurementOutcomesProbNotZero(outcomes, numQubits, prob, __func__);
1720
1721 // project to the outcome, renormalising the surviving states
1722 (qureg.isDensityMatrix)?
1723 localiser_densmatr_multiQubitProjector(qureg, qubitList, outcomeList, prob):
1724 localiser_statevec_multiQubitProjector(qureg, qubitList, outcomeList, prob);
1725
1726 return prob;
1727}
qreal calcProbOfMultiQubitOutcome(Qureg qureg, int *qubits, int *outcomes, int numQubits)

Referenced by applyForcedMultiQubitMeasurement().

◆ applyForcedQubitMeasurement()

qreal applyForcedQubitMeasurement ( Qureg qureg,
int target,
int outcome )
Note
Documentation for this function or struct is under construction!

Definition at line 1642 of file operations.cpp.

1642 {
1643 validate_quregFields(qureg, __func__);
1644 validate_target(qureg, target, __func__);
1645 validate_measurementOutcomeIsValid(outcome, __func__);
1646
1647 // note that we do not merely invoke applyForcedMultiQubitMeasurement()
1648 // because we must validate the renormalising probability and
1649 // report this function's name during the error message
1650 qreal prob = calcProbOfQubitOutcome(qureg, target, outcome); // harmlessly re-validates
1651 validate_measurementOutcomeProbNotZero(outcome, prob, __func__);
1652
1653 auto targList = lists_getList64({target});
1654 auto outcomeList = lists_getList64({outcome});
1655
1656 // project to the outcome, renormalising the surviving states
1657 (qureg.isDensityMatrix)?
1658 localiser_densmatr_multiQubitProjector(qureg, targList, outcomeList, prob):
1659 localiser_statevec_multiQubitProjector(qureg, targList, outcomeList, prob);
1660
1661 return prob;
1662}
qreal calcProbOfQubitOutcome(Qureg qureg, int qubit, int outcome)

◆ applyMultiQubitMeasurement()

qindex applyMultiQubitMeasurement ( Qureg qureg,
int * qubits,
int numQubits )
Note
Documentation for this function or struct is under construction!

Definition at line 1664 of file operations.cpp.

1664 {
1665 validate_quregFields(qureg, __func__);
1666 validate_targets(qureg, qubits, numQubits, __func__);
1667
1668 qreal prob = 0; // ignored
1669
1670 // below validates post-measurement and would report 'AndGetProb' function suffix. Eh!
1671 return applyMultiQubitMeasurementAndGetProb(qureg, qubits, numQubits, &prob);
1672}
qindex applyMultiQubitMeasurementAndGetProb(Qureg qureg, int *qubits, int numQubits, qreal *probability)

Referenced by applyMultiQubitMeasurement().

◆ applyMultiQubitMeasurementAndGetProb()

qindex applyMultiQubitMeasurementAndGetProb ( Qureg qureg,
int * qubits,
int numQubits,
qreal * probability )
Note
Documentation for this function or struct is under construction!

Definition at line 1674 of file operations.cpp.

1674 {
1675 validate_quregFields(qureg, __func__);
1676 validate_targets(qureg, qubits, numQubits, __func__);
1677
1678 // find the probability of all possible outcomes...
1679 qindex numProbs = powerOf2(numQubits);
1680
1681 // by allocating a temp vector, and validating successful (since exponentially big!)
1682 vector<qreal> probs;
1683 auto callback = [&]() { validate_tempListAllocSucceeded(false, numProbs, sizeof(qreal), __func__); };
1684 util_tryAllocVector(probs, numProbs, callback);
1685
1686 // populate probs
1687 calcProbsOfAllMultiQubitOutcomes(probs.data(), qureg, qubits, numQubits); // harmlessly re-validates
1688
1689 // we cannot meaningfully sample these probs if not normalised
1690 validate_measurementProbsAreNormalised(probs, __func__);
1691
1692 // randomly choose an outcome
1693 qindex outcome = rand_getRandomMultiQubitOutcome(probs);
1694 *probability = probs[outcome];
1695
1696 // map outcome to individual qubit outcomes
1697 auto qubitList = lists_getList64(qubits, numQubits);
1698 auto outcomeList = util_getConstantList(-1, numQubits);
1699 setToBitsOfInteger(outcomeList.data(), outcome, numQubits);
1700
1701 // project to the outcomes, renormalising the surviving states
1702 (qureg.isDensityMatrix)?
1703 localiser_densmatr_multiQubitProjector(qureg, qubitList, outcomeList, *probability):
1704 localiser_statevec_multiQubitProjector(qureg, qubitList, outcomeList, *probability);
1705
1706 return outcome;
1707}
void calcProbsOfAllMultiQubitOutcomes(qreal *outcomeProbs, Qureg qureg, int *qubits, int numQubits)

Referenced by applyMultiQubitMeasurement(), and applyMultiQubitMeasurementAndGetProb().

◆ applyQubitMeasurement()

int applyQubitMeasurement ( Qureg qureg,
int target )
Note
Documentation for this function or struct is under construction!

Definition at line 1606 of file operations.cpp.

1606 {
1607 validate_quregFields(qureg, __func__);
1608 validate_target(qureg, target, __func__);
1609
1610 qreal prob = 0; // ignored
1611 return applyQubitMeasurementAndGetProb(qureg, target, &prob); // harmlessly re-validates
1612}
int applyQubitMeasurementAndGetProb(Qureg qureg, int target, qreal *probability)

◆ applyQubitMeasurementAndGetProb()

int applyQubitMeasurementAndGetProb ( Qureg qureg,
int target,
qreal * probability )
Note
Documentation for this function or struct is under construction!

Definition at line 1614 of file operations.cpp.

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

Referenced by applyQubitMeasurement().