Gates

Non-unitary but norm-preserving gates, such as measurements. More...

Functions

qreal collapseToOutcome (Qureg qureg, const int measureQubit, int outcome)
 Updates qureg to be consistent with measuring measureQubit in the given outcome (0 or 1), and returns the probability of such a measurement outcome. More...
 
int measure (Qureg qureg, int measureQubit)
 Measures a single qubit, collapsing it randomly to 0 or 1. More...
 
int measureWithStats (Qureg qureg, int measureQubit, qreal *outcomeProb)
 Measures a single qubit, collapsing it randomly to 0 or 1, and additionally gives the probability of that outcome. More...
 

Detailed Description

Non-unitary but norm-preserving gates, such as measurements.

Function Documentation

◆ collapseToOutcome()

qreal collapseToOutcome ( Qureg  qureg,
const int  measureQubit,
int  outcome 
)

Updates qureg to be consistent with measuring measureQubit in the given outcome (0 or 1), and returns the probability of such a measurement outcome.

This is effectively performing a projection, or a measurement with a forced outcome. This is an irreversible change to the state, whereby computational states inconsistant with the outcome are given zero amplitude and the qureg is renormalised. Exits with error if the given outcome has a near zero probability, and so cannot be collapsed into.

Note that the collapse probably used for renormalisation is calculated for outcome = 0, and assumed 1 minus this probability if outcome = 1. Hence this routine will not correctly project un-normalised quregs onto outcome = 1.

Parameters
[in,out]quregobject representing the set of all qubits
[in]measureQubitqubit to measure
[in]outcometo force the measure qubit to enter
Returns
probability of the (forced) measurement outcome
Exceptions
exitWithErrorif measureQubit is outside [0, qureg.numQubitsRepresented), or if outcome is not in {0, 1}, or if the probability of outcome is zero (within machine epsilon)
Author
Ania Brown (state-vector)
Tyson Jones (density matrix)

Definition at line 724 of file QuEST.c.

724  {
725  validateTarget(qureg, measureQubit, __func__);
726  validateOutcome(outcome, __func__);
727 
728  qreal outcomeProb;
729  if (qureg.isDensityMatrix) {
730  outcomeProb = densmatr_calcProbOfOutcome(qureg, measureQubit, outcome);
731  validateMeasurementProb(outcomeProb, __func__);
732  densmatr_collapseToKnownProbOutcome(qureg, measureQubit, outcome, outcomeProb);
733  } else {
734  outcomeProb = statevec_calcProbOfOutcome(qureg, measureQubit, outcome);
735  validateMeasurementProb(outcomeProb, __func__);
736  statevec_collapseToKnownProbOutcome(qureg, measureQubit, outcome, outcomeProb);
737  }
738 
739  qasm_recordMeasurement(qureg, measureQubit);
740  return outcomeProb;
741 }

References densmatr_calcProbOfOutcome(), densmatr_collapseToKnownProbOutcome(), Qureg::isDensityMatrix, qasm_recordMeasurement(), qreal, statevec_calcProbOfOutcome(), statevec_collapseToKnownProbOutcome(), validateMeasurementProb(), validateOutcome(), and validateTarget().

Referenced by TEST_CASE().

◆ measure()

int measure ( Qureg  qureg,
int  measureQubit 
)

Measures a single qubit, collapsing it randomly to 0 or 1.

Outcome probabilities are weighted by the state vector, which is irreversibly changed after collapse to be consistent with the outcome.

Parameters
[in,out]quregobject representing the set of all qubits
[in]measureQubitqubit to measure
Returns
the measurement outcome, 0 or 1
Exceptions
exitWithErrorif measureQubit is outside [0, qureg.numQubitsRepresented)
Author
Ania Brown (state-vector)
Tyson Jones (density matrix)

Definition at line 756 of file QuEST.c.

756  {
757  validateTarget(qureg, measureQubit, __func__);
758 
759  int outcome;
760  qreal discardedProb;
761  if (qureg.isDensityMatrix)
762  outcome = densmatr_measureWithStats(qureg, measureQubit, &discardedProb);
763  else
764  outcome = statevec_measureWithStats(qureg, measureQubit, &discardedProb);
765 
766  qasm_recordMeasurement(qureg, measureQubit);
767  return outcome;
768 }

References densmatr_measureWithStats(), Qureg::isDensityMatrix, qasm_recordMeasurement(), qreal, statevec_measureWithStats(), and validateTarget().

Referenced by TEST_CASE().

◆ measureWithStats()

int measureWithStats ( Qureg  qureg,
int  measureQubit,
qreal outcomeProb 
)

Measures a single qubit, collapsing it randomly to 0 or 1, and additionally gives the probability of that outcome.

Outcome probabilities are weighted by the state vector, which is irreversibly changed after collapse to be consistent with the outcome.

Parameters
[in,out]quregobject representing the set of all qubits
[in]measureQubitqubit to measure
[out]outcomeProba pointer to a qreal which is set to the probability of the occurred outcome
Returns
the measurement outcome, 0 or 1
Exceptions
exitWithErrorif measureQubit is outside [0, qureg.numQubitsRepresented)
Author
Ania Brown (state-vector)
Tyson Jones (density matrix)

Definition at line 743 of file QuEST.c.

743  {
744  validateTarget(qureg, measureQubit, __func__);
745 
746  int outcome;
747  if (qureg.isDensityMatrix)
748  outcome = densmatr_measureWithStats(qureg, measureQubit, outcomeProb);
749  else
750  outcome = statevec_measureWithStats(qureg, measureQubit, outcomeProb);
751 
752  qasm_recordMeasurement(qureg, measureQubit);
753  return outcome;
754 }

References densmatr_measureWithStats(), Qureg::isDensityMatrix, qasm_recordMeasurement(), statevec_measureWithStats(), and validateTarget().

Referenced by TEST_CASE().

void validateMeasurementProb(qreal prob, const char *caller)
void validateTarget(Qureg qureg, int targetQubit, const char *caller)
void validateOutcome(int outcome, const char *caller)
void densmatr_collapseToKnownProbOutcome(Qureg qureg, const int measureQubit, int outcome, qreal outcomeProb)
Renorms (/prob) every | * outcome * >< * outcome * | state, setting all others to zero.
Definition: QuEST_cpu.c:784
#define qreal
qreal statevec_calcProbOfOutcome(Qureg qureg, const int measureQubit, int outcome)
void statevec_collapseToKnownProbOutcome(Qureg qureg, const int measureQubit, int outcome, qreal outcomeProb)
int statevec_measureWithStats(Qureg qureg, int measureQubit, qreal *outcomeProb)
Definition: QuEST_common.c:360
qreal densmatr_calcProbOfOutcome(Qureg qureg, const int measureQubit, int outcome)
int isDensityMatrix
Whether this instance is a density-state representation.
Definition: QuEST.h:163
void qasm_recordMeasurement(Qureg qureg, const int measureQubit)
Definition: QuEST_qasm.c:398
int densmatr_measureWithStats(Qureg qureg, int measureQubit, qreal *outcomeProb)
Definition: QuEST_common.c:368