Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 20 additions & 18 deletions graphix/clifford.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,14 +129,15 @@ def measure(self, pauli: Pauli) -> Pauli:
if pauli.symbol == I:
return copy.deepcopy(pauli)
table = CLIFFORD_MEASURE[self.value]
if pauli.symbol == Axis.X:
symbol, sign = table.x
elif pauli.symbol == Axis.Y:
symbol, sign = table.y
elif pauli.symbol == Axis.Z:
symbol, sign = table.z
else:
typing_extensions.assert_never(pauli.symbol)
match pauli.symbol:
case Axis.X:
symbol, sign = table.x
case Axis.Y:
symbol, sign = table.y
case Axis.Z:
symbol, sign = table.z
case _:
typing_extensions.assert_never(pauli.symbol)
return pauli.unit * Pauli(symbol, ComplexUnit.from_properties(sign=sign))

def commute_domains(self, domains: Domains) -> Domains:
Expand All @@ -151,16 +152,17 @@ def commute_domains(self, domains: Domains) -> Domains:
s_domain = domains.s_domain.copy()
t_domain = domains.t_domain.copy()
for gate in self.hsz:
if gate == Clifford.I:
pass
elif gate == Clifford.H:
t_domain, s_domain = s_domain, t_domain
elif gate == Clifford.S:
t_domain ^= s_domain
elif gate == Clifford.Z:
pass
else: # pragma: no cover
raise RuntimeError(f"{gate} should be either I, H, S or Z.")
match gate:
case Clifford.I:
pass
case Clifford.H:
t_domain, s_domain = s_domain, t_domain
case Clifford.S:
t_domain ^= s_domain
case Clifford.Z:
pass
case _: # pragma: no cover
raise RuntimeError(f"{gate} should be either I, H, S or Z.")
return Domains(s_domain, t_domain)


Expand Down
102 changes: 51 additions & 51 deletions graphix/flow/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -600,39 +600,39 @@ def check_well_formed(self) -> None:
correction_set=correction_set,
past_and_present_nodes=past_and_present_nodes_y_meas,
)

if meas == Plane.XY:
if not (node not in correction_set and node in odd_neighbors):
raise FlowPropositionError(
FlowPropositionErrorReason.P4, node=node, correction_set=correction_set
)
elif meas == Plane.XZ:
if not (node in correction_set and node in odd_neighbors):
raise FlowPropositionError(
FlowPropositionErrorReason.P5, node=node, correction_set=correction_set
)
elif meas == Plane.YZ:
if not (node in correction_set and node not in odd_neighbors):
raise FlowPropositionError(
FlowPropositionErrorReason.P6, node=node, correction_set=correction_set
)
elif meas == Axis.X:
if node not in odd_neighbors:
raise FlowPropositionError(
FlowPropositionErrorReason.P7, node=node, correction_set=correction_set
)
elif meas == Axis.Z:
if node not in correction_set:
raise FlowPropositionError(
FlowPropositionErrorReason.P8, node=node, correction_set=correction_set
)
elif meas == Axis.Y:
if node not in closed_odd_neighbors:
raise FlowPropositionError(
FlowPropositionErrorReason.P9, node=node, correction_set=correction_set
)
else:
assert_never(meas)
match meas:
case Plane.XY:
if not (node not in correction_set and node in odd_neighbors):
raise FlowPropositionError(
FlowPropositionErrorReason.P4, node=node, correction_set=correction_set
)
case Plane.XZ:
if not (node in correction_set and node in odd_neighbors):
raise FlowPropositionError(
FlowPropositionErrorReason.P5, node=node, correction_set=correction_set
)
case Plane.YZ:
if not (node in correction_set and node not in odd_neighbors):
raise FlowPropositionError(
FlowPropositionErrorReason.P6, node=node, correction_set=correction_set
)
case Axis.X:
if node not in odd_neighbors:
raise FlowPropositionError(
FlowPropositionErrorReason.P7, node=node, correction_set=correction_set
)
case Axis.Z:
if node not in correction_set:
raise FlowPropositionError(
FlowPropositionErrorReason.P8, node=node, correction_set=correction_set
)
case Axis.Y:
if node not in closed_odd_neighbors:
raise FlowPropositionError(
FlowPropositionErrorReason.P9, node=node, correction_set=correction_set
)
case _:
assert_never(meas)

layer_idx -= 1

Expand Down Expand Up @@ -870,24 +870,24 @@ def check_well_formed(self) -> None:
)

plane = self.node_measurement_label(node)

if plane == Plane.XY:
if not (node not in correction_set and node in odd_neighbors):
raise FlowPropositionError(
FlowPropositionErrorReason.G3, node=node, correction_set=correction_set
)
elif plane == Plane.XZ:
if not (node in correction_set and node in odd_neighbors):
raise FlowPropositionError(
FlowPropositionErrorReason.G4, node=node, correction_set=correction_set
)
elif plane == Plane.YZ:
if not (node in correction_set and node not in odd_neighbors):
raise FlowPropositionError(
FlowPropositionErrorReason.G5, node=node, correction_set=correction_set
)
else:
assert_never(plane)
match plane:
case Plane.XY:
if not (node not in correction_set and node in odd_neighbors):
raise FlowPropositionError(
FlowPropositionErrorReason.G3, node=node, correction_set=correction_set
)
case Plane.XZ:
if not (node in correction_set and node in odd_neighbors):
raise FlowPropositionError(
FlowPropositionErrorReason.G4, node=node, correction_set=correction_set
)
case Plane.YZ:
if not (node in correction_set and node not in odd_neighbors):
raise FlowPropositionError(
FlowPropositionErrorReason.G5, node=node, correction_set=correction_set
)
case _:
assert_never(plane)

layer_idx -= 1

Expand Down
Loading