The Quantum Exact Simulation Toolkit v4.1.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 1893 of file operations.cpp.

1893 {
1894 validate_quregFields(qureg, __func__);
1895 validate_targets(qureg, qubits, numQubits, __func__);
1896 validate_measurementOutcomesAreValid(outcomes, numQubits, __func__);
1897
1898 auto qubitVec = util_getVector(qubits, numQubits);
1899 auto outcomeVec = util_getVector(outcomes, numQubits);
1900
1901 // ensure probability of the forced measurement outcome is not negligible
1902 qreal prob = calcProbOfMultiQubitOutcome(qureg, qubits, outcomes, numQubits); // harmlessly re-validates
1903 validate_measurementOutcomesProbNotZero(outcomes, numQubits, prob, __func__);
1904
1905 // project to the outcome, renormalising the surviving states
1906 (qureg.isDensityMatrix)?
1907 localiser_densmatr_multiQubitProjector(qureg, qubitVec, outcomeVec, prob):
1908 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, prob);
1909
1910 return prob;
1911}
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 1829 of file operations.cpp.

1829 {
1830 validate_quregFields(qureg, __func__);
1831 validate_target(qureg, target, __func__);
1832 validate_measurementOutcomeIsValid(outcome, __func__);
1833
1834 // note that we do not merely invoke applyForcedMultiQubitMeasurement()
1835 // because we must validate the renormalising probability and
1836 // report this function's name during the error message
1837 qreal prob = calcProbOfQubitOutcome(qureg, target, outcome); // harmlessly re-validates
1838 validate_measurementOutcomeProbNotZero(outcome, prob, __func__);
1839
1840 // project to the outcome, renormalising the surviving states
1841 (qureg.isDensityMatrix)?
1842 localiser_densmatr_multiQubitProjector(qureg, {target}, {outcome}, prob):
1843 localiser_statevec_multiQubitProjector(qureg, {target}, {outcome}, prob);
1844
1845 return prob;
1846}
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 1848 of file operations.cpp.

1848 {
1849 validate_quregFields(qureg, __func__);
1850 validate_targets(qureg, qubits, numQubits, __func__);
1851
1852 qreal prob = 0; // ignored
1853
1854 // below validates post-measurement and would report 'AndGetProb' function suffix. Eh!
1855 return applyMultiQubitMeasurementAndGetProb(qureg, qubits, numQubits, &prob);
1856}
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 1858 of file operations.cpp.

1858 {
1859 validate_quregFields(qureg, __func__);
1860 validate_targets(qureg, qubits, numQubits, __func__);
1861
1862 // find the probability of all possible outcomes...
1863 qindex numProbs = powerOf2(numQubits);
1864
1865 // by allocating a temp vector, and validating successful (since exponentially big!)
1866 vector<qreal> probs;
1867 auto callback = [&]() { validate_tempAllocSucceeded(false, numProbs, sizeof(qreal), __func__); };
1868 util_tryAllocVector(probs, numProbs, callback);
1869
1870 // populate probs
1871 calcProbsOfAllMultiQubitOutcomes(probs.data(), qureg, qubits, numQubits); // harmlessly re-validates
1872
1873 // we cannot meaningfully sample these probs if not normalised
1874 validate_measurementProbsAreNormalised(probs, __func__);
1875
1876 // randomly choose an outcome
1877 qindex outcome = rand_getRandomMultiQubitOutcome(probs);
1878 *probability = probs[outcome];
1879
1880 // map outcome to individual qubit outcomes
1881 auto qubitVec = util_getVector(qubits, numQubits);
1882 auto outcomeVec = vector<int>(numQubits);
1883 getBitsFromInteger(outcomeVec.data(), outcome, numQubits);
1884
1885 // project to the outcomes, renormalising the surviving states
1886 (qureg.isDensityMatrix)?
1887 localiser_densmatr_multiQubitProjector(qureg, qubitVec, outcomeVec, *probability):
1888 localiser_statevec_multiQubitProjector(qureg, qubitVec, outcomeVec, *probability);
1889
1890 return outcome;
1891}
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 1796 of file operations.cpp.

1796 {
1797 validate_quregFields(qureg, __func__);
1798 validate_target(qureg, target, __func__);
1799
1800 qreal prob = 0; // ignored
1801 return applyQubitMeasurementAndGetProb(qureg, target, &prob); // harmlessly re-validates
1802}
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 1804 of file operations.cpp.

1804 {
1805 validate_quregFields(qureg, __func__);
1806 validate_target(qureg, target, __func__);
1807
1808 // we do not assume state normalisation (that is posteriori checked),
1809 // so we must perform two reductions; one for each outcome. We choose
1810 // to re-enumerate the state (potentially doubling caching costs) to
1811 // avoid the nuisances/race-cons of parallel adding to two scalars.
1812 vector<qreal> probs(2);
1813 probs[0] = calcProbOfQubitOutcome(qureg, target, 0); // harmlessly re-validates
1814 probs[1] = calcProbOfQubitOutcome(qureg, target, 1); // " "
1815 validate_measurementProbsAreNormalised(probs, __func__);
1816
1817 // randomly choose the outcome
1818 int outcome = rand_getRandomSingleQubitOutcome(probs[0]);
1819 *probability = probs[outcome];
1820
1821 // collapse to the outcome
1822 (qureg.isDensityMatrix)?
1823 localiser_densmatr_multiQubitProjector(qureg, {target}, {outcome}, *probability):
1824 localiser_statevec_multiQubitProjector(qureg, {target}, {outcome}, *probability);
1825
1826 return outcome;
1827}

Referenced by applyQubitMeasurement(), and TEST_CASE().