### Example Measurementf Operators
from ..measurement import Measurement
import numpy as np
[docs]class AmplitudeMeasurement(Measurement):
'''
Amplitude is a sample Measurement subclass that measures the amplitude of being
in certain basis states as function of time throughout some state evolution.
The basis states of interest should be identified using the `subspace` keyword
to the measure function.
'''
[docs] def result_type(self, *args, **kwargs):
return [
('time', float),
('amplitude', float, (self.system.dim,))
]
[docs] def result_shape(self, *args, **kwargs):
return (len(kwargs['int_initial']), len(kwargs.get('int_times', 0)))
[docs] def measure(self, data, subspace=None, params={}, int_kwargs={}, **kwargs):
times = int_kwargs.get('times',[])
rval = np.empty((len(data), len(times)), dtype=self.result_type())
self.__P = None
for i, resultset in enumerate(data):
for j, time in enumerate(resultset['time']):
rval[i, j] = (time, self.amplitudes(resultset['state'][j]))
return rval
[docs] def amplitudes(self, state):
if len(state.shape) > 1:
return np.abs(np.diag(state))
return np.abs(state) ** 2
[docs]class ExpectationMeasurement(Measurement):
'''
ExpectationMeasurement measures the expectation values of a particular set of operators applied to
a system state. It can be initialised using:
>>> ExpectationMeasurement(<Operator 1>, <Operator 2>, ...)
'''
[docs] def init(self, *ops):
self.ops = ops
[docs] def result_type(self, *args, **kwargs):
return [
('time', float),
('expectation', float, (len(self.ops),))
]
[docs] def result_shape(self, *args, **kwargs):
return (len(kwargs['int_initial']), len(kwargs.get('int_times', 0)))
[docs] def measure(self, data, subspace=None, params={}, int_kwargs={}, **kwargs):
times = int_kwargs.get('times',[])
rval = np.empty((len(data), len(times)), dtype=self.result_type())
self.__P = None
for i, resultset in enumerate(data):
for j, time in enumerate(resultset['time']):
rval[i, j] = (time, self.expectations(resultset['state'][j]))
return rval
[docs] def expectations(self, state):
es = []
for op in self.ops:
if len(state.shape) == 1:
state = np.outer(state, state)
es.append(np.trace(np.array(op).dot(state)))
return es
[docs]class LeakageMeasurement(Measurement):
'''
Leakage measures the probability of a quantum system being outside of a specified
subspace. The subspace of interest should be identified using the `subspace` keyword
to the measure function.
'''
[docs] def result_type(self, *args, **kwargs):
return [
('time', float),
('leakage', float)
]
[docs] def result_shape(self, *args, **kwargs):
return (len(kwargs['int_initial']), len(kwargs.get('int_times', 0)))
@property
def result_units(self):
return None
[docs] def measure(self, data, subspace=None, params={}, int_kwargs={}, **kwargs):
times = int_kwargs.get('times',[])
initial = int_kwargs.get('times',[])
output = int_kwargs.get('output',None)
rval = np.empty((len(data), len(times)), dtype=self.result_type(int_initial=initial, int_times=times))
self.__P = None
for i, resultset in enumerate(data):
for j, time in enumerate(resultset['time']):
rval[i, j] = (time, self.leakage(resultset['state'][j], subspace, output, params))
return rval
[docs] def leakage(self, state, subspace, output, params):
if subspace is None:
raise ValueError("Subspace must be non-empty")
if self.__P is None:
self.__P = self.system.subspace_projector(subspace, invert=True, output=output, params=params)
P = self.__P
if len(state.shape) > 1:
return np.trace(np.dot(np.dot(P, state), P))
return np.linalg.norm(np.dot(P, state)) ** 2