Gates

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

Functions

qreal collapseToOutcome (Qureg qureg, 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,
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
invalidQuESTInputErrorif 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 726 of file QuEST.c.

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

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
invalidQuESTInputErrorif measureQubit is outside [0, qureg.numQubitsRepresented)
Author
Ania Brown (state-vector)
Tyson Jones (density matrix)

Definition at line 758 of file QuEST.c.

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

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
invalidQuESTInputErrorif measureQubit is outside [0, qureg.numQubitsRepresented)
Author
Ania Brown (state-vector)
Tyson Jones (density matrix)

Definition at line 745 of file QuEST.c.

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

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)
qreal statevec_calcProbOfOutcome(Qureg qureg, int measureQubit, int outcome)
#define qreal
void densmatr_collapseToKnownProbOutcome(Qureg qureg, int measureQubit, int outcome, qreal outcomeProb)
Renorms (/prob) every | * outcome * >< * outcome * | state, setting all others to zero.
Definition: QuEST_cpu.c:785
void qasm_recordMeasurement(Qureg qureg, int measureQubit)
Definition: QuEST_qasm.c:398
void statevec_collapseToKnownProbOutcome(Qureg qureg, int measureQubit, int outcome, qreal outcomeProb)
int statevec_measureWithStats(Qureg qureg, int measureQubit, qreal *outcomeProb)
Definition: QuEST_common.c:361
int isDensityMatrix
Whether this instance is a density-state representation.
Definition: QuEST.h:206
qreal densmatr_calcProbOfOutcome(Qureg qureg, int measureQubit, int outcome)
int densmatr_measureWithStats(Qureg qureg, int measureQubit, qreal *outcomeProb)
Definition: QuEST_common.c:369