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
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
__pycache__/
*.DS_Store
.venv
*.egg-info/
*/_version.py
12 changes: 6 additions & 6 deletions graphix_stim_backend/graphix_stim_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from graphix.noise_models.depolarising import DepolarisingNoise, TwoQubitDepolarisingNoise
from graphix.optimization import StandardizedPattern
from graphix.sim.base_backend import Backend, Matrix
from graphix.sim.statevec import Statevec
from graphix.sim.statevec import Statevector
from graphix.simulator import DefaultMeasureMethod
from graphix.states import BasicStates, PlanarState, State
from typing_extensions import assert_never, override
Expand Down Expand Up @@ -53,14 +53,14 @@ class BasicState(Enum):
@staticmethod
def try_from_statevector(sv: Matrix) -> BasicState | None:
"""Return the BasicState corresponding to the parameter, or not if it is not a basic state."""
return next((bs for bs in BasicState if np.all(bs.value.to_statevector() == sv)), None)
return next((bs for bs in BasicState if np.all(bs.value.to_statevector_numpy() == sv)), None)

@staticmethod
def try_from_state(s: State) -> BasicState | None:
"""Return the BasicState corresponding to the parameter, or not if it is not a basic state."""
if isinstance(s, PlanarState):
return next((bs for bs in BasicState if bs.value == s), None)
return BasicState.try_from_statevector(s.to_statevector())
return BasicState.try_from_statevector(s.to_statevector_numpy())


BASIC_STATE_TO_CLIFFORD = {
Expand Down Expand Up @@ -191,7 +191,7 @@ def get_renumbered_graph(pattern: Pattern) -> RenumberedGraph:
:param pattern: pattern
:return: the renumbering and the graph
"""
graph = pattern.extract_graph()
graph = pattern.graph()
nodes = list(graph.nodes())
renumbering = {node: i for i, node in enumerate(graph.nodes())}
renumbered_edges = [(renumbering[u], renumbering[v]) for (u, v) in graph.edges()]
Expand Down Expand Up @@ -250,7 +250,7 @@ class _AbstractStimBackend(Backend[stim.TableauSimulator]):

@override
def add_nodes(self, nodes: Sequence[int], data: Data = BasicStates.PLUS) -> None:
state = BasicState.try_from_statevector(Statevec(data).psi)
state = BasicState.try_from_statevector(Statevector(data).psi)

if state is None:
msg = f"Incorrect state value: stim can only prepare stabiliser states {data}."
Expand Down Expand Up @@ -372,7 +372,7 @@ def get_target(node: int) -> stim.GateTarget:
if cmd.kind == CommandKind.N:
basic_state_or_none = None if fixed_states is None else fixed_states.get(cmd.node)
if basic_state_or_none is None:
basic_state_or_none = BasicState.try_from_statevector(Statevec(cmd.state).psi)
basic_state_or_none = BasicState.try_from_statevector(Statevector(cmd.state).psi)
if basic_state_or_none is None:
msg = f"Non-Pauli preparation: {cmd}"
raise ValueError(msg)
Expand Down
2 changes: 1 addition & 1 deletion graphix_stim_backend/single_pauli_noise_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def nqubits(self) -> int:
return 1

@override
def to_kraus_channel(self) -> KrausChannel:
def to_krauschannel(self) -> KrausChannel:
if self.error_type == "Z":
return KrausChannel([KrausData(self.prob, Ops.Z)])

Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
graphix @ git+https://github.com/TeamGraphix/graphix.git
graphix @ git+https://github.com/matulni/graphix.git@rename_methods
stim>=1.15,<2
10 changes: 5 additions & 5 deletions tests/test_graphix_stim_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
from graphix.random_objects import rand_circuit
from graphix.sim.base_backend import DenseState, Matrix, outer
from graphix.sim.density_matrix import DensityMatrix
from graphix.sim.statevec import Statevec
from graphix.sim.statevec import Statevector
from graphix.simulator import DefaultMeasureMethod
from graphix.states import BasicStates
from numpy.random import PCG64, Generator
Expand All @@ -41,17 +41,17 @@ def fidelity(u: Matrix, v: Matrix) -> float:

def compare_backend_results(state1: DenseState, state2: DenseState) -> float:
"""Compute fidelity between two backend states."""
if isinstance(state1, Statevec) and isinstance(state2, Statevec):
if isinstance(state1, Statevector) and isinstance(state2, Statevector):
return fidelity(state1.flatten(), state2.flatten())
if isinstance(state1, DensityMatrix):
dm1 = state1
elif isinstance(state1, Statevec):
elif isinstance(state1, Statevector):
dm1 = DensityMatrix(state1)
else:
raise NotImplementedError
if isinstance(state2, DensityMatrix):
dm2 = state2
elif isinstance(state2, Statevec):
elif isinstance(state2, Statevector):
dm2 = DensityMatrix(state2)
else:
raise NotImplementedError
Expand Down Expand Up @@ -147,7 +147,7 @@ def simulate_with_noise_model_to_density_matrix(pattern: Pattern, noise_model: N
pattern.simulate_pattern(backend=backend, noise_model=noise_model)
second_pattern = backend.to_pattern([], pattern.output_nodes)
state = second_pattern.simulate_pattern()
assert isinstance(state, Statevec)
assert isinstance(state, Statevector)
return outer(state.psi, state.psi.conj())


Expand Down
Loading