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

Functions for effecting destructive measurements. More...

Functions

qreal applyForcedMultiQubitMeasurement (Qureg qureg, int *qubits, int *outcomes, int numQubits)
 
qreal applyForcedMultiQubitMeasurement (Qureg qureg, std::vector< int > qubits, std::vector< int > outcomes)
 
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)
 
qindex applyMultiQubitMeasurementAndGetProb (Qureg qureg, std::vector< int > qubits, 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() [1/2]

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 1877 of file operations.cpp.

1877 {
1878 validate_quregFields(qureg, __func__);
1879 validate_targets(qureg, qubits, numQubits, __func__);
1880 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
1881
1882 auto qubitVec = util_getVector(qubits, numQubits);
1883 auto outcomeVec = util_getVector(outcomes, numQubits);
1884
1885 // ensure probability of the forced measurement outcome is not negligible
1886 qreal prob = calcProbOfMultiQubitOutcome(qureg, qubits, outcomes, numQubits); // harmlessly re-validates
1887 validate_measurementOutcomesProbNotZero(outcomes, numQubits, prob, __func__);
1888
1889 // project to the outcome, renormalising the surviving states
1890 (qureg.isDensityMatrix)?
1891 localiser_densmatr_multiQubitProjector(qureg, qubitVec, outcomeVec, prob):
1892 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, prob);
1893
1894 return prob;
1895}
qreal calcProbOfMultiQubitOutcome(Qureg qureg, int *qubits, int *outcomes, int numQubits)

Referenced by applyForcedMultiQubitMeasurement(), and TEST_CASE().

◆ applyForcedMultiQubitMeasurement() [2/2]

qreal applyForcedMultiQubitMeasurement ( 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!
Attention
This function's input validation has not yet been unit tested, so erroneous usage may produce unexpected output. Please use with caution!
Note
Documentation for this function or struct is under construction!
Remarks
This function is only available in C++.

Definition at line 1904 of file operations.cpp.

1904 {
1905 validate_measurementOutcomesMatchTargets(qubits.size(), outcomes.size(), __func__);
1906
1907 return applyForcedMultiQubitMeasurement(qureg, qubits.data(), outcomes.data(), outcomes.size());
1908}
qreal applyForcedMultiQubitMeasurement(Qureg qureg, int *qubits, int *outcomes, int numQubits)

◆ 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 1813 of file operations.cpp.

1813 {
1814 validate_quregFields(qureg, __func__);
1815 validate_target(qureg, target, __func__);
1816 validate_measurementOutcomeIsValid(outcome, __func__);
1817
1818 // note that we do not merely invoke applyForcedMultiQubitMeasurement()
1819 // because we must validate the renormalising probability and
1820 // report this function's name during the error message
1821 qreal prob = calcProbOfQubitOutcome(qureg, target, outcome); // harmlessly re-validates
1822 validate_measurementOutcomeProbNotZero(outcome, prob, __func__);
1823
1824 // project to the outcome, renormalising the surviving states
1825 (qureg.isDensityMatrix)?
1826 localiser_densmatr_multiQubitProjector(qureg, {target}, {outcome}, prob):
1827 localiser_statevec_multiQubitProjector(qureg, {target}, {outcome}, prob);
1828
1829 return prob;
1830}
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 1832 of file operations.cpp.

1832 {
1833 validate_quregFields(qureg, __func__);
1834 validate_targets(qureg, qubits, numQubits, __func__);
1835
1836 qreal prob = 0; // ignored
1837
1838 // below validates post-measurement and would report 'AndGetProb' function suffix. Eh!
1839 return applyMultiQubitMeasurementAndGetProb(qureg, qubits, numQubits, &prob);
1840}
qindex applyMultiQubitMeasurementAndGetProb(Qureg qureg, int *qubits, int numQubits, qreal *probability)

Referenced by TEST_CASE().

◆ applyMultiQubitMeasurementAndGetProb() [1/2]

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 1842 of file operations.cpp.

1842 {
1843 validate_quregFields(qureg, __func__);
1844 validate_targets(qureg, qubits, numQubits, __func__);
1845
1846 // find the probability of all possible outcomes...
1847 qindex numProbs = powerOf2(numQubits);
1848
1849 // by allocating a temp vector, and validating successful (since exponentially big!)
1850 vector<qreal> probs;
1851 auto callback = [&]() { validate_tempAllocSucceeded(false, numProbs, sizeof(qreal), __func__); };
1852 util_tryAllocVector(probs, numProbs, callback);
1853
1854 // populate probs
1855 calcProbsOfAllMultiQubitOutcomes(probs.data(), qureg, qubits, numQubits); // harmlessly re-validates
1856
1857 // we cannot meaningfully sample these probs if not normalised
1858 validate_measurementProbsAreNormalised(probs, __func__);
1859
1860 // randomly choose an outcome
1861 qindex outcome = rand_getRandomMultiQubitOutcome(probs);
1862 *probability = probs[outcome];
1863
1864 // map outcome to individual qubit outcomes
1865 auto qubitVec = util_getVector(qubits, numQubits);
1866 auto outcomeVec = vector<int>(numQubits);
1867 getBitsFromInteger(outcomeVec.data(), outcome, numQubits);
1868
1869 // project to the outcomes, renormalising the surviving states
1870 (qureg.isDensityMatrix)?
1871 localiser_densmatr_multiQubitProjector(qureg, qubitVec, outcomeVec, *probability):
1872 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, *probability);
1873
1874 return outcome;
1875}
void calcProbsOfAllMultiQubitOutcomes(qreal *outcomeProbs, Qureg qureg, int *qubits, int numQubits)

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

◆ applyMultiQubitMeasurementAndGetProb() [2/2]

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

Definition at line 1899 of file operations.cpp.

1899 {
1900
1901 return applyMultiQubitMeasurementAndGetProb(qureg, qubits.data(), qubits.size(), probability);
1902}

◆ 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 1780 of file operations.cpp.

1780 {
1781 validate_quregFields(qureg, __func__);
1782 validate_target(qureg, target, __func__);
1783
1784 qreal prob = 0; // ignored
1785 return applyQubitMeasurementAndGetProb(qureg, target, &prob); // harmlessly re-validates
1786}
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 1788 of file operations.cpp.

1788 {
1789 validate_quregFields(qureg, __func__);
1790 validate_target(qureg, target, __func__);
1791
1792 // we do not assume state normalisation (that is posteriori checked),
1793 // so we must perform two reductions; one for each outcome. We choose
1794 // to re-enumerate the state (potentially doubling caching costs) to
1795 // avoid the nuisances/race-cons of parallel adding to two scalars.
1796 vector<qreal> probs(2);
1797 probs[0] = calcProbOfQubitOutcome(qureg, target, 0); // harmlessly re-validates
1798 probs[1] = calcProbOfQubitOutcome(qureg, target, 1); // " "
1799 validate_measurementProbsAreNormalised(probs, __func__);
1800
1801 // randomly choose the outcome
1802 int outcome = rand_getRandomSingleQubitOutcome(probs[0]);
1803 *probability = probs[outcome];
1804
1805 // collapse to the outcome
1806 (qureg.isDensityMatrix)?
1807 localiser_densmatr_multiQubitProjector(qureg, {target}, {outcome}, *probability):
1808 localiser_statevec_multiQubitProjector(qureg, {target}, {outcome}, *probability);
1809
1810 return outcome;
1811}

Referenced by applyQubitMeasurement(), and TEST_CASE().