test krisi custom basis measurement
This commit is contained in:
parent
66cbe6f971
commit
b5a512f5ac
52
lib.py
52
lib.py
@ -153,13 +153,13 @@ class Vector(Matrix):
|
|||||||
return self.m.shape[1] == 1
|
return self.m.shape[1] == 1
|
||||||
|
|
||||||
|
|
||||||
VectorOrList = Union[Vector, ListOrNdarray]
|
VectorOrList = Union[Vector, Matrix, ListOrNdarray]
|
||||||
|
|
||||||
|
|
||||||
class State(Vector):
|
class State(Vector):
|
||||||
def __init__(self, m: VectorOrList = None, name: str = '', *args, **kwargs):
|
def __init__(self, m: VectorOrList = None, name: str = '', *args, **kwargs):
|
||||||
"""State vector representing quantum state"""
|
"""State vector representing quantum state"""
|
||||||
if type(m) is Vector:
|
if type(m) in [Vector, Matrix]:
|
||||||
super().__init__(m.m, *args, **kwargs)
|
super().__init__(m.m, *args, **kwargs)
|
||||||
else:
|
else:
|
||||||
super().__init__(m, *args, **kwargs)
|
super().__init__(m, *args, **kwargs)
|
||||||
@ -300,17 +300,22 @@ class State(Vector):
|
|||||||
"""
|
"""
|
||||||
if self.measurement_result:
|
if self.measurement_result:
|
||||||
return self.measurement_result
|
return self.measurement_result
|
||||||
weights = []
|
weights, m_ops = [], []
|
||||||
if not basis:
|
if not basis:
|
||||||
basis = []
|
|
||||||
for j in range(len(self)):
|
for j in range(len(self)):
|
||||||
# Default is computational basis
|
# Default is computational basis
|
||||||
e_j = self.get_computational_basis_vector(j)
|
e_j = self.get_computational_basis_vector(j)
|
||||||
m = MeasurementOperator.create_from_basis(e_j)
|
m = MeasurementOperator.create_from_basis(e_j)
|
||||||
basis.append(m)
|
m_ops.append(m)
|
||||||
|
else:
|
||||||
|
assert len(basis) == len(self)
|
||||||
|
for i, e_j in enumerate(basis):
|
||||||
|
# All should be orthogonal
|
||||||
|
if i != 0:
|
||||||
|
assert e_j.is_orthogonal(basis[0])
|
||||||
|
m_ops.append(MeasurementOperator.create_from_basis(e_j))
|
||||||
|
|
||||||
for i in range(len(basis)):
|
for m_op in m_ops:
|
||||||
m_op = basis[i]
|
|
||||||
prob = self.get_prob_from_measurement_op(m_op)
|
prob = self.get_prob_from_measurement_op(m_op)
|
||||||
weights += [prob]
|
weights += [prob]
|
||||||
|
|
||||||
@ -959,6 +964,10 @@ def test():
|
|||||||
assert s("|10>").measure_partial(1) == ("1", _0)
|
assert s("|10>").measure_partial(1) == ("1", _0)
|
||||||
assert s("|10>").measure_partial(2) == ("0", _1)
|
assert s("|10>").measure_partial(2) == ("0", _1)
|
||||||
|
|
||||||
|
# measure in arbitrary basis
|
||||||
|
_0.measure(basis=[_p, _m])
|
||||||
|
s("|00>").measure(basis=[b_phi_p, b_phi_m, b_psi_m, b_psi_p])
|
||||||
|
|
||||||
# Maximally entangled
|
# Maximally entangled
|
||||||
result, pms = b_phi_p.measure_partial(1)
|
result, pms = b_phi_p.measure_partial(1)
|
||||||
if result == "0":
|
if result == "0":
|
||||||
@ -1295,14 +1304,25 @@ def test_light():
|
|||||||
experiment(3, random_lights, [ver_filter, diag_filter, hor_filter])
|
experiment(3, random_lights, [ver_filter, diag_filter, hor_filter])
|
||||||
|
|
||||||
|
|
||||||
|
def test_krisi_measurement():
|
||||||
|
beta = 2.6
|
||||||
|
b_0 = State(1 / np.sqrt(2) * (s("|100>") - s("|010>")))
|
||||||
|
b_1 = State(1 / np.sqrt(2) * (s("|011>") - s("|101>")))
|
||||||
|
meas = s("|000>").measure(basis=[
|
||||||
|
s("|000>"),
|
||||||
|
State(np.cos(beta) * b_0 + np.sin(beta) * s("|001>")),
|
||||||
|
State(-np.sin(beta) * b_0 + np.cos(beta) * s("|001>")),
|
||||||
|
b_0,
|
||||||
|
b_1,
|
||||||
|
State(np.cos(beta) * b_1 + np.sin(beta) * s("|001>")),
|
||||||
|
State(-np.sin(beta) * b_1 + np.cos(beta) * s("|001>")),
|
||||||
|
s("|111>"),
|
||||||
|
])
|
||||||
|
print(meas)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
test()
|
test()
|
||||||
# test_quantum_processor()
|
test_quantum_processor()
|
||||||
# test_light()
|
test_light()
|
||||||
|
test_krisi_measurement()
|
||||||
# Partial measurement - I want to measure just the first qubit...
|
|
||||||
# TODO - makes sense???
|
|
||||||
# m0_ = m0 * I
|
|
||||||
# s("|10>").measure_partial(1)
|
|
||||||
# result_0 = post_measurement.measure()
|
|
||||||
# test_measure_partial()
|
|
||||||
|
Loading…
Reference in New Issue
Block a user