Module dqcsim.common.meas
Contains a class wrapper for Measurement
objects.
Expand source code
"""Contains a class wrapper for `Measurement` objects."""
import dqcsim._dqcsim as raw
from dqcsim.common.arb import ArbData
from dqcsim.common.handle import Handle
import re
_ident_re = re.compile(r'[a-zA-Z0-9_]+')
class Measurement(ArbData):
"""Represents a measurement object.
Measurement objects consist of an integer referencing the qubit that was
measured and a measurement value. The value can be 0, 1, or None
(= undefined).
Measurements also have an attached `ArbData` object. This is modelled in
Python through inheritance.
"""
def __init__(self, qubit, value, *args, **kwargs):
"""Constructs a Measurement object.
The first two positional arguments are the qubit reference and the
measurement value. The remaining positional arguments and the keyword
arguments are used to construct the attached `ArbData` object.
"""
super().__init__(*args, **kwargs)
self.qubit = qubit
self.value = value
@property
def qubit(self): #@
"""The qubit associated with this measurement."""
return self.__qubit
@qubit.setter
def qubit(self, qubit): #@
qubit = int(qubit)
if qubit < 1:
raise ValueError('invalid qubit reference: {!r}'.format(qubit))
self.__qubit = qubit
@property
def value(self): #@
"""The measurement value; either 0, 1, or None (= undefined)."""
return self.__value
@value.setter
def value(self, value): #@
if value is not None:
value = int(bool(value))
self.__value = value
def __eq__(self, other):
if isinstance(other, Measurement):
return super().__eq__(other) and self.qubit == other.qubit and self.value == other.value
return False
@classmethod
def _from_raw(cls, handle): #@
"""Constructs a measurement object from a raw API handle."""
arg = ArbData._from_raw(handle)
with handle as hndl:
value = raw.dqcs_meas_value_get(hndl)
if value == raw.DQCS_MEAS_UNDEFINED:
value = None
elif value == raw.DQCS_MEAS_ZERO:
value = 0
elif value == raw.DQCS_MEAS_ONE:
value = 1
else:
assert(False)
meas = Measurement(raw.dqcs_meas_qubit_get(hndl), value)
meas._args = arg._args
meas._json = arg._json
return meas
def _to_raw(self):
"""Makes an API handle for this measurement object."""
value = self.value
if value is None:
value = raw.DQCS_MEAS_UNDEFINED
elif value == 0:
value = raw.DQCS_MEAS_ZERO
elif value == 1:
value = raw.DQCS_MEAS_ONE
else:
assert(False)
handle = Handle(raw.dqcs_meas_new(self.qubit, value))
super()._to_raw(handle)
return handle
def __repr__(self):
e = [repr(self.qubit), repr(self.value)]
for arg in self._args:
e.append(repr(arg))
for key, value in sorted(self._json.items()):
e.append("{!s}={!r}".format(key, value))
return "Measurement({})".format(', '.join(e))
__str__ = __repr__
Classes
class Measurement (qubit, value, *args, **kwargs)
-
Represents a measurement object.
Measurement objects consist of an integer referencing the qubit that was measured and a measurement value. The value can be 0, 1, or None (= undefined).
Measurements also have an attached
ArbData
object. This is modelled in Python through inheritance.Constructs a Measurement object.
The first two positional arguments are the qubit reference and the measurement value. The remaining positional arguments and the keyword arguments are used to construct the attached
ArbData
object.Expand source code
class Measurement(ArbData): """Represents a measurement object. Measurement objects consist of an integer referencing the qubit that was measured and a measurement value. The value can be 0, 1, or None (= undefined). Measurements also have an attached `ArbData` object. This is modelled in Python through inheritance. """ def __init__(self, qubit, value, *args, **kwargs): """Constructs a Measurement object. The first two positional arguments are the qubit reference and the measurement value. The remaining positional arguments and the keyword arguments are used to construct the attached `ArbData` object. """ super().__init__(*args, **kwargs) self.qubit = qubit self.value = value @property def qubit(self): #@ """The qubit associated with this measurement.""" return self.__qubit @qubit.setter def qubit(self, qubit): #@ qubit = int(qubit) if qubit < 1: raise ValueError('invalid qubit reference: {!r}'.format(qubit)) self.__qubit = qubit @property def value(self): #@ """The measurement value; either 0, 1, or None (= undefined).""" return self.__value @value.setter def value(self, value): #@ if value is not None: value = int(bool(value)) self.__value = value def __eq__(self, other): if isinstance(other, Measurement): return super().__eq__(other) and self.qubit == other.qubit and self.value == other.value return False @classmethod def _from_raw(cls, handle): #@ """Constructs a measurement object from a raw API handle.""" arg = ArbData._from_raw(handle) with handle as hndl: value = raw.dqcs_meas_value_get(hndl) if value == raw.DQCS_MEAS_UNDEFINED: value = None elif value == raw.DQCS_MEAS_ZERO: value = 0 elif value == raw.DQCS_MEAS_ONE: value = 1 else: assert(False) meas = Measurement(raw.dqcs_meas_qubit_get(hndl), value) meas._args = arg._args meas._json = arg._json return meas def _to_raw(self): """Makes an API handle for this measurement object.""" value = self.value if value is None: value = raw.DQCS_MEAS_UNDEFINED elif value == 0: value = raw.DQCS_MEAS_ZERO elif value == 1: value = raw.DQCS_MEAS_ONE else: assert(False) handle = Handle(raw.dqcs_meas_new(self.qubit, value)) super()._to_raw(handle) return handle def __repr__(self): e = [repr(self.qubit), repr(self.value)] for arg in self._args: e.append(repr(arg)) for key, value in sorted(self._json.items()): e.append("{!s}={!r}".format(key, value)) return "Measurement({})".format(', '.join(e)) __str__ = __repr__
Ancestors
Instance variables
var qubit
-
The qubit associated with this measurement.
Expand source code
@property def qubit(self): #@ """The qubit associated with this measurement.""" return self.__qubit
var value
-
The measurement value; either 0, 1, or None (= undefined).
Expand source code
@property def value(self): #@ """The measurement value; either 0, 1, or None (= undefined).""" return self.__value
Inherited members