diff --git a/src/tqec/__init__.py b/src/tqec/__init__.py index 27b91184..334e8a12 100644 --- a/src/tqec/__init__.py +++ b/src/tqec/__init__.py @@ -1,29 +1,17 @@ from . import ( - detectors, - generation, + circuit, noise_models, plaquette, templates, ) from ._version import __version__ -from .detectors import ( - RelativeMeasurementData, - make_detector, - make_observable, - make_shift_coords, - transform_to_stimcirq_compatible, -) -from .display import ( - display_template, - display_templates_svg, -) +from .circuit import generate_circuit from .enums import ( CornerPositionEnum, PlaquetteOrientation, TemplateRelativePositionEnum, ) from .exceptions import TQECException -from .generation import generate_circuit from .noise_models import ( AfterCliffordDepolarizingNoise, AfterResetFlipNoise, @@ -60,4 +48,6 @@ ScalableCorner, Template, TemplateWithIndices, + display_template, + display_templates_svg, ) diff --git a/src/tqec/circuit/__init__.py b/src/tqec/circuit/__init__.py new file mode 100644 index 00000000..67cde1e7 --- /dev/null +++ b/src/tqec/circuit/__init__.py @@ -0,0 +1,8 @@ +from .circuit import generate_circuit +from .operations import ( + RelativeMeasurementData, + make_detector, + make_observable, + make_shift_coords, + transform_to_stimcirq_compatible, +) diff --git a/src/tqec/generation/circuit.py b/src/tqec/circuit/circuit.py similarity index 98% rename from src/tqec/generation/circuit.py rename to src/tqec/circuit/circuit.py index 4140d8af..99ed3dc6 100644 --- a/src/tqec/generation/circuit.py +++ b/src/tqec/circuit/circuit.py @@ -3,9 +3,10 @@ from copy import deepcopy import cirq + +from tqec.circuit.schedule import ScheduledCircuit, merge_scheduled_circuits from tqec.exceptions import TQECException from tqec.plaquette.plaquette import Plaquette -from tqec.plaquette.schedule import ScheduledCircuit, merge_scheduled_circuits from tqec.position import Displacement from tqec.templates.base import Template diff --git a/src/tqec/generation/circuit_test.py b/src/tqec/circuit/circuit_test.py similarity index 98% rename from src/tqec/generation/circuit_test.py rename to src/tqec/circuit/circuit_test.py index 98cab211..63065652 100644 --- a/src/tqec/generation/circuit_test.py +++ b/src/tqec/circuit/circuit_test.py @@ -2,9 +2,9 @@ import cirq -from tqec.detectors.operation import make_shift_coords +from tqec.circuit.circuit import generate_circuit +from tqec.circuit.operations.operation import make_shift_coords from tqec.enums import PlaquetteOrientation -from tqec.generation.circuit import generate_circuit from tqec.plaquette.library import ( MeasurementRoundedPlaquette, MeasurementSquarePlaquette, diff --git a/src/tqec/detectors/__init__.py b/src/tqec/circuit/operations/__init__.py similarity index 100% rename from src/tqec/detectors/__init__.py rename to src/tqec/circuit/operations/__init__.py diff --git a/src/tqec/detectors/measurement_map.py b/src/tqec/circuit/operations/measurement_map.py similarity index 99% rename from src/tqec/detectors/measurement_map.py rename to src/tqec/circuit/operations/measurement_map.py index 42d0a3ae..5af46296 100644 --- a/src/tqec/detectors/measurement_map.py +++ b/src/tqec/circuit/operations/measurement_map.py @@ -1,7 +1,8 @@ from __future__ import annotations import cirq -from tqec.detectors.operation import RelativeMeasurementsRecord + +from tqec.circuit.operations.operation import RelativeMeasurementsRecord from tqec.exceptions import TQECException diff --git a/src/tqec/detectors/operation.py b/src/tqec/circuit/operations/operation.py similarity index 100% rename from src/tqec/detectors/operation.py rename to src/tqec/circuit/operations/operation.py diff --git a/src/tqec/detectors/transformer.py b/src/tqec/circuit/operations/transformer.py similarity index 98% rename from src/tqec/detectors/transformer.py rename to src/tqec/circuit/operations/transformer.py index c80cb686..36fc3c3b 100644 --- a/src/tqec/detectors/transformer.py +++ b/src/tqec/circuit/operations/transformer.py @@ -6,11 +6,12 @@ import numpy import stimcirq import sympy -from tqec.detectors.measurement_map import ( + +from tqec.circuit.operations.measurement_map import ( CircuitMeasurementMap, compute_global_measurements_lookback_offsets, ) -from tqec.detectors.operation import ( +from tqec.circuit.operations.operation import ( STIM_TAG, Detector, Observable, diff --git a/src/tqec/plaquette/schedule.py b/src/tqec/circuit/schedule.py similarity index 99% rename from src/tqec/plaquette/schedule.py rename to src/tqec/circuit/schedule.py index c8d1ba1b..26b2dc03 100644 --- a/src/tqec/plaquette/schedule.py +++ b/src/tqec/circuit/schedule.py @@ -5,7 +5,8 @@ from copy import deepcopy import cirq -from tqec.detectors.operation import Detector, make_detector + +from tqec.circuit.operations.operation import Detector, make_detector from tqec.exceptions import TQECException diff --git a/src/tqec/generation/__init__.py b/src/tqec/generation/__init__.py deleted file mode 100644 index cf86f0b3..00000000 --- a/src/tqec/generation/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .circuit import generate_circuit diff --git a/src/tqec/generation/topology.py b/src/tqec/generation/topology.py deleted file mode 100644 index 77b937ae..00000000 --- a/src/tqec/generation/topology.py +++ /dev/null @@ -1,34 +0,0 @@ -def compute_qubit_array_shape(number_of_plaquettes: int, plaquette_size: int) -> int: - """Computes the underlying qubit array shape. - - This function computes the shape of the array that represent the qubits needed - by a template that needs number_of_plaquettes plaquettes in the dimension of - interest, each plaquette having plaquette_size qubits in this dimension. - - It takes into account the fact that plaquettes are sharing qubits at their - interfaces. - If we consider that a qubit shared by 2 plaquettes is owned by the plaquette - before it (in the dimension of interest) then: - - the first plaquette owns template_size qubits. - - each following plaquettes owns template_size - 1 qubits. - """ - return plaquette_size + (number_of_plaquettes - 1) * (plaquette_size - 1) - - -def get_plaquette_starting_index(plaquette_size: int, plaquette_index: int) -> int: - """Compute starting index of a given plaquette on a grid of qubits - - This function assumes that **all** plaquette instances have the exact same size. - This assumption is currently asserted in various parts of the code, and so should - be valid. - - This function also assumes that plaquettes are square-like shapes and share qubits - on their edges. - - Args: - plaquette_size: number of qubits required by the plaquette in the - dimension of interest (x or y). - plaquette_index: index of the plaquette we want to know the starting - index of. - """ - return plaquette_index * (plaquette_size - 1) diff --git a/src/tqec/non_template_scaling/__init__.py b/src/tqec/non_template_scaling/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/tqec/non_template_scaling/animated_shape_display.py b/src/tqec/non_template_scaling/animated_shape_display.py deleted file mode 100644 index 420857a7..00000000 --- a/src/tqec/non_template_scaling/animated_shape_display.py +++ /dev/null @@ -1,14 +0,0 @@ -from time import sleep - -import matplotlib.pyplot as plt -import numpy as np - - -def plot_quiver(x_pos, y_pos, x_dir, y_dir, initial_data_plot, label, pause_time=0.5): - plt.clf() - plt.quiver(x_pos, y_pos, x_dir, y_dir, scale=40, label=label) - plt.title("Patch Scaling") - plt.legend() - plt.axis([-5, 35, -20, 20]) - plt.gca().set_aspect("equal", adjustable="box") - plt.pause(pause_time) diff --git a/src/tqec/non_template_scaling/display_data.py b/src/tqec/non_template_scaling/display_data.py deleted file mode 100644 index 495ade8a..00000000 --- a/src/tqec/non_template_scaling/display_data.py +++ /dev/null @@ -1,67 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np - - -def plot_quiver(x_pos, y_pos, x_dir, y_dir, initial_data_plot, label, pause_time=0.5): - plt.clf() - plt.quiver(x_pos, y_pos, x_dir, y_dir, scale=40, label=label) - plt.title("Patch Scaling") - plt.legend() - plt.axis([-5, 35, -20, 20]) - plt.gca().set_aspect("equal", adjustable="box") - plt.pause(pause_time) - - -def generate_coordinates(data): - """data: input as a list [(#, +-1), (#, +-1), ... (#, +-1)] - where each number is the length and the sign is the turning. - this function constructs the coordinates for the positions - and directions of each of these arrows. This prepares the - data to be drawn with matplotlib. - """ - - x_pos = [] - y_pos = [] - x_dir = [] - y_dir = [] - - current_x_pos = 0 # x,y coords, arbitrarily chosen to start at (0,0) - current_y_pos = 0 - current_x_dir = ( - 1 # direction on the grid, arbitrarily chosen to start at (1,0). can be (+-1,0), (0, +-1). - ) - current_y_dir = 0 - - for (length, turning) in data: - # graph where we are - x_pos.append(current_x_pos) - y_pos.append(current_y_pos) - - # graph the direction we are going in - x_dir.append(length * current_x_dir) - y_dir.append(length * current_y_dir) - - # move along this edge and update position - current_x_pos += length * current_x_dir - current_y_pos += length * current_y_dir - - # change direction according to this edge's turning and update direction. - # (x, y), t ----> (t * y, -t * x). I computed this rule for updating direction - # on a chalkboard. - save_current_x_dir = current_x_dir - current_x_dir = turning * current_y_dir - current_y_dir = -turning * save_current_x_dir - - return x_pos, y_pos, x_dir, y_dir - - -def display_shape(x_pos, y_pos, x_dir, y_dir): - # Creating plot - fig, ax = plt.subplots(figsize=(12, 7)) - ax.quiver(x_pos, y_pos, x_dir, y_dir, scale=16) - - ax.axis([-8, 8, -8, 8]) - ax.set_aspect("equal") - - # show plot - plt.show() diff --git a/src/tqec/non_template_scaling/non_template_scaling.py b/src/tqec/non_template_scaling/non_template_scaling.py deleted file mode 100644 index e21bc0b6..00000000 --- a/src/tqec/non_template_scaling/non_template_scaling.py +++ /dev/null @@ -1,154 +0,0 @@ -import matplotlib.pyplot as plt - -from tqec.non_template_scaling.display_data import generate_coordinates, plot_quiver - - -# A class for edges -class Edge: - def __init__(self): - self.length = None - self.turning = None - self.next_edge = None - - def set_length(self, length): - self.length = length - - def set_turning(self, turning): - self.turning = turning - - def set_next_edge(self, next_edge): - self.next_edge = next_edge - - -# A class for whole patches of surface code -class Patch: - def __init__(self, edge_data): - - self.edges = [] - - self.init_edges(edge_data) - - self.num_edges = len(self.edges) - - def init_edges(self, edge_data): - - for i in range(len(edge_data)): - E = Edge() - E.set_length(edge_data[i][0]) - E.set_turning(edge_data[i][1]) - self.edges += [E] - - for i in range(len(self.edges)): - self.edges[i].set_next_edge(self.edges[(i + 1) % len(self.edges)]) - - def scale_up(self): - d_lengths = [0 for i in range(self.num_edges)] - - while min(d_lengths) < 1: - for i in range(self.num_edges): - if d_lengths[i] < 1: - S = self.shift(self.edges[i], 1 - d_lengths[i]) - d_lengths[i] = 1 - d_lengths[(i + 2) % self.num_edges] += S - - def shift(self, edge, k): - edge.length += k - sign = edge.turning * edge.next_edge.turning - edge.next_edge.next_edge.length += sign * k - return sign * k - - def generate_edge_data(self): - edge_data = [[edge.length, edge.turning] for edge in self.edges] - - return edge_data - - def make_plot(self): - - initial_edge_data = self.generate_edge_data() - initial_edge_coords = generate_coordinates(initial_edge_data) - x_pos, y_pos, x_dir, y_dir = initial_edge_coords - - plot_quiver(x_pos, y_pos, x_dir, y_dir, initial_edge_coords, label="Data", pause_time=0.2) - - def animate_scaling(self): - - initial_edge_data = self.generate_edge_data() - initial_edge_coords = generate_coordinates(initial_edge_data) - - d_lengths = [0 for _ in range(self.num_edges)] - - while min(d_lengths) < 1: - for j in range(self.num_edges): - if d_lengths[j] < 1: - S = self.shift(self.edges[j], 1 - d_lengths[j]) - d_lengths[j] = 1 - d_lengths[(j + 2) % self.num_edges] += S - - edge_data = self.generate_edge_data() - x_pos, y_pos, x_dir, y_dir = generate_coordinates(edge_data) - - plot_quiver( - x_pos, y_pos, x_dir, y_dir, initial_edge_coords, label="Data", pause_time=0.2 - ) - - -# Here are a bunch of examples of the code in action - -# test_edge_data = [[3, +1], [3, -1], [2, -1], [3, +1], [3, +1], [3, -1], -# [2, -1], [3, +1], [3, +1], [8, +1], [13, +1], [8, +1]] -# P = Patch(test_edge_data) -# P.animate_scaling() -# #P.make_plot() -# plt.show() - -"""test_edge_data = [[8,+1],[4,+1],[2,+1],[1,+1],[1,-1],[2,-1],[2,-1],[2,-1],[1,+1],[1,+1],[4,+1],[1,+1],[1,-1],[2,-1],[2,-1],[2,-1],[1,+1],[1,+1],[2,+1],[4,+1]] -P = Patch(test_edge_data) -P.animate_scaling() -#P.make_plot() -plt.show()""" - -"""test_edge_data = [[4, +1], [10, +1], [8, +1], [4, -1], [4, +1], [8, +1],[5,-1],[2,+1],[3,+1],[4,-1]] -P = Patch(test_edge_data) -P.animate_scaling() -#P.make_plot() -plt.show()""" - - -"""test_edge_data = [[4, +1], [6, -1], [6, +1], [4, +1], [10, +1], [10, +1]] -P = Patch(test_edge_data) -P.animate_scaling() -P.make_plot() -plt.show()""" - - -"""test_edge_data_shifted = [[3, +1], [3, +1], [8, +1], [13, +1], [8, +1], [3, +1], [3, -1], [2, -1], - [3, +1], [3, +1], [3, -1], [2, -1]] -P = Patch(test_edge_data_shifted) -#P.animate_scaling() -P.make_plot() -plt.show()""" - - -"""test_edge_data_2 = [[4, 1], [4, 1], [4, 1], [4, 1]] -P2 = Patch(test_edge_data_2) -P2.animate_scaling() -plt.show()""" - -""" -test_edge_data_3 = [[1, +1], [7, -1], [1, -1], [6, +1], [2, +1], [3, -1], [2, -1], [2, +1], [1, +1], [2, -1], - [1, +1], [3, -1], [1, -1], [8, +1], [2, +1], [2, -1], [6, +1], [7, +1], [5, +1], [5, +1], - [3, +1], [3, +1], [1, +1], [2, -1], [1, -1], [3, -1], [3, -1], [5, -1], [5, -1], [2, +1], - [1, -1], [4, +1], [4, +1], [3, -1], [3, -1], [3, +1], [3, +1], [2, -1], [1, +1], [1, +1], - [1, -1], [5, +1]] # very messed up with a spiral in it. -P3 = Patch(test_edge_data_3) -P3.animate_scaling() -plt.show()""" - -"""test_edge_data_4 = [[1, +1], [7, -1], [1, -1], [6, +1], [2, +1], [3, -1], [2, -1], [2, +1], [1, +1], [2, -1], - [1, +1], [3, -1], [1, -1], [8, +1], [2, +1], [5, +1], [1, -1], [4, +1], [4, +1], [3, -1], - [3, -1], [3, +1], [3, +1], [2, -1], [1, +1], [1, +1], [1, -1], [5, +1]] - -# # same as 3 but without the spiral -P3 = Patch(test_edge_data_4) -P3.animate_scaling() -plt.show()""" diff --git a/src/tqec/plaquette/__init__.py b/src/tqec/plaquette/__init__.py index 690a48f4..b8405fe5 100644 --- a/src/tqec/plaquette/__init__.py +++ b/src/tqec/plaquette/__init__.py @@ -4,7 +4,7 @@ SquarePlaquette, ) from .qubit import PlaquetteQubit -from .schedule import ( +from ..circuit.schedule import ( ScheduledCircuit, ScheduleException, ) diff --git a/src/tqec/plaquette/library/empty.py b/src/tqec/plaquette/library/empty.py index 98ab4723..e10605c1 100644 --- a/src/tqec/plaquette/library/empty.py +++ b/src/tqec/plaquette/library/empty.py @@ -1,7 +1,7 @@ import cirq from tqec.enums import PlaquetteOrientation from tqec.plaquette.plaquette import RoundedPlaquette, SquarePlaquette -from tqec.plaquette.schedule import ScheduledCircuit +from tqec.circuit.schedule import ScheduledCircuit class EmptySquarePlaquette(SquarePlaquette): diff --git a/src/tqec/plaquette/library/initialisation.py b/src/tqec/plaquette/library/initialisation.py index 33b4c326..62fa33f2 100644 --- a/src/tqec/plaquette/library/initialisation.py +++ b/src/tqec/plaquette/library/initialisation.py @@ -5,7 +5,7 @@ import cirq from tqec.enums import PlaquetteOrientation from tqec.plaquette.plaquette import RoundedPlaquette, SquarePlaquette -from tqec.plaquette.schedule import ScheduledCircuit +from tqec.circuit.schedule import ScheduledCircuit class ZSquareInitialisationPlaquette(SquarePlaquette): diff --git a/src/tqec/plaquette/library/measurement.py b/src/tqec/plaquette/library/measurement.py index ebbbd112..66dc6423 100644 --- a/src/tqec/plaquette/library/measurement.py +++ b/src/tqec/plaquette/library/measurement.py @@ -1,8 +1,9 @@ import cirq -from tqec.detectors.operation import make_detector + +from tqec.circuit.operations.operation import make_detector +from tqec.circuit.schedule import ScheduledCircuit from tqec.enums import PlaquetteOrientation from tqec.plaquette.plaquette import RoundedPlaquette, SquarePlaquette -from tqec.plaquette.schedule import ScheduledCircuit class MeasurementRoundedPlaquette(RoundedPlaquette): diff --git a/src/tqec/plaquette/library/utils/detectors.py b/src/tqec/plaquette/library/utils/detectors.py index 8c25c54b..9b5da61d 100644 --- a/src/tqec/plaquette/library/utils/detectors.py +++ b/src/tqec/plaquette/library/utils/detectors.py @@ -1,5 +1,5 @@ import cirq -from tqec.detectors.operation import RelativeMeasurementData, make_detector +from tqec.circuit.operations.operation import RelativeMeasurementData, make_detector from tqec.plaquette.qubit import PlaquetteQubit diff --git a/src/tqec/plaquette/library/xx.py b/src/tqec/plaquette/library/xx.py index 0d7aa466..ce47e4db 100644 --- a/src/tqec/plaquette/library/xx.py +++ b/src/tqec/plaquette/library/xx.py @@ -6,7 +6,7 @@ from tqec.plaquette.library.utils.detectors import make_memory_experiment_detector from tqec.plaquette.library.utils.pauli import make_pauli_syndrome_measurement_circuit from tqec.plaquette.plaquette import RoundedPlaquette -from tqec.plaquette.schedule import ScheduledCircuit +from tqec.circuit.schedule import ScheduledCircuit class XXMemoryPlaquette(RoundedPlaquette): diff --git a/src/tqec/plaquette/library/xxxx.py b/src/tqec/plaquette/library/xxxx.py index 614dc3e6..b6298a97 100644 --- a/src/tqec/plaquette/library/xxxx.py +++ b/src/tqec/plaquette/library/xxxx.py @@ -5,7 +5,7 @@ from tqec.plaquette.library.utils.detectors import make_memory_experiment_detector from tqec.plaquette.library.utils.pauli import make_pauli_syndrome_measurement_circuit from tqec.plaquette.plaquette import SquarePlaquette -from tqec.plaquette.schedule import ScheduledCircuit +from tqec.circuit.schedule import ScheduledCircuit class XXXXMemoryPlaquette(SquarePlaquette): diff --git a/src/tqec/plaquette/library/zz.py b/src/tqec/plaquette/library/zz.py index ec2fd8de..2bc8f151 100644 --- a/src/tqec/plaquette/library/zz.py +++ b/src/tqec/plaquette/library/zz.py @@ -6,7 +6,7 @@ from tqec.plaquette.library.utils.detectors import make_memory_experiment_detector from tqec.plaquette.library.utils.pauli import make_pauli_syndrome_measurement_circuit from tqec.plaquette.plaquette import RoundedPlaquette -from tqec.plaquette.schedule import ScheduledCircuit +from tqec.circuit.schedule import ScheduledCircuit class ZZMemoryPlaquette(RoundedPlaquette): diff --git a/src/tqec/plaquette/library/zzzz.py b/src/tqec/plaquette/library/zzzz.py index b2a914d4..141940cb 100644 --- a/src/tqec/plaquette/library/zzzz.py +++ b/src/tqec/plaquette/library/zzzz.py @@ -5,7 +5,7 @@ from tqec.plaquette.library.utils.detectors import make_memory_experiment_detector from tqec.plaquette.library.utils.pauli import make_pauli_syndrome_measurement_circuit from tqec.plaquette.plaquette import SquarePlaquette -from tqec.plaquette.schedule import ScheduledCircuit +from tqec.circuit.schedule import ScheduledCircuit class ZZZZMemoryPlaquette(SquarePlaquette): diff --git a/src/tqec/plaquette/plaquette.py b/src/tqec/plaquette/plaquette.py index a477119c..813a9885 100644 --- a/src/tqec/plaquette/plaquette.py +++ b/src/tqec/plaquette/plaquette.py @@ -1,9 +1,9 @@ import cirq +from tqec.circuit.schedule import ScheduledCircuit from tqec.enums import PlaquetteOrientation, PlaquetteSide from tqec.exceptions import TQECException from tqec.plaquette.qubit import PlaquetteQubit -from tqec.plaquette.schedule import ScheduledCircuit from tqec.position import Position diff --git a/src/tqec/templates/__init__.py b/src/tqec/templates/__init__.py index 5d101ddf..f1ebac62 100644 --- a/src/tqec/templates/__init__.py +++ b/src/tqec/templates/__init__.py @@ -11,4 +11,8 @@ QubitSquareTemplate, ScalableCorner, ) +from .display import ( + display_template, + display_templates_svg, +) from .scale import Dimension, FixedDimension, LinearFunction diff --git a/src/tqec/display.py b/src/tqec/templates/display.py similarity index 100% rename from src/tqec/display.py rename to src/tqec/templates/display.py