Skip to content

Commit

Permalink
Decouple Plaquette and qubits (#173)
Browse files Browse the repository at this point in the history
This PR decouples the `Plaquette` classes from their `qubits`, removing
`SquarePlaquette` and `RoundedPlaquette` and allowing the description of
higher-level plaquettes with less code duplication.

Fixes #172
  • Loading branch information
nelimee authored Mar 4, 2024
1 parent a3ef9db commit eb7d8c8
Show file tree
Hide file tree
Showing 17 changed files with 215 additions and 311 deletions.
10 changes: 9 additions & 1 deletion notebooks/corner.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
"source": [
"from tqec.templates.constructions.corner import ScalableCorner\n",
"from tqec.templates.scale import Dimension, LinearFunction\n",
"from tqec.display import display_template\n",
"from tqec.templates.display import display_template\n",
"\n",
"# Corner made of 2*2=4 plaquettes for the scaled distances.\n",
"corner = ScalableCorner(Dimension(2, LinearFunction(2)))\n",
Expand Down Expand Up @@ -114,7 +114,15 @@
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.0"
}
},
Expand Down
4 changes: 2 additions & 2 deletions notebooks/doubling_distance.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@
" self,\n",
" plaquette_indices: ty.Sequence[int],\n",
" ) -> numpy.ndarray:\n",
" self._check_plaquette_number(plaquette_indices)\n",
" self._check_plaquette_number(plaquette_indices, 3)\n",
" x_plaquette, z_plaquette, special_plaquette = plaquette_indices[:3]\n",
" arr = super().instantiate([x_plaquette, z_plaquette])\n",
" arr[0, -1] = special_plaquette\n",
Expand Down Expand Up @@ -329,7 +329,7 @@
},
"outputs": [],
"source": [
"from tqec.display import display_template\n",
"from tqec.templates.display import display_template\n",
"\n",
"display_template(doubling_template)"
]
Expand Down
8 changes: 4 additions & 4 deletions notebooks/logical_qubit_extended_memory_experiment.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@
"\n",
"from tqec.templates.constructions.qubit import QubitRectangleTemplate\n",
"from tqec.templates.scale import Dimension, LinearFunction\n",
"from tqec.detectors.operation import make_shift_coords, make_observable\n",
"from tqec.detectors.transformer import transform_to_stimcirq_compatible\n",
"from tqec.circuit.operations.operation import make_shift_coords, make_observable\n",
"from tqec.circuit.operations.transformer import transform_to_stimcirq_compatible\n",
"from tqec.enums import PlaquetteOrientation\n",
"from tqec.generation.circuit import generate_circuit\n",
"from tqec.circuit.circuit import generate_circuit\n",
"from tqec.noise_models import (\n",
" AfterCliffordDepolarizingNoise,\n",
" AfterResetFlipNoise,\n",
Expand All @@ -52,7 +52,7 @@
" MeasurementRoundedPlaquette,\n",
" MeasurementSquarePlaquette,\n",
")\n",
"from tqec.display import display_template"
"from tqec.templates.display import display_template"
]
},
{
Expand Down
27 changes: 4 additions & 23 deletions notebooks/logical_qubit_memory_experiment.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@
"\n",
"from tqec.templates.constructions.qubit import QubitSquareTemplate\n",
"from tqec.templates.scale import Dimension, LinearFunction\n",
"from tqec.detectors.operation import make_observable, make_shift_coords\n",
"from tqec.detectors.transformer import transform_to_stimcirq_compatible\n",
"from tqec.circuit.operations.operation import make_observable, make_shift_coords\n",
"from tqec.circuit.operations.transformer import transform_to_stimcirq_compatible\n",
"from tqec.enums import PlaquetteOrientation\n",
"from tqec.generation.circuit import generate_circuit\n",
"from tqec.circuit.circuit import generate_circuit\n",
"from tqec.noise_models import (\n",
" AfterCliffordDepolarizingNoise,\n",
" AfterResetFlipNoise,\n",
Expand Down Expand Up @@ -414,27 +414,8 @@
"metadata": {},
"outputs": [],
"source": [
"export_stim_files = True\n",
"\n",
"stim_circuit_stim = generate_stim_circuit_stim(3, 0.001, 2)\n",
"stim_circuit_tqec = generate_stim_circuit_tqec(3, 0.001, 2)\n",
"if export_stim_files:\n",
" with open(\"./stim.stim\", \"w\") as f:\n",
" f.write(str(stim_circuit_stim))\n",
" with open(\"./tqec.stim\", \"w\") as f:\n",
" f.write(str(stim_circuit_tqec))\n",
" print(\"Export done!\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"if export_stim_files:\n",
" with open(\"./tqec.stim\", \"r\") as f:\n",
" stim_circuit_tqec = stim.Circuit(f.read())"
"stim_circuit_tqec = generate_stim_circuit_tqec(3, 0.001, 2)"
]
},
{
Expand Down
8 changes: 4 additions & 4 deletions notebooks/move_qubit_along_a_line.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -59,15 +59,15 @@
"from tqec.templates.scale import Dimension, FixedDimension, LinearFunction\n",
"from tqec.templates.composed import ComposedTemplate\n",
"from tqec.templates.base import TemplateWithIndices\n",
"from tqec.detectors.operation import (\n",
"from tqec.circuit.operations.operation import (\n",
" make_shift_coords,\n",
" make_observable,\n",
" Detector,\n",
" make_detector,\n",
")\n",
"from tqec.detectors.transformer import transform_to_stimcirq_compatible\n",
"from tqec.circuit.operations.transformer import transform_to_stimcirq_compatible\n",
"from tqec.enums import PlaquetteOrientation, ABOVE_OF, BELOW_OF, LEFT_OF, RIGHT_OF\n",
"from tqec.generation.circuit import generate_circuit\n",
"from tqec.circuit.circuit import generate_circuit\n",
"from tqec.noise_models import (\n",
" AfterCliffordDepolarizingNoise,\n",
" AfterResetFlipNoise,\n",
Expand All @@ -85,7 +85,7 @@
" MeasurementSquarePlaquette,\n",
" MeasurementRoundedPlaquette,\n",
")\n",
"from tqec.display import display_template"
"from tqec.templates.display import display_template"
]
},
{
Expand Down
14 changes: 9 additions & 5 deletions src/tqec/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@
templates,
)
from ._version import __version__
from .circuit import generate_circuit
from .circuit import (
ScheduledCircuit,
ScheduleException,
generate_circuit,
merge_scheduled_circuits,
)
from .enums import (
CornerPositionEnum,
PlaquetteOrientation,
Expand All @@ -24,10 +29,9 @@
from .plaquette import (
Plaquette,
PlaquetteQubit,
RoundedPlaquette,
ScheduledCircuit,
ScheduleException,
SquarePlaquette,
PlaquetteQubits,
RoundedPlaquetteQubits,
SquarePlaquetteQubits,
)
from .position import (
Displacement,
Expand Down
1 change: 1 addition & 0 deletions src/tqec/circuit/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@
make_shift_coords,
transform_to_stimcirq_compatible,
)
from .schedule import ScheduledCircuit, ScheduleException, merge_scheduled_circuits
15 changes: 6 additions & 9 deletions src/tqec/plaquette/__init__.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
from .plaquette import (
Plaquette,
RoundedPlaquette,
SquarePlaquette,
)
from .qubit import PlaquetteQubit
from ..circuit.schedule import (
ScheduledCircuit,
ScheduleException,
from .plaquette import Plaquette
from .qubit import (
PlaquetteQubit,
PlaquetteQubits,
RoundedPlaquetteQubits,
SquarePlaquetteQubits,
)
23 changes: 17 additions & 6 deletions src/tqec/plaquette/library/empty.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,25 @@
import cirq
from tqec.enums import PlaquetteOrientation
from tqec.plaquette.plaquette import RoundedPlaquette, SquarePlaquette

from tqec.circuit.schedule import ScheduledCircuit
from tqec.enums import PlaquetteOrientation
from tqec.plaquette.plaquette import Plaquette
from tqec.plaquette.qubit import (
PlaquetteQubits,
RoundedPlaquetteQubits,
SquarePlaquetteQubits,
)


class EmptyPlaquette(Plaquette):
def __init__(self, qubits: PlaquetteQubits) -> None:
super().__init__(qubits, ScheduledCircuit(cirq.Circuit()))


class EmptySquarePlaquette(SquarePlaquette):
class EmptySquarePlaquette(EmptyPlaquette):
def __init__(self) -> None:
super().__init__(ScheduledCircuit(cirq.Circuit()))
super().__init__(SquarePlaquetteQubits())


class EmptyRoundedPlaquette(RoundedPlaquette):
class EmptyRoundedPlaquette(EmptyPlaquette):
def __init__(self, orientation: PlaquetteOrientation) -> None:
super().__init__(ScheduledCircuit(cirq.Circuit()), orientation)
super().__init__(RoundedPlaquetteQubits(orientation))
89 changes: 32 additions & 57 deletions src/tqec/plaquette/library/initialisation.py
Original file line number Diff line number Diff line change
@@ -1,74 +1,49 @@
from __future__ import annotations

import typing as ty

import cirq
from tqec.enums import PlaquetteOrientation
from tqec.plaquette.plaquette import RoundedPlaquette, SquarePlaquette

from tqec.circuit.schedule import ScheduledCircuit
from tqec.enums import PlaquetteOrientation
from tqec.plaquette.plaquette import Plaquette
from tqec.plaquette.qubit import (
PlaquetteQubits,
RoundedPlaquetteQubits,
SquarePlaquetteQubits,
)


class ZSquareInitialisationPlaquette(SquarePlaquette):
def __init__(
self, qubits_to_initialise: ty.Sequence[cirq.GridQubit] | None = None
) -> None:
if qubits_to_initialise is None:
qubits_to_initialise = (
SquarePlaquette.get_data_qubits_cirq()
+ SquarePlaquette.get_syndrome_qubits_cirq()
)
class ZInitialisationPlaquette(Plaquette):
def __init__(self, qubits: PlaquetteQubits) -> None:
circuit = cirq.Circuit(
cirq.R(q).with_tags(self._MERGEABLE_TAG) for q in qubits_to_initialise
cirq.R(q).with_tags(self._MERGEABLE_TAG) for q in qubits.to_grid_qubit()
)
super().__init__(ScheduledCircuit(circuit))
super().__init__(qubits, ScheduledCircuit(circuit))


class ZRoundedInitialisationPlaquette(RoundedPlaquette):
def __init__(
self,
orientation: PlaquetteOrientation,
qubits_to_initialise: ty.Sequence[cirq.GridQubit] | None = None,
) -> None:
if qubits_to_initialise is None:
qubits_to_initialise = (
RoundedPlaquette.get_data_qubits_cirq(orientation)
+ RoundedPlaquette.get_syndrome_qubits_cirq()
)
circuit = cirq.Circuit(
cirq.R(q).with_tags(self._MERGEABLE_TAG) for q in qubits_to_initialise
)
super().__init__(ScheduledCircuit(circuit), orientation)
class ZSquareInitialisationPlaquette(ZInitialisationPlaquette):
def __init__(self) -> None:
super().__init__(SquarePlaquetteQubits())


class XSquareInitialisationPlaquette(SquarePlaquette):
def __init__(
self, qubits_to_initialise: ty.Sequence[cirq.GridQubit] | None = None
) -> None:
if qubits_to_initialise is None:
qubits_to_initialise = (
SquarePlaquette.get_data_qubits_cirq()
+ SquarePlaquette.get_syndrome_qubits_cirq()
)
circuit = cirq.Circuit(
(cirq.R(q).with_tags(self._MERGEABLE_TAG), cirq.H(q))
for q in qubits_to_initialise
)
super().__init__(ScheduledCircuit(circuit))
class ZRoundedInitialisationPlaquette(ZInitialisationPlaquette):
def __init__(self, orientation: PlaquetteOrientation) -> None:
super().__init__(RoundedPlaquetteQubits(orientation))


class XRoundedInitialisationPlaquette(RoundedPlaquette):
def __init__(
self,
orientation: PlaquetteOrientation,
qubits_to_initialise: ty.Sequence[cirq.GridQubit] | None = None,
) -> None:
if qubits_to_initialise is None:
qubits_to_initialise = (
RoundedPlaquette.get_data_qubits_cirq(orientation)
+ RoundedPlaquette.get_syndrome_qubits_cirq()
)
class XInitialisationPlaquette(Plaquette):
def __init__(self, qubits: PlaquetteQubits) -> None:
circuit = cirq.Circuit(
(cirq.R(q).with_tags(self._MERGEABLE_TAG), cirq.H(q))
for q in qubits_to_initialise
for q in qubits.to_grid_qubit()
)
super().__init__(ScheduledCircuit(circuit), orientation)
super().__init__(qubits, ScheduledCircuit(circuit))


class XSquareInitialisationPlaquette(XInitialisationPlaquette):
def __init__(self) -> None:
super().__init__(SquarePlaquetteQubits())


class XRoundedInitialisationPlaquette(XInitialisationPlaquette):
def __init__(self, orientation: PlaquetteOrientation) -> None:
super().__init__(RoundedPlaquetteQubits(orientation))
Loading

0 comments on commit eb7d8c8

Please sign in to comment.