From b185f32f189664bb5c73340ae1422fcd0053d87a Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Thu, 28 Aug 2025 16:41:56 +0100 Subject: [PATCH 01/59] Perceval circuit conversion --- optyx/classical.py | 39 ++++- optyx/core/__init__.py | 3 +- optyx/core/backends.py | 8 +- optyx/core/channel.py | 90 +++++++++- optyx/core/control.py | 13 +- optyx/core/diagram.py | 6 +- optyx/core/path.py | 12 +- optyx/core/zw.py | 7 +- optyx/core/zx.py | 5 +- optyx/photonic.py | 82 +++++----- optyx/qubits.py | 6 +- optyx/utils/perceval_conversion.py | 244 ++++++++++++++++++++++++++++ optyx/utils/postselect_parser.py | 214 ++++++++++++++++++++++++ optyx/{_utils.py => utils/utils.py} | 7 + test/test_classical.py | 2 +- test/test_conjugation.py | 5 +- test/test_feed_forward.py | 4 +- test/test_perceval.py | 244 +++++++++++++++++++++++++++- test/test_postselect_parser.py | 167 +++++++++++++++++++ test/test_zw.py | 5 +- test/test_zw_2_circuit.py | 2 +- test/test_zw_truncated_arrays.py | 37 +++++ 22 files changed, 1096 insertions(+), 106 deletions(-) create mode 100644 optyx/utils/perceval_conversion.py create mode 100644 optyx/utils/postselect_parser.py rename optyx/{_utils.py => utils/utils.py} (98%) create mode 100644 test/test_postselect_parser.py diff --git a/optyx/classical.py b/optyx/classical.py index 033519d5..4dc71f19 100644 --- a/optyx/classical.py +++ b/optyx/classical.py @@ -145,6 +145,7 @@ bit, mode, qmode, + qubit, Discard, CQMap, Channel, @@ -163,30 +164,50 @@ class _BitControlledSingleBox(Channel): def __init__( self, control_gate, - default_gate=None + default_gate=None, + classical=False ): if isinstance(control_gate, (Diagram, Channel)): assert control_gate.is_pure, \ "The input gates must be pure quantum channels" control_gate_single = control_gate.get_kraus() + else: + control_gate_single = control_gate + if isinstance(default_gate, (Diagram, Channel)): assert default_gate.is_pure, \ "The input gates must be pure quantum channels" - default_gate = default_gate.get_kraus() - kraus = control.BitControlledBox(control_gate_single, default_gate) + default_gate_single = default_gate.get_kraus() + else: + default_gate_single = default_gate + + if control_gate_single.dom[0] == diagram.bit: + tp = qubit if not classical else bit + else: + tp = qmode if not classical else mode + + kraus = control.BitControlledBox( + control_gate_single, + default_gate_single + ) + super().__init__( f"BitControlledGate({control_gate}, {default_gate})", kraus, - bit @ control_gate.dom, - control_gate.cod + bit @ tp**len(control_gate_single.dom), + tp**len(control_gate_single.cod) ) - def __new__(cls, diag, default_box=None, is_dagger=False): + def __new__(cls, diag, default_box=None, is_dagger=False, classical=False): if default_box is not None: return cls._BitControlledSingleBox( - diag, default_box + diag, default_box, classical=classical ).dagger() if is_dagger else \ - cls._BitControlledSingleBox(diag, default_box) + cls._BitControlledSingleBox( + diag, + default_box, + classical=classical + ) boxes = [] for i in range(len(diag)): @@ -679,4 +700,4 @@ def Id(n): """ if isinstance(n, channel.Ty): return Diagram.id(n) - raise TypeError(f"Expected a channel.Ty, got {type(n)}") + raise TypeError(f"Expected a channel.Ty, got {type(n)}") \ No newline at end of file diff --git a/optyx/core/__init__.py b/optyx/core/__init__.py index d5b8cfff..5951cfd1 100644 --- a/optyx/core/__init__.py +++ b/optyx/core/__init__.py @@ -13,4 +13,5 @@ path zw zx -""" + backends +""" \ No newline at end of file diff --git a/optyx/core/backends.py b/optyx/core/backends.py index 92e3a5ec..b68bb195 100644 --- a/optyx/core/backends.py +++ b/optyx/core/backends.py @@ -1,4 +1,5 @@ """ + Overview -------- @@ -26,7 +27,6 @@ :nosignatures: :toctree: - StateType EvalResult AbstractBackend QuimbBackend @@ -136,8 +136,8 @@ def amplitudes(self, normalise=True) -> dict[tuple[int, ...], float]: """ Get the amplitudes from the result tensor. Returns: - dict: A dictionary mapping - occupation configurations to amplitudes. + dict: A dictionary mapping occupation + configurations to amplitudes. """ if self.state_type != StateType.AMP: raise TypeError( @@ -568,4 +568,4 @@ def eval( ), output_types=diagram.cod, state_type=StateType.PROB - ) + ) \ No newline at end of file diff --git a/optyx/core/channel.py b/optyx/core/channel.py index 2c8192ca..aa65b7bd 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -115,7 +115,7 @@ from pytket.extensions.pyzx import pyzx_to_tk from pyzx import extract_circuit -from optyx._utils import explode_channel +from optyx.utils.utils import explode_channel class Ob(symmetric.Ob): @@ -236,6 +236,7 @@ def double(self): @property def is_pure(self): are_layers_pure = [] + are_layers_classical = [] for layer in self: generator = layer.inside[0][1] @@ -245,7 +246,12 @@ def is_pure(self): isinstance(generator, Discard) ) - return not any(are_layers_pure) + are_layers_classical.append( + all(ty.is_classical for ty in generator.cod.inside) and + all(ty.is_classical for ty in generator.dom.inside) + ) + + return not any(are_layers_pure) or all(are_layers_classical) def get_kraus(self): assert self.is_pure, "Cannot get a Kraus map of non-pure circuit" @@ -380,6 +386,75 @@ def from_graphix(cls, measurement_pattern): from optyx.qubits import Circuit return Circuit(measurement_pattern) + @classmethod + def from_perceval(cls, p): + """ + Convert pcvl.Circuit or pcvl.Processor + into optyx diagrams. + + Cannot convert objects involving components + acting on polarisation modes, time delays, + and with symbols. + """ + from optyx import photonic + from optyx.utils import perceval_conversion + import perceval as pcvl + + if isinstance(p, pcvl.Circuit): + p_ = pcvl.Processor("SLOS", p.m) + p_.add(0, p) + + p_new = pcvl.Processor("SLOS", p.m) + for c in p_.flatten(): + p_new.add(c[0][0], c[1]) + p = p_new + + n_modes = p.circuit_size + circuit = photonic.Id(n_modes) + heralds = p.heralds + + circuit = perceval_conversion.heralds_diagram( + heralds, n_modes, circuit, "in" + ) >> circuit + + for wires, component in p.components: + left = circuit.cod[:min(wires)] + right = circuit.cod[max(wires) + 1:] + + if isinstance(component, pcvl.Detector): + box = perceval_conversion.detector(component, wires) + elif isinstance( + component, + pcvl.components.feed_forward_configurator.FFCircuitProvider + ): + box, left, right = perceval_conversion.ff_circuit_provider( + component, wires, circuit + ) + elif isinstance( + component, + pcvl.components.feed_forward_configurator.FFConfigurator + ): + box, left, right = perceval_conversion.ff_configurator( + component, wires, circuit + ) + elif isinstance(component, pcvl.components.Barrier): + continue + elif hasattr(component, "U"): + box = perceval_conversion.unitary(component, wires) + else: + raise ValueError( + f"Unsupported perceval component type: {type(component)}" + ) + + circuit >>= (left @ box @ right) + + circuit >>= perceval_conversion.heralds_diagram( + heralds, n_modes, circuit, "out" + ) + if p.post_select_fn is not None: + circuit >>= perceval_conversion.postselection(circuit, p) + return circuit + # pylint: disable=invalid-name def __pow__(self, n): if n == 1: @@ -404,7 +479,14 @@ class Channel(symmetric.Box, Diagram): Channel initialised by its Kraus map. """ - def __init__(self, name, kraus, dom=None, cod=None, env=diagram.Ty()): + def __init__( + self, + name, + kraus, + dom=None, + cod=None, + env=diagram.Ty() + ): assert isinstance(kraus, diagram.Diagram) if dom is None: dom = Ty.from_optyx(kraus.dom) @@ -761,4 +843,4 @@ class Hypergraph(hypergraph.Hypergraph): # pragma: no cover Diagram.spider_factory = Spider Diagram.hypergraph_factory = Hypergraph Diagram.braid_factory = Swap -Diagram.sum_factory = Sum +Diagram.sum_factory = Sum \ No newline at end of file diff --git a/optyx/core/control.py b/optyx/core/control.py index f2701323..1216af58 100644 --- a/optyx/core/control.py +++ b/optyx/core/control.py @@ -19,15 +19,6 @@ BitControlledBox ControlledPhaseShift -Functions ---------- - -.. autosummary:: - :template: function.rst - :nosignatures: - :toctree: - - truncation_tensor Examples -------- @@ -49,7 +40,7 @@ from discopy import tensor from discopy.frobenius import Dim import numpy as np -from optyx._utils import BasisTransition +from optyx.utils.utils import BasisTransition from optyx.core import diagram, zw @@ -436,4 +427,4 @@ def dagger(self): return BinaryMatrixBox(self.matrix, not self.is_dagger) def conjugate(self): - return self + return self \ No newline at end of file diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index 4f0d1890..2a6775be 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -121,7 +121,7 @@ Let's check the branching law from [FC23]_. >>> from optyx.core.zw import Create, W ->>> from optyx._utils import compare_arrays_of_different_sizes +>>> from optyx.utils.utils import compare_arrays_of_different_sizes >>> branching_l = Create(1) >> W(2) >>> branching_r = Create(1) @ Create(0) + Create(0) @ Create(1) @@ -226,7 +226,7 @@ from discopy.cat import factory, rsubs from discopy.frobenius import Dim from discopy.quantum.gates import format_number -from optyx._utils import ( +from optyx.utils.utils import ( modify_io_dims_against_max_dim, BasisTransition ) @@ -1020,4 +1020,4 @@ class Hypergraph(hypergraph.Hypergraph): # pragma: no cover Diagram.braid_factory, Diagram.spider_factory = Swap, Spider Diagram.ty_factory = Ty Diagram.sum_factory = Sum -Id = Diagram.id +Id = Diagram.id \ No newline at end of file diff --git a/optyx/core/path.py b/optyx/core/path.py index 973f79fb..22c7e847 100644 --- a/optyx/core/path.py +++ b/optyx/core/path.py @@ -122,14 +122,6 @@ >>> expectation = lambda n: Create(n) >> num_op >> Select(n) >>> assert np.allclose(expectation(5).to_path().eval().array, np.array([5.])) -References ----------- -.. [FGL+23] Heurtel, N., Fyrillas, A., Gliniasty, G., Le Bihan, R., \ - Malherbe, S., Pailhas, M., Bertasi, E., Bourdoncle, B., Emeriau, \ - P.E., Mezher, R., Music, L., Belabas, N., Valiron, B., Senellart, \ - P., Mansfield, S., & Senellart, J. (2023). Perceval: A Software \ - Platform for Discrete Variable Photonic Quantum Computing. Quantum, 7, 931. - """ from __future__ import annotations @@ -143,7 +135,7 @@ from discopy.utils import unbiased import discopy.matrix as underlying from discopy.tensor import Tensor -from optyx._utils import occupation_numbers, amplitudes_2_tensor +from optyx.utils.utils import occupation_numbers, amplitudes_2_tensor def npperm(matrix): @@ -552,4 +544,4 @@ def normalise(self) -> Probabilities: array=self.array / self.array.sum(axis=1)[:, None], dom=self.dom, cod=self.cod, - ) + ) \ No newline at end of file diff --git a/optyx/core/zw.py b/optyx/core/zw.py index 69a784c9..f85b412f 100644 --- a/optyx/core/zw.py +++ b/optyx/core/zw.py @@ -27,7 +27,6 @@ Create Select Endo - Scalar Examples of usage @@ -40,7 +39,7 @@ **W commutativity** ->>> from optyx._utils import compare_arrays_of_different_sizes +>>> from optyx.utils.utils import compare_arrays_of_different_sizes >>> from discopy.drawing import Equation >>> bSym_l = W(2) >>> bSym_r = W(2) >> SWAP @@ -151,7 +150,7 @@ from discopy.frobenius import Dim from discopy import tensor from optyx.core import diagram -from optyx._utils import ( +from optyx.utils.utils import ( occupation_numbers, multinomial, BasisTransition @@ -820,4 +819,4 @@ def Merge(n): def Id(n): return diagram.Diagram.id(n) if \ - isinstance(n, diagram.Ty) else diagram.Diagram.id(diagram.Mode(n)) + isinstance(n, diagram.Ty) else diagram.Diagram.id(diagram.Mode(n)) \ No newline at end of file diff --git a/optyx/core/zx.py b/optyx/core/zx.py index 63a5e674..bfa94d42 100644 --- a/optyx/core/zx.py +++ b/optyx/core/zx.py @@ -15,7 +15,7 @@ :nosignatures: :toctree: - Box + ZXBox Spider Z X @@ -30,7 +30,6 @@ zx_to_path decomp zx2path - circuit2zx Examples of usage @@ -766,4 +765,4 @@ def dagger(self): return Or(n=self.dom.n, is_dagger=not self.is_dagger) def conjugate(self): - return Or(n=self.dom.n, is_dagger=self.is_dagger) + return Or(n=self.dom.n, is_dagger=self.is_dagger) \ No newline at end of file diff --git a/optyx/photonic.py b/optyx/photonic.py index 33ad5ea7..85e52b2a 100644 --- a/optyx/photonic.py +++ b/optyx/photonic.py @@ -36,7 +36,7 @@ ansatz Dual rail encoded operators ------------------------- +---------------------------- .. autosummary:: :template: class.rst @@ -242,18 +242,6 @@ ... .dot(np.array(internal_state_2).conjugate()))**2, 3 ... ) -References ----------- -.. [FC23] de Felice, G., & Coecke, B. (2023). Quantum Linear Optics \ - via String Diagrams. In Proceedings 19th International \ - Conference on Quantum Physics and Logic, Wolfson College, \ - Oxford, UK, 27 June - 1 July 2022 (pp. 83-100). \ - Open Publishing Association. -.. [FSP+23] de Felice, G., Shaikh, R., Poór, B., Yeh, L., Wang, Q., \ - & Coecke, B. (2023). Light-Matter Interaction in the \ - ZXW Calculus. In Proceedings of the Twentieth \ - International Conference on Quantum Physics and Logic, \ - Paris, France, 17-21st July 2023 (pp. 20-46). Open Publishing Association. """ @@ -272,7 +260,7 @@ ) from optyx.classical import ClassicalFunction, DiscardMode -from optyx._utils import matrix_to_zw +from optyx.utils.utils import matrix_to_zw from optyx import ( bit, @@ -342,11 +330,11 @@ class PhotonThresholdMeasurement(Channel): Detects whether one or more photons are present. """ - def __init__(self): + def __init__(self, n=1): super().__init__( "PhotonThresholdMeasurement", - diagram.PhotonThresholdDetector(), - cod=bit + diagram.PhotonThresholdDetector()**n, + cod=bit**n ) @@ -590,7 +578,7 @@ def _compute_array(self): array = [-1j * cos, sin, sin, -1j * cos] else: array = [1j * cos, sin, sin, 1j * cos] - return np.array(array) + return np.array(array).reshape(2, 2) def lambdify(self, *symbols, **kwargs): return lambda *xs: type(self)( @@ -640,24 +628,23 @@ class TBS(AbstractGate): def __init__(self, theta, - is_dagger=False, + is_gate_dagger=False, is_conj=False): self.theta = theta - self.is_dagger = is_dagger + self.is_gate_dagger = is_gate_dagger self.is_conj = is_conj super().__init__( 2, 2, f"TBS({theta})", data=theta ) - self.is_dagger = is_dagger @cached_property def global_phase(self): backend = sp if self.dtype is Expr else np return ( -1j * backend.exp(-1j * self.theta * backend.pi) - if self.is_dagger + if self.is_gate_dagger or self.is_conj else 1j * backend.exp(1j * self.theta * backend.pi) ) @@ -665,19 +652,23 @@ def _compute_array(self): backend = sp if self.dtype is Expr else np sin = backend.sin(self.theta * backend.pi) cos = backend.cos(self.theta * backend.pi) - array = np.array([sin, cos, cos, -sin]) - return np.conjugate(array * self.global_phase) if \ - self.is_conj else array * self.global_phase + array = np.array([sin, cos, cos, -sin]).reshape(2, 2) + if self.is_gate_dagger: + array = np.conjugate(array.T) + if self.is_conj: + array = np.conjugate(array) + return array * self.global_phase def lambdify(self, *symbols, **kwargs): return lambda *xs: type(self)( lambdify(symbols, self.theta, **kwargs)(*xs), - is_dagger=self.is_dagger, + is_gate_dagger=self.is_gate_dagger, + is_conj=self.is_conj ) def _decomp(self): d = BS >> qmode @ Phase(self.theta) >> BS - return d.dagger() if self.is_dagger else d + return d.dagger() if self.is_gate_dagger else d def grad(self, var): """Gradient with respect to :code:`var`.""" @@ -686,10 +677,10 @@ def grad(self, var): return self._decomp().grad(var) def conjugate(self): - return TBS(self.theta, self.is_dagger, not self.is_conj) + return TBS(self.theta, self.is_gate_dagger, not self.is_conj) def dagger(self): - return TBS(self.theta, is_dagger=not self.is_dagger) + return TBS(self.theta, is_gate_dagger=not self.is_gate_dagger, is_conj=self.is_conj) class MZI(AbstractGate): @@ -735,24 +726,23 @@ class MZI(AbstractGate): def __init__(self, theta, phi, - is_dagger=False, + is_gate_dagger=False, is_conj=False): self.theta, self.phi = theta, phi - self.is_dagger = is_dagger + self.is_gate_dagger = is_gate_dagger self.is_conj = is_conj super().__init__( 2, 2, f"MZI({theta}, {phi})", data=(theta, phi) ) - self.is_dagger = is_dagger @cached_property def global_phase(self): backend = sp if self.dtype is Expr else np return ( -1j * backend.exp(-1j * self.theta * backend.pi) - if self.is_dagger + if self.is_gate_dagger or self.is_conj else 1j * backend.exp(1j * self.theta * backend.pi) ) @@ -761,20 +751,24 @@ def _compute_array(self): cos = backend.cos(backend.pi * self.theta) sin = backend.sin(backend.pi * self.theta) exp = backend.exp(1j * 2 * backend.pi * self.phi) - array = np.array([exp * sin, cos, exp * cos, -sin]) - return np.conjugate(array * self.global_phase) if \ - self.is_conj else array * self.global_phase + array = np.array([exp * sin, cos, exp * cos, -sin]).reshape(2, 2) + if self.is_gate_dagger: + array = np.conjugate(array.T) + if self.is_conj: + array = np.conjugate(array) + return array * self.global_phase def lambdify(self, *symbols, **kwargs): return lambda *xs: type(self)( *lambdify(symbols, [self.theta, self.phi], **kwargs)(*xs), - is_dagger=self.is_dagger, + is_gate_dagger=self.is_gate_dagger, + is_conj=self.is_conj ) def _decomp(self): x, y = self.theta, self.phi d = BS >> qmode @ Phase(x) >> BS >> Phase(y) @ qmode - return d.dagger() if self.is_dagger else d + return d.dagger() if self.is_gate_dagger else d def grad(self, var): """Gradient with respect to :code:`var`.""" @@ -783,10 +777,10 @@ def grad(self, var): return self._decomp().grad(var) def dagger(self): - return MZI(self.theta, self.phi, is_dagger=not self.is_dagger) + return MZI(self.theta, self.phi, is_gate_dagger=not self.is_gate_dagger, is_conj=self.is_conj) def conjugate(self): - return MZI(self.theta, self.phi, self.is_dagger, not self.is_conj) + return MZI(self.theta, self.phi, self.is_gate_dagger, not self.is_conj) def ansatz(width, depth): @@ -821,8 +815,10 @@ def p(i, j): n_mzi = (width - 1) // 2 if i % 2 else width // 2 left = qmode**(i % 2) right = qmode**(width - (i % 2) - 2 * n_mzi) - d >>= left @ Diagram.tensor(*[MZI(*p(i, j)) - for j in range(n_mzi)]) @ right + l = Diagram.id(qmode**0) + for j in range(n_mzi): + l @= MZI(*p(i, j)) + d >>= left @ l @ right return d @@ -1113,4 +1109,4 @@ def fusion_II_function(x): def Id(n): return Diagram.id(n) if \ - isinstance(n, channel.Ty) else Diagram.id(qmode**n) + isinstance(n, channel.Ty) else Diagram.id(qmode**n) \ No newline at end of file diff --git a/optyx/qubits.py b/optyx/qubits.py index c7f15631..7a34d88a 100644 --- a/optyx/qubits.py +++ b/optyx/qubits.py @@ -7,7 +7,7 @@ Circuits (from tket, discopy, or PyZX) ------------------------- +--------------------------------------- .. autosummary:: :template: class.rst @@ -273,7 +273,7 @@ from discopy import quantum as quantum_discopy from discopy import symmetric # from pytket import circuit as tket_circuit -from optyx._utils import explode_channel +from optyx.utils.utils import explode_channel from optyx.core import ( channel, diagram, @@ -727,4 +727,4 @@ def Id(n): Qubit identity wire. """ return Diagram.id(n) if \ - isinstance(n, channel.Ty) else Diagram.id(qubit**n) + isinstance(n, channel.Ty) else Diagram.id(qubit**n) \ No newline at end of file diff --git a/optyx/utils/perceval_conversion.py b/optyx/utils/perceval_conversion.py new file mode 100644 index 00000000..baa44225 --- /dev/null +++ b/optyx/utils/perceval_conversion.py @@ -0,0 +1,244 @@ +from optyx.utils.utils import matrix_to_zw, invert_perm +from optyx import Channel, mode, qmode, photonic, bit +from optyx.classical import ClassicalFunction, BitControlledGate +from perceval.components.detector import DetectionType +from optyx.core.channel import Spider, Diagram, Measure +from optyx.classical import Select +from optyx.photonic import Create +from optyx.utils.postselect_parser import compile_postselect +from optyx.core.zw import Endo +import numpy as np +import perceval as pcvl + + +def _default_action(component): + return matrix_to_zw( + np.array(component.default_circuit.U.T, dtype=np.complex128) + ) + + +def _state_predicate(state, ty): + """Return ClassicalFunction that outputs 1 iff input equals 'state'.""" + def f(x): + return [1 if all(s == a for s, a in zip(state, x)) else 0] + return ClassicalFunction(f, ty**len(state), bit) + + +def _rewire_and_context(*, component, wires, circuit, + n_classical, n_action, n_offset, + perm_dom_neg, perm_dom_pos): + """Compute (input_perm, output_perm, left, right) + based on component._offset sign.""" + if component._offset < 0: + # classical wires after action+offset + p_input = ( + list(range(n_action + n_offset, + n_action + n_offset + n_classical)) + + list(range(0, n_action)) + + list(range(n_action, n_action + n_offset)) + ) + input_perm = Diagram.permutation(p_input, perm_dom_neg) + output_perm = Diagram.permutation(invert_perm(p_input), input_perm.cod) + left = circuit.cod[:min(wires) - n_offset - n_action] + right = circuit.cod[max(wires) + 1:] + else: + # classical wires before offset+action + p_input = ( + list(range(n_classical, n_classical + n_offset)) + + list(range(0, n_classical)) + + list(range(n_classical + n_offset, + n_classical + n_offset + n_action)) + ) + input_perm = Diagram.permutation(p_input, perm_dom_pos) + output_perm = Diagram.permutation(invert_perm(p_input), input_perm.cod) + left = circuit.cod[:min(wires)] + right = circuit.cod[max(wires) + n_offset + n_action + 1:] + return input_perm, output_perm, left, right + + +def _assemble_controlled_box( + map_items, *, + input_wires, + default_action, + ): + """ + Build the feed-forward controlled box from (state, action_box) pairs. + action_box must already be a ZW diagram (matrix_to_zw applied). + """ + box = None + n_action = len(default_action.dom) + for i, (state, action) in enumerate(map_items): + if i == 0: + box = input_wires[:len(state)] @ photonic.Id(n_action) + # duplicate classical control and compute predicate + copy = Spider(1, 2, input_wires[0])**len(state) + permutation = Diagram.permutation( + list(range(0, 2*len(state), 2)) + list(range(1, 2*len(state), 2)), + input_wires[0]**(2*len(state)) + ) + func = _state_predicate(list(state), input_wires[0]) + + ctrl_box = BitControlledGate(action, default_action) + q_wires = qmode**n_action + + box >>= ( + copy @ q_wires >> + permutation @ q_wires >> + Diagram.id(input_wires[:len(state)]) @ func @ q_wires >> + Diagram.id(input_wires[:len(state)]) @ ctrl_box + ) + return box + + +def _feedforward_common(*, component, wires, circuit, + map_iter, action_from_item, + use_provider_dom: bool): + """ + Shared implementation for both FFCircuitProvider and FFConfigurator. + """ + default_action = _default_action(component) + + # numbers and offset + n_classical = len(next(iter(map_iter.keys()))) + n_action = len(default_action.dom) + n_offset = abs(component._offset) + + # build permutation domains for input permutation + # if use_provider_dom: + # perm_dom_neg = qmode**(n_action + n_offset) @ mode**n_classical + # perm_dom_pos = mode**n_classical @ qmode**(n_action + n_offset) + # else: + # configurator: the dom is a slice of the current circuit wires + perm_dom_neg = circuit.cod[min(wires) - n_offset - + n_action: max(wires) + 1] + perm_dom_pos = circuit.cod[min(wires): max(wires) + + n_offset + n_action + 1] + + input_perm, output_perm, left, right = _rewire_and_context( + component=component, wires=wires, circuit=circuit, + n_classical=n_classical, n_action=n_action, n_offset=n_offset, + perm_dom_neg=perm_dom_neg, perm_dom_pos=perm_dom_pos + ) + + # prepare (state, action_box) pairs + action_pairs = [] + for state, payload in map_iter.items(): + action_pairs.append((state, action_from_item(payload))) + + # figure out the "offset wires" identity block to thread through + if component._offset < 0: + offset_wires = circuit.cod[ + len(left) + n_action: len(left) + n_action + n_offset + ] + else: + offset_wires = circuit.cod[ + len(left) + n_classical: len(left) + n_classical + n_offset + ] + + box = _assemble_controlled_box( + action_pairs, + input_wires=input_perm.cod[len(offset_wires):], + default_action=default_action + ) + + return (input_perm >> offset_wires @ box >> output_perm), left, right + + +def ff_circuit_provider(component, wires, circuit): + def action_from_item(action_circuit): + return matrix_to_zw(np.array(action_circuit.U.T, dtype=np.complex128)) + + box, left, right = _feedforward_common( + component=component, + wires=wires, + circuit=circuit, + map_iter=component._map, + action_from_item=action_from_item, + use_provider_dom=True, + ) + return box, left, right + + +def ff_configurator(component, wires, circuit): + free_symbols = component._controlled.U.free_symbols + + def action_from_item(symbol_values): + # substitute symbol values and convert to ZW + subs_map = {s: v for s, v in zip(free_symbols, symbol_values.values())} + action_U = np.array( + component._controlled.U.subs(subs_map).evalf().T, + dtype=np.complex128 + ) + return matrix_to_zw(action_U) + + box, left, right = _feedforward_common( + component=component, + wires=wires, + circuit=circuit, + map_iter=component._configs, + action_from_item=action_from_item, + use_provider_dom=False, + ) + return box, left, right + + +def unitary(component, wires): + if component.U.is_symbolic and not isinstance(component.U, pcvl.MatrixN): + if len(component.U.free_symbols) != 0: + raise TypeError("Symbolic circuits are not currently supported") + U = np.array(component.U, dtype=np.complex128) + if U.shape[0] != len(wires): + raise ValueError("A component acting on polarisation modes.") + return Channel(name=component.name, kraus=matrix_to_zw(U.T)) + + +def heralds_diagram(heralds, n_modes, circuit, in_out): + layer = photonic.Id(0) + create_select = ( + Create if in_out == "in" else + Select if in_out == "out" else None + ) + if create_select is None: + raise ValueError("in_out must be either 'in' or 'out'") + + if heralds is not None: + for m in range(n_modes): + if m in heralds: + layer @= create_select(heralds[m]) + else: + layer @= circuit.cod[m] if in_out == "out" else photonic.Id(1) + return layer + + +def detector(component, wires): + if component.type == DetectionType.PNR: + return photonic.NumberResolvingMeasurement(len(wires)) + if component.type == DetectionType.Threshold: + return photonic.PhotonThresholdMeasurement(len(wires)) + raise ValueError(f"Unsupported perceval detector type: {component.type}") + + +def postselection(circuit, p): + measure = Measure(circuit.cod) + n_post = len(circuit.cod) + + copy = Spider(1, 2, mode)**n_post + permutation = Diagram.permutation( + list(range(0, 2*n_post, 2)) + list(range(1, 2*n_post, 2)), + mode**(2*n_post) + ) + measure >>= copy >> permutation + + postselect_f = ClassicalFunction( + compile_postselect(str(p.post_select_fn)), mode**n_post, bit + ) + measure >>= postselect_f @ mode**n_post + + postselection = BitControlledGate( + Diagram.id(mode**n_post), + Channel("PostSelection", Endo(0)**n_post, mode**n_post, mode**n_post), + classical=True + ) + measure >>= postselection + + return measure diff --git a/optyx/utils/postselect_parser.py b/optyx/utils/postselect_parser.py new file mode 100644 index 00000000..d6fdb08f --- /dev/null +++ b/optyx/utils/postselect_parser.py @@ -0,0 +1,214 @@ + +import re +from typing import List + + +class _Tok: + def __init__(self, kind: str, value: str): + self.kind = kind + self.value = value + + +def _tokenize(s: str): + s = s.strip() + # textual logical operators to symbols + s = re.sub(r"\bAND\b|\band\b", "&", s) + s = re.sub(r"\bOR\b|\bor\b", "|", s) + s = re.sub(r"\bXOR\b|\bxor\b", "^", s) + s = re.sub(r"\bNOT\b|\bnot\b", "!", s) + + tokens = [] + i = 0 + while i < len(s): + c = s[i] + if c.isspace(): + i += 1 + continue + if c in "[](),&|^!": + tokens.append(_Tok(c, c)) + i += 1 + continue + if c in "<>=": + if s.startswith("==", i): + tokens.append(_Tok("OP", "==")) + i += 2 + continue + if s.startswith(">=", i): + tokens.append(_Tok("OP", ">=")) + i += 2 + continue + if s.startswith("<=", i): + tokens.append(_Tok("OP", "<=")) + i += 2 + continue + if c == ">": + tokens.append(_Tok("OP", ">")) + i += 1 + continue + if c == "<": + tokens.append(_Tok("OP", "<")) + i += 1 + continue + raise ValueError(f"Unexpected operator at position {i}") + if c.isdigit(): + j = i + while j < len(s) and s[j].isdigit(): + j += 1 + tokens.append(_Tok("INT", s[i:j])) + i = j + continue + if c == ",": + tokens.append(_Tok(",", ",")) + i += 1 + continue + raise ValueError(f"Unexpected character {c!r} at position {i}") + tokens.append(_Tok("EOF", "")) + return tokens + + +class _Cond: + def __init__(self, modes: List[int], op: str, rhs: int): + self.modes = modes + self.op = op + self.rhs = rhs + + def eval(self, counts: List[int]) -> bool: + s = 0 + for m in self.modes: + if m < 0: + raise ValueError("Mode indices must be non-negative") + s += counts[m] if m < len(counts) else 0 + if self.op == "==": + return s == self.rhs + if self.op == ">=": + return s >= self.rhs + if self.op == "<=": + return s <= self.rhs + if self.op == ">": + return s > self.rhs + if self.op == "<": + return s < self.rhs + raise ValueError(f"Unknown operator {self.op!r}") + + +class _Not: + def __init__(self, x): self.x = x + def eval(self, counts: List[int]) -> bool: return not self.x.eval(counts) + + +class _Bin: + def __init__(self, op: str, xs): + self.op = op + self.xs = xs + + def eval(self, counts: List[int]) -> bool: + if self.op == "&": + out = True + for x in self.xs: + out = out and x.eval(counts) + return out + if self.op == "|": + out = False + for x in self.xs: + out = out or x.eval(counts) + return out + if self.op == "^": + acc = False + for x in self.xs: + acc ^= x.eval(counts) + return acc + raise ValueError(f"Unknown logical op {self.op!r}") + + +class _Parser: + def __init__(self, tokens): + self.toks = tokens + self.i = 0 + + def _peek(self): + return self.toks[self.i] + + def _eat(self, kind): + t = self._peek() + if ( + (isinstance(kind, tuple) and + t.kind in kind) or + t.kind == kind or t.value == kind + ): + self.i += 1 + return t + raise ValueError(f"Expected {kind}, got {t.kind}:{t.value}") + + def parse(self): + node = self._parse_or() + if self._peek().kind != "EOF": + raise ValueError("Unexpected trailing input") + return node + + # Precedence: ! > & > ^ > | + def _parse_or(self): + left = self._parse_xor() + xs = [left] + while self._peek().value == "|": + self._eat("|") + xs.append(self._parse_xor()) + return xs[0] if len(xs) == 1 else _Bin("|", xs) + + def _parse_xor(self): + left = self._parse_and() + xs = [left] + while self._peek().value == "^": + self._eat("^") + xs.append(self._parse_and()) + return xs[0] if len(xs) == 1 else _Bin("^", xs) + + def _parse_and(self): + left = self._parse_not() + xs = [left] + while self._peek().value == "&": + self._eat("&") + xs.append(self._parse_not()) + return xs[0] if len(xs) == 1 else _Bin("&", xs) + + def _parse_not(self): + if self._peek().value == "!": + self._eat("!") + return _Not(self._parse_not()) + return self._parse_primary() + + def _parse_primary(self): + t = self._peek() + if t.value == "(": + self._eat("(") + e = self._parse_or() + self._eat(")") + return e + if t.value == "[": + self._eat("[") + modes = [int(self._eat("INT").value)] + while self._peek().value == ",": + self._eat(",") + modes.append(int(self._eat("INT").value)) + self._eat("]") + op = self._eat("OP").value + rhs = int(self._eat("INT").value) + if rhs < 0: + raise ValueError("Photon count must be a non-negative integer") + return _Cond(modes, op, rhs) + raise ValueError(f"Expected condition or '(', got {t.kind}:{t.value}") + + +def compile_postselect(expression: str): + """ + Compile a PostSelect expression into a callable: + f(counts) -> [1] if expression is satisfied on 'counts', otherwise [0]. + + - counts: list of non-negative integers (photons per mode; index = mode id) + - Missing modes referenced by the expression are treated as 0. + """ + ast = _Parser(_tokenize(expression)).parse() + + def predicate(counts): + ok = ast.eval(counts) + return [1] if ok else [0] + return predicate diff --git a/optyx/_utils.py b/optyx/utils/utils.py similarity index 98% rename from optyx/_utils.py rename to optyx/utils/utils.py index e04bf24d..14926aa7 100644 --- a/optyx/_utils.py +++ b/optyx/utils/utils.py @@ -296,6 +296,13 @@ def filter_occupation_numbers( ] +def invert_perm(p): + q = [0] * len(p) + for out, inn in enumerate(p): + q[inn] = out + return q + + class BasisTransition(NamedTuple): """ A single non-zero transition emitted by `truncation_specification`. diff --git a/test/test_classical.py b/test/test_classical.py index 70aa361b..c2a63b7f 100644 --- a/test/test_classical.py +++ b/test/test_classical.py @@ -1,5 +1,5 @@ from optyx.classical import * -from optyx._utils import compare_arrays_of_different_sizes +from optyx.utils.utils import compare_arrays_of_different_sizes def test_addn(): d_1 = Digit(2, 3) >> AddN(2) diff --git a/test/test_conjugation.py b/test/test_conjugation.py index 63df0b5e..fc3859cd 100644 --- a/test/test_conjugation.py +++ b/test/test_conjugation.py @@ -37,14 +37,14 @@ def test_conjugation_LO_Gate(): def test_conjugation_LO_channel(box): gate = box(0.27) hbs_array = gate.array - assert np.allclose(gate.conjugate().to_path().array.flatten(), + assert np.allclose(gate.conjugate().to_path().array, hbs_array.conjugate()) def test_conjugation_MZI_channel(): gate = photonic.MZI(0.27, 0.76) hbs_array = gate.array - assert np.allclose(gate.conjugate().to_path().array.flatten(), + assert np.allclose(gate.conjugate().to_path().array, hbs_array.conjugate()) @@ -65,4 +65,3 @@ def test_conjugation_ZW(): lhs_tensor = lhs.double().to_tensor().eval().array rhs_tensor = rhs.double().to_tensor().eval().array assert np.allclose(lhs_tensor, rhs_tensor) - diff --git a/test/test_feed_forward.py b/test/test_feed_forward.py index 971951b2..84893b50 100644 --- a/test/test_feed_forward.py +++ b/test/test_feed_forward.py @@ -6,7 +6,7 @@ from optyx.core.zw import Create, W, ZBox from optyx.core.diagram import PhotonThresholdDetector, Mode, Swap, Bit, Id from optyx.photonic import Phase, BS, MZI -from optyx._utils import matrix_to_zw +from optyx.utils.utils import matrix_to_zw from optyx.classical import BitControlledGate, BitControlledPhaseShift from optyx.core.channel import Channel, qmode from optyx import photonic @@ -333,4 +333,4 @@ def test_matrix_to_zw(self): ) assert np.allclose(diagram1.to_tensor().eval().array, - diagram2.to_tensor().eval().array) + diagram2.to_tensor().eval().array) \ No newline at end of file diff --git a/test/test_perceval.py b/test/test_perceval.py index 0d88f4a1..6f2bffa3 100644 --- a/test/test_perceval.py +++ b/test/test_perceval.py @@ -1,13 +1,25 @@ import pytest - +import math from optyx.core.zw import * from optyx.photonic import ( BS as BS_, BBS as BBS_, Phase as Phase_, + Create as Create_, + ansatz ) +from perceval.components.unitary_components import BS as BS_p from optyx.core.diagram import Mode, Diagram import numpy as np +import perceval as pcvl +from perceval import catalog +from optyx.qubits import Z, Scalar, Ket +from optyx.photonic import DualRail +from optyx import Channel +import random +from perceval.backends import SLOSBackend +from perceval.simulators import Simulator +from perceval.components import Source BS = BS_.get_kraus() BBS = lambda theta: BBS_(theta).get_kraus() @@ -35,3 +47,233 @@ def test_perceval_probs_equivalence(circuit: Diagram, n_photons: int): qpath_probs = circuit.to_path().prob(n_photons).normalise() perceval_probs = circuit.to_path().prob(n_photons, with_perceval=True) assert np.isclose(qpath_probs.array, perceval_probs.array).all() + +@pytest.mark.skip(reason="Helper function for testing") +def dict_allclose(d1: dict, d2: dict, *, rel_tol=1e-05, abs_tol=1e-10) -> bool: + all_keys = set(d1.keys()) | set(d2.keys()) + for key in all_keys: + v1 = d1.get(key, 0.0) + v2 = d2.get(key, 0.0) + if not math.isclose(v1, v2, rel_tol=rel_tol, abs_tol=abs_tol): + return False + return True + +@pytest.mark.skip(reason="Helper function for testing") +def check_dict_agreement(d1, d2, rtol=1e-5, atol=1e-8): + for key in d1.keys() - d2.keys(): + assert np.isclose(d1[key], 0, rtol=rtol, atol=atol) + for key in d2.keys() - d1.keys(): + assert np.isclose(d2[key], 0, rtol=rtol, atol=atol) + for key in d1.keys() & d2.keys(): + assert np.isclose(d1[key], d2[key], rtol=rtol, atol=atol) + +def test_perceval_ff_teleportation(): + p = pcvl.Processor("SLOS", 6) + p.add(0, catalog["postprocessed cnot"].build_processor()) + p.add(0, pcvl.BS.H()) + p.add(2, pcvl.Detector.pnr()) + p.add(3, pcvl.Detector.pnr()) + p.add(0, pcvl.Detector.pnr()) + p.add(1, pcvl.Detector.pnr()) + + ff_X = pcvl.FFCircuitProvider(2, 0, pcvl.Circuit(2)) + ff_X.add_configuration([0, 1], pcvl.PERM([1, 0])) + p.add(2, ff_X) + phi = pcvl.P("phi") + ff_Z = pcvl.FFConfigurator(2, 3, pcvl.PS(phi), {"phi": 0}).add_configuration([0, 1], {"phi": np.pi}) + p.add(0, ff_Z) + + to_transmit = (0.7071067811865476+0j)*pcvl.BasicState([1, 0]) + (-0.21850801222441052+0.6724985119639574j)*pcvl.BasicState([0, 1]) + to_transmit.normalize() + + sg = pcvl.StateGenerator(pcvl.Encoding.DUAL_RAIL) + bell_state = sg.bell_state("phi+") + + input_state = to_transmit * bell_state + p.min_detected_photons_filter(2) + + input_state *= pcvl.BasicState([0, 0]) + + p.with_input(input_state) + res = p.probs() + + bell_state = Z(0, 2) @ Scalar(0.5**0.5) + transmit = Ket("+") >> Z(1, 1, 0.3) + + dist = ( + transmit @ bell_state >> + DualRail(3) >> + Channel.from_perceval(p) + ).eval().prob_dist() + + check_dict_agreement( + {tuple(k): v for k, v in dict(res["results"]).items()}, + dist + ) + + +def test_timedelay(): + HOM = pcvl.Processor("SLOS", 2) + + HOM.add(0, pcvl.BS()) + HOM.add(1, pcvl.TD(1)) + HOM.add(0, pcvl.BS()) + + with pytest.raises(ValueError): + Channel.from_perceval(HOM) + + +def test_symbolic(): + N=5 + + bs = pcvl.GenericInterferometer(N, + lambda idx: pcvl.BS(theta=pcvl.P("theta_%d" % idx)) // (0, pcvl.PS(phi=np.pi * 2 * random.random())), + shape=pcvl.InterferometerShape.RECTANGLE, + depth=2 * N, + phase_shifter_fun_gen=lambda idx: pcvl.PS(phi=np.pi*2*random.random())) + + with pytest.raises(TypeError): + Channel.from_perceval(bs) + + +def test_polarisation(): + p = pcvl.Processor("SLOS", 2) + + p.add(0, pcvl.HWP(0.8)) + + with pytest.raises(ValueError): + Channel.from_perceval(p) + + +def test_walk(): + steps = 4 + n = 2*steps + + BS_array = [[[0]*2]*(i+1) for i in range(steps)] + + i_0 = n/2 + for s in range(steps): + if s==0: + BS_array[s][0] = [i_0, i_0-1] + else: + z = 0 + for i, j in BS_array[s-1]: + if [i+1, i] not in BS_array[s]: + BS_array[s][z] = [i+1, i] + z += 1 + if [j, j-1] not in BS_array[s]: + BS_array[s][z] = [j, j-1] + z += 1 + + circuit = pcvl.Circuit(n) + for s in range(steps): + for bs in BS_array[s]: + circuit.add(int(bs[1]), BS_p()) + + # define input state by inserting a photon in the first mode + mode = 3 + in_list = [0]*n + in_list[mode] = 1 + in_state = pcvl.BasicState(in_list) + + # select a backend and define the simulator on the circuit + simulator = Simulator(SLOSBackend()) + simulator.set_circuit(circuit) + + #Define a source and input distribution due to source noise + source = Source(losses=0, indistinguishability=1) + input_distribution = source.generate_distribution(expected_input=in_state) + + prob_dist = simulator.probs_svd(input_distribution) + p_optyx = Channel.from_perceval(circuit) + + prob_dist_optyx = ( + Create_(*in_list) >> + p_optyx + ).eval().prob_dist() + + check_dict_agreement( + {tuple(k): v for k, v in dict(prob_dist["results"]).items()}, + prob_dist_optyx + ) + + # two photons input state + in_list = [0]*n + in_list[3], in_list[4] = 1, 1 + in_state = pcvl.BasicState(in_list) + + # select a backend and define the simulator on the circuit + simulator = Simulator(SLOSBackend()) + simulator.set_circuit(circuit) + + # define a source and input distribution due to source noise + source = Source(losses=0, indistinguishability=1) + input_distribution = source.generate_distribution(expected_input=in_state) + + prob_dist = simulator.probs_svd(input_distribution) + + optyx_res = ( + Create_(*in_list) >> + p_optyx + ).eval().prob_dist() + + check_dict_agreement( + {tuple(k): v for k, v in dict(prob_dist["results"]).items()}, + optyx_res + ) + +def test_cnot(): + QPU = pcvl.Processor("SLOS", 4) + QPU.add(0, pcvl.BS.H()) + p = pcvl.catalog['postprocessed cnot'].build_processor() + QPU.add(0, p) + + a = pcvl.Parameter("a") + b = pcvl.Parameter("b") + + QPU.add(0, pcvl.BS.H(theta=a)) + QPU.add(2, pcvl.BS.H(theta=b)) + + a.set_value(0) + b.set_value(0) + QPU.min_detected_photons_filter(2) + QPU.with_input(pcvl.BasicState([1, 0, 1, 0])) + output_distribution=QPU.probs()["results"] + QPU_optyx = Channel.from_perceval(QPU) + dist_optyx = (Create_(1, 0, 1, 0) >> QPU_optyx).eval().prob_dist() + + check_dict_agreement( + {tuple(k): v for k, v in dict(output_distribution).items()}, + dist_optyx + ) + +def test_unitaries(): + from optyx import Diagram + from optyx.photonic import Create + + def chip_mzi(w, l): + ansatz_ = ansatz(w, l) + symbs = list(ansatz_.free_symbols) + s = [(i, np.random.uniform(0, 1)) for i in symbs] + return ansatz_.subs(*s) + + ansatz_ = chip_mzi(6, 3) + m = ansatz_.to_path().array + c = pcvl.Matrix(m.T) + c = pcvl.components.Unitary(U=c) + state = pcvl.BasicState([1, 1, 1, 1, 1, 1]) + p = pcvl.Processor("SLOS", 6) + p.add(0, c) + p.with_input(state) + p_res = p.probs()["results"] + p_res = {tuple(key): val for key, val in p_res.items()} + + o_res = (Create(1, 1, 1, 1, 1, 1) >> Diagram.from_perceval(p)).eval().prob_dist() + + rounded_result_optyx = {idx: np.round(val, 6) for idx, val in o_res.items()} + non_zero_dict_optyx = {idx: val for idx, val in rounded_result_optyx.items() if val != 0} + + rounded_result_perceval = {idx: np.round(val, 6) for idx, val in p_res.items()} + non_zero_dict_perceval = {idx: val for idx, val in rounded_result_perceval.items() if val != 0} + + assert dict_allclose(non_zero_dict_optyx, non_zero_dict_perceval, rel_tol=1e-03) \ No newline at end of file diff --git a/test/test_postselect_parser.py b/test/test_postselect_parser.py new file mode 100644 index 00000000..86c2c130 --- /dev/null +++ b/test/test_postselect_parser.py @@ -0,0 +1,167 @@ + +import random +import pytest +from optyx.utils.postselect_parser import compile_postselect + +def run(expr, counts): + return compile_postselect(expr)(counts) + +@pytest.mark.parametrize("expr,counts,expected", [ + # Simple equality & inequality + ("[0]==0", [0,1,2,0], [1]), + ("[1]==1", [0,1,2,0], [1]), + ("[2]==2", [0,1,2,0], [1]), + ("[2]==1", [0,1,2,0], [0]), + ("[0]>0", [0,1,2,0], [0]), + ("[1]>=1", [0,1,2,0], [1]), + ("[2]<2", [0,1,2,0], [0]), + ("[2]<=2", [0,1,2,0], [1]), + + # Multi-mode sums + ("[0,1]==1", [0,1,2,0], [1]), + ("[0,1,2]==3", [0,1,2,0], [1]), + ("[0,3]<1", [0,1,2,0], [1]), + + # AND + ("[0,1]==1 & [2]==2", [0,1,2,0], [1]), + ("[0,1]==1 & [2]==1", [0,1,2,0], [0]), + + # OR + ("[0]==1 | [1]==1", [0,1,2,0], [1]), + ("[0]==1 | [2]==1", [0,1,2,0], [0]), + + # XOR + ("[0]==0 ^ [1]==1", [0,1,2,0], [0]), # both true -> false + ("[0]==1 ^ [1]==1", [0,1,2,0], [1]), # false ^ true + + # NOT variants + ("!([0]==1)", [0,1,2,0], [1]), + ("not ([1]==1)", [0,1,2,0], [0]), + ("NOT ([2]==1)", [0,1,2,0], [1]), + + # Parentheses + ("([0]==0 & [1]==1) | [2]==0", [0,1,2,0], [1]), + ("[0]==0 & ([1]==0 | [2]==0)", [0,1,2,0], [0]), + + # Textual logical operators + ("[0,1]==1 and [2]==2", [0,1,2,0], [1]), + ("[0,1]==2 or [2]==2", [0,1,2,0], [1]), + ("[1]==1 xor [2]==2", [0,1,2,0], [0]), + ("not [1]==1", [0,1,2,0], [0]), + + # Out-of-range modes treated as 0 + ("[10]==0", [0,1,2,0], [1]), + ("[10,0]==0", [0,1,2,0], [1]), + ("[10,2]>=2", [0,1,2,0], [1]), + + # More complex datasets + ("[0,1,2]==2 & [3,4]>=4", [1,0,1,2,3], [1]), + ("([0,1]==1) ^ ([2,3]==3)", [1,0,1,2,3], [0]), + ("!([0]==1 ^ [1]==0) | [4]<3", [1,0,1,2,3], [1]), + + # All zeros + ("[0,1,2]==0", [0,0,0], [1]), + ("[0]>0 | [1]>0 | [2]>0", [0,0,0], [0]), + ("!([0]==0 & [1]==0 & [2]==0)", [0,0,0], [0]), + + # All twos + ("[0,1]>=4 & [2,3]>=4", [2,2,2,2], [1]), + ("[0,1,2,3]==8", [2,2,2,2], [1]), + ("[0,1]<4 ^ [2,3]<4", [2,2,2,2], [0]), + + # Mixed parens & ops + ("( [0,1]==2 & [2,3]==0 ) | ( [0]==1 ^ [1]==1 )", [1,1,0,0], [1]), + ("([0]==1 & [1]==1) ^ ([2]==0 & [3]==0)", [1,1,0,0], [0]), + ("([0]==2 | [1]==2) & !([2]==0 & [3]==0)", [1,1,0,0], [0]), + + # <=, >= and more nesting + ("[0,1]<=2 & [2]>=1", [0,2,1], [1]), + ("[0,2]<1 | [1]>2", [0,2,1], [0]), + ("([0,1]==2) ^ !([2]==0)", [0,2,1], [0]), + + # Out-of-range again + ("[0,10]==3 & [3]==1", [3,0,0,1], [1]), + ("[1,2,5]==0", [3,0,0,1], [1]), + ("!([0]==3) | [2]==1", [3,0,0,1], [0]), + + # textual mix + ("[0]==1 and ([1]==0 or [2]==0)", [1,0,0], [1]), + ("not ([0]==1) or [1]==0", [1,0,0], [1]), + ("[0]==0 xor [1]==0", [1,0,0], [1]), + + # Larger list combos + ("[0,2,4]==6 & ([1,3]==0 | [0,1]<3)", [2,0,2,0,2], [1]), + ("([0,1]==2) ^ ([2,3]==2) ^ ([4]==2)", [2,0,2,0,2], [1]), + ("!([0]==2 & [2]==2) | [1,3]>=1", [2,0,2,0,2], [0]), +]) +def test_explicit(expr, counts, expected): + assert run(expr, counts) == expected + +def random_condition(max_mode: int) -> str: + k = random.randint(1, min(3, max_mode+1)) + modes = sorted(random.sample(range(max_mode+1), k)) + op = random.choice(["==", ">=", "<=", ">", "<"]) + rhs = random.randint(0, 3) + return f"[{','.join(map(str,modes))}] {op} {rhs}" + +def random_group(max_mode: int) -> str: + # group uses a single operator among conditions, as per spec + n_conds = random.randint(1, 3) + conds = [random_condition(max_mode) for _ in range(n_conds)] + op = random.choice(["&", "|", "^"]) + s = f" {op} ".join(conds) + return f"({s})" if random.random() < 0.9 else s + +def random_expression(max_mode: int) -> str: + # combine groups with explicit parentheses to avoid ambiguity + n_groups = random.randint(1, 3) + groups = [] + for _ in range(n_groups): + g = random_group(max_mode) + if random.random() < 0.4: + g = "!" + f"({g})" + groups.append(g) + expr = groups[0] + for g in groups[1:]: + op = random.choice(["&", "|", "^"]) + expr = f"({expr}) {op} ({g})" + return expr + +def eval_reference(expr: str, counts): + # a simple reference evaluator by evaluating each condition and using Python's boolean ops + import re + e = expr + e = re.sub(r"\bAND\b|\band\b", "&", e) + e = re.sub(r"\bOR\b|\bor\b", "|", e) + e = re.sub(r"\bXOR\b|\bxor\b", "^", e) + e = re.sub(r"\bNOT\b|\bnot\b", "!", e) + + cond_pat = re.compile(r"\[(?P\s*\d+(?:\s*,\s*\d+)*\s*)\]\s*(?P==|>=|<=|>|<)\s*(?P\d+)") + def cond_repl(m): + modes = [int(x.strip()) for x in m.group("modes").split(",")] + rhs = int(m.group("rhs")) + op = m.group("op") + s = sum(counts[i] if i < len(counts) else 0 for i in modes) + val = { + "==": s == rhs, + ">=": s >= rhs, + "<=": s <= rhs, + ">": s > rhs, + "<": s < rhs, + }[op] + return f"({str(val)})" + prev = None + while prev != e: + prev = e + e = cond_pat.sub(cond_repl, e) + e = re.sub(r"!", " not ", e) + return [1] if bool(eval(e, {"__builtins__": {}}, {})) else [0] + +@pytest.mark.parametrize("seed", [0, 1, 2, 3, 4]) +def test_randomized(seed): + random.seed(seed) + for _ in range(25): + max_mode = random.randint(2, 6) + counts = [random.randint(0, 3) for _ in range(max_mode+1)] + expr = random_expression(max_mode) + assert run(expr, counts) == eval_reference(expr, counts) diff --git a/test/test_zw.py b/test/test_zw.py index d4c9f74b..63410cc0 100644 --- a/test/test_zw.py +++ b/test/test_zw.py @@ -1,9 +1,8 @@ import math from optyx.core.zw import * -from optyx._utils import calculate_num_creations_selections from optyx.core.diagram import mode, DualRail, EmbeddingTensor, Swap, Diagram, Mode, Spider, Scalar -from optyx._utils import compare_arrays_of_different_sizes +from optyx.utils.utils import compare_arrays_of_different_sizes, calculate_num_creations_selections import optyx.core.zx as zx from optyx import photonic import itertools @@ -481,4 +480,4 @@ def test_DR_beamsplitter(): def test_DR_phase_shift(phase): left = DualRail() >> Mode(1) @ photonic.Phase(phase).get_kraus() right = zx.Z(1, 1, phase=phase) >> DualRail() - assert np.allclose(right.to_tensor().eval().array, left.to_tensor().eval().array) + assert np.allclose(right.to_tensor().eval().array, left.to_tensor().eval().array) \ No newline at end of file diff --git a/test/test_zw_2_circuit.py b/test/test_zw_2_circuit.py index 34b294a9..bde3b60d 100644 --- a/test/test_zw_2_circuit.py +++ b/test/test_zw_2_circuit.py @@ -1,6 +1,6 @@ import optyx.core.zw as zw from optyx import photonic, classical -from optyx._utils import tensor_2_amplitudes, calculate_num_creations_selections +from optyx.utils.utils import tensor_2_amplitudes, calculate_num_creations_selections import itertools import pytest import perceval as pcvl diff --git a/test/test_zw_truncated_arrays.py b/test/test_zw_truncated_arrays.py index fdd880fd..3e3f24bc 100644 --- a/test/test_zw_truncated_arrays.py +++ b/test/test_zw_truncated_arrays.py @@ -2,6 +2,8 @@ from optyx.core.diagram import mode, Swap import numpy as np import pytest +from optyx.photonic import ansatz, MZI, TBS +from optyx.utils.utils import matrix_to_zw @pytest.mark.skip(reason="Helper function for testing") def kron_truncation_swap(input_dims: list[int]) -> np.ndarray[complex]: @@ -168,3 +170,38 @@ def kron_truncation_Z(diagram, input_dims: list[int]) -> np.ndarray[complex]: else: result_matrix += np.outer(vec_out, vec_in) * diagram.amplitudes[i] return result_matrix + +@pytest.mark.skip(reason="Helper function for testing") +def chip_mzi(w, l): + ansatz_ = ansatz(w, l) + symbs = list(ansatz_.free_symbols) + s = [(i, np.random.uniform(0, 1)) for i in symbs] + return ansatz_.subs(*s) + +unitaries = [ + chip_mzi(6, 3), + chip_mzi(2, 5), + chip_mzi(4, 4), +] + +@pytest.mark.parametrize("unitary", unitaries) +def test_unitary_array_commutation(unitary): + + array1 = unitary.to_path().array + array2 = matrix_to_zw(array1).to_path().array + assert np.allclose(array1, array2) + + array1 = unitary.dagger().to_path().array + array2 = matrix_to_zw(unitary.to_path().array).dagger().to_path().array + assert np.allclose(array1, array2) + +def test_MZI_TBS_array_commutation(): + unitary = MZI(0.32, -0.2) + assert np.allclose(unitary.array, unitary.to_path().array) + + assert np.allclose(unitary.dagger().array, unitary.dagger().to_path().array) + + unitary = TBS(-0.2) + assert np.allclose(unitary.array, unitary.to_path().array) + + assert np.allclose(unitary.dagger().array, unitary.dagger().to_path().array) \ No newline at end of file From 7f6e322b172e0a51145718e5c41958b3901e58e9 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Thu, 28 Aug 2025 16:52:26 +0100 Subject: [PATCH 02/59] linting --- optyx/classical.py | 2 +- optyx/core/__init__.py | 5 +++-- optyx/core/backends.py | 2 +- optyx/core/channel.py | 5 ++--- optyx/core/control.py | 2 +- optyx/core/diagram.py | 2 +- optyx/core/path.py | 2 +- optyx/core/zw.py | 2 +- optyx/core/zx.py | 2 +- optyx/photonic.py | 8 +++++--- optyx/qubits.py | 2 +- optyx/utils/perceval_conversion.py | 10 ++++------ 12 files changed, 22 insertions(+), 22 deletions(-) diff --git a/optyx/classical.py b/optyx/classical.py index 4dc71f19..0faa558e 100644 --- a/optyx/classical.py +++ b/optyx/classical.py @@ -700,4 +700,4 @@ def Id(n): """ if isinstance(n, channel.Ty): return Diagram.id(n) - raise TypeError(f"Expected a channel.Ty, got {type(n)}") \ No newline at end of file + raise TypeError(f"Expected a channel.Ty, got {type(n)}") diff --git a/optyx/core/__init__.py b/optyx/core/__init__.py index 5951cfd1..7e41228e 100644 --- a/optyx/core/__init__.py +++ b/optyx/core/__init__.py @@ -1,5 +1,6 @@ """ -Core back-end classes of Optyx. These include the graphical +Core back-end classes of Optyx. +These include the graphical languages of ZX, ZW, and Path. .. autosummary:: @@ -14,4 +15,4 @@ zw zx backends -""" \ No newline at end of file +""" diff --git a/optyx/core/backends.py b/optyx/core/backends.py index b68bb195..f677e4b2 100644 --- a/optyx/core/backends.py +++ b/optyx/core/backends.py @@ -568,4 +568,4 @@ def eval( ), output_types=diagram.cod, state_type=StateType.PROB - ) \ No newline at end of file + ) diff --git a/optyx/core/channel.py b/optyx/core/channel.py index aa65b7bd..e839231e 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -485,8 +485,7 @@ def __init__( kraus, dom=None, cod=None, - env=diagram.Ty() - ): + env=diagram.Ty()): assert isinstance(kraus, diagram.Diagram) if dom is None: dom = Ty.from_optyx(kraus.dom) @@ -843,4 +842,4 @@ class Hypergraph(hypergraph.Hypergraph): # pragma: no cover Diagram.spider_factory = Spider Diagram.hypergraph_factory = Hypergraph Diagram.braid_factory = Swap -Diagram.sum_factory = Sum \ No newline at end of file +Diagram.sum_factory = Sum diff --git a/optyx/core/control.py b/optyx/core/control.py index 1216af58..5a078af3 100644 --- a/optyx/core/control.py +++ b/optyx/core/control.py @@ -427,4 +427,4 @@ def dagger(self): return BinaryMatrixBox(self.matrix, not self.is_dagger) def conjugate(self): - return self \ No newline at end of file + return self diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index 2a6775be..eeb55507 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -1020,4 +1020,4 @@ class Hypergraph(hypergraph.Hypergraph): # pragma: no cover Diagram.braid_factory, Diagram.spider_factory = Swap, Spider Diagram.ty_factory = Ty Diagram.sum_factory = Sum -Id = Diagram.id \ No newline at end of file +Id = Diagram.id diff --git a/optyx/core/path.py b/optyx/core/path.py index 22c7e847..2fdb68b0 100644 --- a/optyx/core/path.py +++ b/optyx/core/path.py @@ -544,4 +544,4 @@ def normalise(self) -> Probabilities: array=self.array / self.array.sum(axis=1)[:, None], dom=self.dom, cod=self.cod, - ) \ No newline at end of file + ) diff --git a/optyx/core/zw.py b/optyx/core/zw.py index f85b412f..a54f9862 100644 --- a/optyx/core/zw.py +++ b/optyx/core/zw.py @@ -819,4 +819,4 @@ def Merge(n): def Id(n): return diagram.Diagram.id(n) if \ - isinstance(n, diagram.Ty) else diagram.Diagram.id(diagram.Mode(n)) \ No newline at end of file + isinstance(n, diagram.Ty) else diagram.Diagram.id(diagram.Mode(n)) diff --git a/optyx/core/zx.py b/optyx/core/zx.py index bfa94d42..cbaf3b51 100644 --- a/optyx/core/zx.py +++ b/optyx/core/zx.py @@ -765,4 +765,4 @@ def dagger(self): return Or(n=self.dom.n, is_dagger=not self.is_dagger) def conjugate(self): - return Or(n=self.dom.n, is_dagger=self.is_dagger) \ No newline at end of file + return Or(n=self.dom.n, is_dagger=self.is_dagger) diff --git a/optyx/photonic.py b/optyx/photonic.py index 85e52b2a..d752f428 100644 --- a/optyx/photonic.py +++ b/optyx/photonic.py @@ -680,7 +680,8 @@ def conjugate(self): return TBS(self.theta, self.is_gate_dagger, not self.is_conj) def dagger(self): - return TBS(self.theta, is_gate_dagger=not self.is_gate_dagger, is_conj=self.is_conj) + return TBS(self.theta, is_gate_dagger=not self.is_gate_dagger, + is_conj=self.is_conj) class MZI(AbstractGate): @@ -777,7 +778,8 @@ def grad(self, var): return self._decomp().grad(var) def dagger(self): - return MZI(self.theta, self.phi, is_gate_dagger=not self.is_gate_dagger, is_conj=self.is_conj) + return MZI(self.theta, self.phi, + is_gate_dagger=not self.is_gate_dagger, is_conj=self.is_conj) def conjugate(self): return MZI(self.theta, self.phi, self.is_gate_dagger, not self.is_conj) @@ -1109,4 +1111,4 @@ def fusion_II_function(x): def Id(n): return Diagram.id(n) if \ - isinstance(n, channel.Ty) else Diagram.id(qmode**n) \ No newline at end of file + isinstance(n, channel.Ty) else Diagram.id(qmode**n) diff --git a/optyx/qubits.py b/optyx/qubits.py index 7a34d88a..c2212c82 100644 --- a/optyx/qubits.py +++ b/optyx/qubits.py @@ -727,4 +727,4 @@ def Id(n): Qubit identity wire. """ return Diagram.id(n) if \ - isinstance(n, channel.Ty) else Diagram.id(qubit**n) \ No newline at end of file + isinstance(n, channel.Ty) else Diagram.id(qubit**n) diff --git a/optyx/utils/perceval_conversion.py b/optyx/utils/perceval_conversion.py index baa44225..16cf572e 100644 --- a/optyx/utils/perceval_conversion.py +++ b/optyx/utils/perceval_conversion.py @@ -59,8 +59,7 @@ def _rewire_and_context(*, component, wires, circuit, def _assemble_controlled_box( map_items, *, input_wires, - default_action, - ): + default_action,): """ Build the feed-forward controlled box from (state, action_box) pairs. action_box must already be a ZW diagram (matrix_to_zw applied). @@ -98,7 +97,6 @@ def _feedforward_common(*, component, wires, circuit, """ default_action = _default_action(component) - # numbers and offset n_classical = len(next(iter(map_iter.keys()))) n_action = len(default_action.dom) n_offset = abs(component._offset) @@ -108,11 +106,11 @@ def _feedforward_common(*, component, wires, circuit, # perm_dom_neg = qmode**(n_action + n_offset) @ mode**n_classical # perm_dom_pos = mode**n_classical @ qmode**(n_action + n_offset) # else: - # configurator: the dom is a slice of the current circuit wires + # configurator: the dom is a slice of the current circuit wires perm_dom_neg = circuit.cod[min(wires) - n_offset - - n_action: max(wires) + 1] + n_action: max(wires) + 1] perm_dom_pos = circuit.cod[min(wires): max(wires) + - n_offset + n_action + 1] + n_offset + n_action + 1] input_perm, output_perm, left, right = _rewire_and_context( component=component, wires=wires, circuit=circuit, From fc89a206a72ac325671a3823f97fbdf65814073e Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Thu, 28 Aug 2025 16:54:22 +0100 Subject: [PATCH 03/59] linting --- optyx/photonic.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/optyx/photonic.py b/optyx/photonic.py index d752f428..2f67f199 100644 --- a/optyx/photonic.py +++ b/optyx/photonic.py @@ -779,7 +779,8 @@ def grad(self, var): def dagger(self): return MZI(self.theta, self.phi, - is_gate_dagger=not self.is_gate_dagger, is_conj=self.is_conj) + is_gate_dagger=not self.is_gate_dagger, + is_conj=self.is_conj) def conjugate(self): return MZI(self.theta, self.phi, self.is_gate_dagger, not self.is_conj) @@ -817,10 +818,10 @@ def p(i, j): n_mzi = (width - 1) // 2 if i % 2 else width // 2 left = qmode**(i % 2) right = qmode**(width - (i % 2) - 2 * n_mzi) - l = Diagram.id(qmode**0) + wire = Diagram.id(qmode**0) for j in range(n_mzi): - l @= MZI(*p(i, j)) - d >>= left @ l @ right + wire @= MZI(*p(i, j)) + d >>= left @ wire @ right return d From 357354fd9da300826b24db476013638869a85e70 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Sun, 31 Aug 2025 16:19:46 +0100 Subject: [PATCH 04/59] fix(backend/quimb): sanitise tn dtypes & values before compressed contraction --- optyx/core/backends.py | 9 +++++++++ optyx/utils/utils.py | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/optyx/core/backends.py b/optyx/core/backends.py index f677e4b2..d510dff0 100644 --- a/optyx/core/backends.py +++ b/optyx/core/backends.py @@ -81,6 +81,7 @@ from quimb.tensor import TensorNetwork from optyx.core.channel import Diagram from optyx.core.channel import Ty, mode, bit +from optyx.utils.utils import preprocess_quimb_tensors_safe class StateType(Enum): @@ -396,6 +397,11 @@ def eval( quimb_tn = self._get_quimb_tensor(diagram) tensor_diagram = self._get_discopy_tensor(diagram) + for t in quimb_tn: + dt = t.data.dtype + if dt.kind in {'i', 'u', 'b'}: + t.modify(data=t.data.astype(np.complex128, copy=False)) + if self.hyperoptimiser is None: results = quimb_tn ^ ... else: @@ -417,6 +423,9 @@ def eval( "HyperCompressedOptimizer." ) + if is_approx: + quimb_tn = preprocess_quimb_tensors_safe(quimb_tn) + contract = quimb_tn.contract_compressed if \ is_approx else quimb_tn.contract results = contract( diff --git a/optyx/utils/utils.py b/optyx/utils/utils.py index 14926aa7..29b35d7d 100644 --- a/optyx/utils/utils.py +++ b/optyx/utils/utils.py @@ -323,3 +323,25 @@ class BasisTransition(NamedTuple): """ out: Tuple[int, ...] amp: Number + + +def preprocess_quimb_tensors_safe(tn, epsilon=1e-12, value_limit=1e10): + for t in tn: + data = t.data + + if data.dtype.kind in {'i', 'u'}: + t.modify(data=data.astype('complex128')) + continue + + if data.ndim == 2 and np.linalg.matrix_rank(data) < min(data.shape): + data += np.random.normal(0, epsilon, size=data.shape) + + if np.any(data == 0): + data[data == 0] = epsilon + + if np.max(np.abs(data)) > value_limit: + data = np.clip(data, -value_limit, value_limit) + + t.modify(data=data) + + return tn From 9bc060f726507a522905da3aa6919e116f4d2878 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Tue, 2 Sep 2025 11:28:31 +0100 Subject: [PATCH 05/59] draft auto max dim calculation --- examples/channel_error.ipynb | 0 optyx/core/control.py | 14 +++++++++++- optyx/core/diagram.py | 25 +++++++++++++-------- optyx/core/zw.py | 9 ++++---- optyx/utils/utils.py | 42 ++++++++++++++++++++++++++++++++++-- 5 files changed, 74 insertions(+), 16 deletions(-) create mode 100644 examples/channel_error.ipynb diff --git a/examples/channel_error.ipynb b/examples/channel_error.ipynb new file mode 100644 index 00000000..e69de29b diff --git a/optyx/core/control.py b/optyx/core/control.py index 5a078af3..b5f293f1 100644 --- a/optyx/core/control.py +++ b/optyx/core/control.py @@ -119,7 +119,19 @@ def __init__( self.action_box = action_box self.default_box = default_box self.is_dagger = is_dagger - + # --- Photon-budget contract: max over the two branches. + def _safe_out(b): + f = getattr(b, "output_photons", None) + return f if callable(f) else (lambda s: s) + + f_action = _safe_out(self.action_box) + f_default = _safe_out(self.default_box) + + # Bits carry no photons; total_in is the sum over Mode inputs only. + self.output_photons = lambda total_in: max( + int(f_action(total_in)), + int(f_default(total_in)) + ) def determine_output_dimensions(self, input_dims: List[int]) -> List[int]: action_box_dims = ( diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index eeb55507..9661d203 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -228,7 +228,8 @@ from discopy.quantum.gates import format_number from optyx.utils.utils import ( modify_io_dims_against_max_dim, - BasisTransition + BasisTransition, + total_photons_created ) from typing import List, Tuple, Iterable @@ -312,10 +313,11 @@ def list_to_dim(dims: np.ndarray | list) -> Dim: else: layer_dims = input_dims - if max_dim is not None: - layer_dims, _ = modify_io_dims_against_max_dim( - layer_dims, None, max_dim - ) + max_dim = total_photons_created(self, layer_dims) + 1 + + layer_dims, _ = modify_io_dims_against_max_dim( + layer_dims, None, max_dim + ) if len(self.boxes) == 0 and len(self.offsets) == 0: return tensor.Diagram.id(list_to_dim(layer_dims)) @@ -326,10 +328,14 @@ def list_to_dim(dims: np.ndarray | list) -> Dim: dims_out = box.determine_output_dimensions(dims_in) - if max_dim is not None: - dims_out, _ = modify_io_dims_against_max_dim( - dims_out, None, max_dim - ) + if hasattr(box, "output_photons"): + output_photons = int(max(dims_out, default=0)) + if max_dim < output_photons: + max_dim = output_photons + #if max_dim is not None: + dims_out, _ = modify_io_dims_against_max_dim( + dims_out, None, max_dim + ) left = Dim() if off > 0: @@ -828,6 +834,7 @@ def __init__(self, super().__init__("2R", dom, cod) self.internal_state = internal_state self.is_dagger = is_dagger + self.output_photons = self.determine_output_dimensions def conjugate(self): return self diff --git a/optyx/core/zw.py b/optyx/core/zw.py index a54f9862..42e693e1 100644 --- a/optyx/core/zw.py +++ b/optyx/core/zw.py @@ -291,6 +291,7 @@ def __init__( super().__init__(legs_in, legs_out, diagram.Mode(1)) self.legs_in = legs_in self.legs_out = legs_out + self.output_photons = self.determine_output_dimensions def conjugate(self): return ZBox(self.legs_in, self.legs_out, self.amplitudes.conjugate()) @@ -429,6 +430,7 @@ def __init__(self, name = "Create(1)" if self.photons == (1,) else f"Create({photons})" super().__init__(name, 0, len(self.photons)) + self.output_photons = self.determine_output_dimensions def conjugate(self): return self @@ -532,6 +534,7 @@ def __init__(self, self.photons = photons or (1,) name = "Select(1)" if self.photons == (1,) else f"Select({photons})" super().__init__(name, len(self.photons), 0) + self.output_photons = lambda _: 0 def inflate(self, d): @@ -700,8 +703,7 @@ def __init__(self, is_dagger: bool = False): cod = diagram.Mode(2) if is_dagger else diagram.Mode(1) super().__init__("Multiply", dom, cod) - - self.is_dagger = is_dagger + self.output_photons = self.determine_output_dimensions def truncation_specification( self, @@ -740,10 +742,9 @@ class Divide(ZWBox): def __init__(self, is_dagger: bool = False): dom = diagram.Mode(1) if is_dagger else diagram.Mode(2) cod = diagram.Mode(2) if is_dagger else diagram.Mode(1) - super().__init__("Divide", dom, cod) - self.is_dagger = is_dagger + self.output_photons = self.determine_output_dimensions def truncation_specification( self, diff --git a/optyx/utils/utils.py b/optyx/utils/utils.py index 29b35d7d..0e31f8f8 100644 --- a/optyx/utils/utils.py +++ b/optyx/utils/utils.py @@ -9,10 +9,14 @@ """ import numpy as np -from typing import NamedTuple, Tuple +from typing import ( + NamedTuple, + Tuple, + Optional, + List +) from numbers import Number - def _build_w_layer(n_nonzero_counts, dagger=False): # pylint: disable=import-outside-toplevel from optyx.core import zw @@ -345,3 +349,37 @@ def preprocess_quimb_tensors_safe(tn, epsilon=1e-12, value_limit=1e10): t.modify(data=data) return tn + + +def total_photons_created(diagram, input_dims: Optional[List[int]] = None) -> int: + """ + Scan `diagram` once and return the total number of photons created. + + Counts: + - zw.Create(*photons) -> +sum(photons) + Everything else is ignored for 'creation' (they conserve or consume photons). + + Parameters + ---------- + diagram : optyx.core.diagram.Diagram + The diagram to scan (sequential list of boxes is in `diagram.boxes`). + input_dims : Optional[List[int]] + + Returns + ------- + int + Total number of photons created in the diagram. + """ + created = 0 + + from optyx.core import zw + + if input_dims is None: + input_dims = [] + + for box in diagram.boxes: + if isinstance(box, zw.Create): + created += sum(int(p) for p in box.photons) + continue + + return max(int(created) + int(sum(input_dims, 0)), 3) \ No newline at end of file From 03ad4cc83a9b2796e5f17b3abda1da079d274665 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Tue, 2 Sep 2025 13:13:55 +0100 Subject: [PATCH 06/59] auto max dim finding --- optyx/core/diagram.py | 10 ++++++++-- optyx/utils/utils.py | 35 +++++++++++++++++++++++++++++++++-- test/test_channel.py | 9 ++------- test/test_feed_forward.py | 1 + 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index 9661d203..3c2deaf7 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -229,7 +229,8 @@ from optyx.utils.utils import ( modify_io_dims_against_max_dim, BasisTransition, - total_photons_created + total_photons_created, + max_postselection ) from typing import List, Tuple, Iterable @@ -314,6 +315,10 @@ def list_to_dim(dims: np.ndarray | list) -> Dim: layer_dims = input_dims max_dim = total_photons_created(self, layer_dims) + 1 + max_post_selection = max_postselection(self, layer_dims) + 1 + + if max_dim < max_post_selection: + max_dim = max_post_selection layer_dims, _ = modify_io_dims_against_max_dim( layer_dims, None, max_dim @@ -331,7 +336,8 @@ def list_to_dim(dims: np.ndarray | list) -> Dim: if hasattr(box, "output_photons"): output_photons = int(max(dims_out, default=0)) if max_dim < output_photons: - max_dim = output_photons + max_dim = output_photons + 1 + #if max_dim is not None: dims_out, _ = modify_io_dims_against_max_dim( dims_out, None, max_dim diff --git a/optyx/utils/utils.py b/optyx/utils/utils.py index 0e31f8f8..2f3ccfd0 100644 --- a/optyx/utils/utils.py +++ b/optyx/utils/utils.py @@ -350,7 +350,6 @@ def preprocess_quimb_tensors_safe(tn, epsilon=1e-12, value_limit=1e10): return tn - def total_photons_created(diagram, input_dims: Optional[List[int]] = None) -> int: """ Scan `diagram` once and return the total number of photons created. @@ -382,4 +381,36 @@ def total_photons_created(diagram, input_dims: Optional[List[int]] = None) -> in created += sum(int(p) for p in box.photons) continue - return max(int(created) + int(sum(input_dims, 0)), 3) \ No newline at end of file + return max(int(created) + int(sum(input_dims, 0)), 3) + +def max_postselection(diagram, input_dims: Optional[List[int]] = None) -> int: + """ + Scan `diagram` once and return the maximum post-selection dimension. + + Counts: + - zw.Create(*photons) -> +sum(photons) + Everything else is ignored for 'selection' + Parameters + ---------- + diagram : optyx.core.diagram.Diagram + The diagram to scan (sequential list of boxes is in `diagram.boxes`). + input_dims : Optional[List[int]] + + Returns + ------- + int + Maximum post-selection dimension in the diagram. + """ + max_dim = 0 + + from optyx.core import zw + + if input_dims is None: + input_dims = [] + + for box in diagram.boxes: + if isinstance(box, zw.Select): + max_dim = max(max_dim, max(int(p) for p in box.photons)) + continue + + return max(int(max_dim) + int(sum(input_dims, 0)), 3) \ No newline at end of file diff --git a/test/test_channel.py b/test/test_channel.py index 1ef7750a..9d07de6c 100644 --- a/test/test_channel.py +++ b/test/test_channel.py @@ -57,10 +57,5 @@ def test_from_bosonic_op(): terms.append(term) hamiltonian = Diagram.sum_factory(terms) - sum_1 = np.sum([(term.double().to_tensor(input_dims = [3,3,3,3], max_dim=3).to_quimb()^...).data for term in terms]) - - terms_2 = hamiltonian.double().terms - - sum = np.sum([(term_2.to_tensor(input_dims = [3,3,3,3], max_dim=3).to_quimb()^...).data for term_2 in terms_2]) - - assert np.allclose(sum, sum_1) \ No newline at end of file + sum_1 = hamiltonian.eval() + assert np.allclose(sum_1.array, 0.0) \ No newline at end of file diff --git a/test/test_feed_forward.py b/test/test_feed_forward.py index 84893b50..f4b98423 100644 --- a/test/test_feed_forward.py +++ b/test/test_feed_forward.py @@ -279,6 +279,7 @@ def test_dagger_controlled_phase_shift_2(self, diagram): @pytest.mark.parametrize("f", REAL_FUNCS) @pytest.mark.parametrize("x", xs) def test_controlled_phase_shift_numeric(self, f, x): + print(f"Testing ControlledPhaseShift with x: {x}") """ For each real-valued function f and input x, build a circuit with ControlledPhaseShift, compare to a ZBox with the matching phase exponent. From c786826bfe6c491304485fa5cc3d96a1fca7346c Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Thu, 4 Sep 2025 12:02:07 +0100 Subject: [PATCH 07/59] flake8 --- optyx/core/control.py | 15 ++------------- optyx/core/diagram.py | 13 +++++++------ optyx/core/zw.py | 10 +++++----- optyx/utils/utils.py | 27 ++++++++++++++++++++------- 4 files changed, 34 insertions(+), 31 deletions(-) diff --git a/optyx/core/control.py b/optyx/core/control.py index b5f293f1..f691b6c8 100644 --- a/optyx/core/control.py +++ b/optyx/core/control.py @@ -119,19 +119,8 @@ def __init__( self.action_box = action_box self.default_box = default_box self.is_dagger = is_dagger - # --- Photon-budget contract: max over the two branches. - def _safe_out(b): - f = getattr(b, "output_photons", None) - return f if callable(f) else (lambda s: s) - - f_action = _safe_out(self.action_box) - f_default = _safe_out(self.default_box) - - # Bits carry no photons; total_in is the sum over Mode inputs only. - self.output_photons = lambda total_in: max( - int(f_action(total_in)), - int(f_default(total_in)) - ) + self.photon_sum_preserving = False + def determine_output_dimensions(self, input_dims: List[int]) -> List[int]: action_box_dims = ( diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index 3c2deaf7..29ff2f43 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -333,12 +333,12 @@ def list_to_dim(dims: np.ndarray | list) -> Dim: dims_out = box.determine_output_dimensions(dims_in) - if hasattr(box, "output_photons"): - output_photons = int(max(dims_out, default=0)) - if max_dim < output_photons: - max_dim = output_photons + 1 + if hasattr(box, "photon_sum_preserving"): + if not box.photon_sum_preserving: + output_photons = int(max(dims_out, default=0)) + if max_dim < output_photons: + max_dim = output_photons + 1 - #if max_dim is not None: dims_out, _ = modify_io_dims_against_max_dim( dims_out, None, max_dim ) @@ -445,6 +445,7 @@ class Box(frobenius.Box, Diagram): def __init__(self, name, dom, cod, array=None, **params): self._array = array + self.photon_sum_preserving = True super().__init__(name, dom, cod, **params) @classmethod @@ -840,7 +841,7 @@ def __init__(self, super().__init__("2R", dom, cod) self.internal_state = internal_state self.is_dagger = is_dagger - self.output_photons = self.determine_output_dimensions + self.photon_sum_preserving = False def conjugate(self): return self diff --git a/optyx/core/zw.py b/optyx/core/zw.py index 42e693e1..9d9195bc 100644 --- a/optyx/core/zw.py +++ b/optyx/core/zw.py @@ -291,7 +291,7 @@ def __init__( super().__init__(legs_in, legs_out, diagram.Mode(1)) self.legs_in = legs_in self.legs_out = legs_out - self.output_photons = self.determine_output_dimensions + self.photon_sum_preserving = False def conjugate(self): return ZBox(self.legs_in, self.legs_out, self.amplitudes.conjugate()) @@ -430,7 +430,7 @@ def __init__(self, name = "Create(1)" if self.photons == (1,) else f"Create({photons})" super().__init__(name, 0, len(self.photons)) - self.output_photons = self.determine_output_dimensions + self.photon_sum_preserving = False def conjugate(self): return self @@ -534,7 +534,7 @@ def __init__(self, self.photons = photons or (1,) name = "Select(1)" if self.photons == (1,) else f"Select({photons})" super().__init__(name, len(self.photons), 0) - self.output_photons = lambda _: 0 + self.photon_sum_preserving = False def inflate(self, d): @@ -703,7 +703,7 @@ def __init__(self, is_dagger: bool = False): cod = diagram.Mode(2) if is_dagger else diagram.Mode(1) super().__init__("Multiply", dom, cod) - self.output_photons = self.determine_output_dimensions + self.photon_sum_preserving = False def truncation_specification( self, @@ -744,7 +744,7 @@ def __init__(self, is_dagger: bool = False): cod = diagram.Mode(2) if is_dagger else diagram.Mode(1) super().__init__("Divide", dom, cod) self.is_dagger = is_dagger - self.output_photons = self.determine_output_dimensions + self.photon_sum_preserving = False def truncation_specification( self, diff --git a/optyx/utils/utils.py b/optyx/utils/utils.py index 2f3ccfd0..f3b9f292 100644 --- a/optyx/utils/utils.py +++ b/optyx/utils/utils.py @@ -17,6 +17,7 @@ ) from numbers import Number + def _build_w_layer(n_nonzero_counts, dagger=False): # pylint: disable=import-outside-toplevel from optyx.core import zw @@ -350,18 +351,24 @@ def preprocess_quimb_tensors_safe(tn, epsilon=1e-12, value_limit=1e10): return tn -def total_photons_created(diagram, input_dims: Optional[List[int]] = None) -> int: + +def total_photons_created( + diagram, + input_dims: Optional[List[int]] = None +) -> int: """ Scan `diagram` once and return the total number of photons created. Counts: - zw.Create(*photons) -> +sum(photons) - Everything else is ignored for 'creation' (they conserve or consume photons). + Everything else is ignored for 'creation' + (they conserve or consume photons). Parameters ---------- diagram : optyx.core.diagram.Diagram - The diagram to scan (sequential list of boxes is in `diagram.boxes`). + The diagram to scan (sequential list of + boxes is in `diagram.boxes`). input_dims : Optional[List[int]] Returns @@ -383,9 +390,14 @@ def total_photons_created(diagram, input_dims: Optional[List[int]] = None) -> in return max(int(created) + int(sum(input_dims, 0)), 3) -def max_postselection(diagram, input_dims: Optional[List[int]] = None) -> int: + +def max_postselection( + diagram, + input_dims: Optional[List[int]] = None +) -> int: """ - Scan `diagram` once and return the maximum post-selection dimension. + Scan `diagram` once and return the + maximum post-selection dimension. Counts: - zw.Create(*photons) -> +sum(photons) @@ -393,7 +405,8 @@ def max_postselection(diagram, input_dims: Optional[List[int]] = None) -> int: Parameters ---------- diagram : optyx.core.diagram.Diagram - The diagram to scan (sequential list of boxes is in `diagram.boxes`). + The diagram to scan (sequential list + of boxes is in `diagram.boxes`). input_dims : Optional[List[int]] Returns @@ -413,4 +426,4 @@ def max_postselection(diagram, input_dims: Optional[List[int]] = None) -> int: max_dim = max(max_dim, max(int(p) for p in box.photons)) continue - return max(int(max_dim) + int(sum(input_dims, 0)), 3) \ No newline at end of file + return max(int(max_dim) + int(sum(input_dims, 0)), 3) From ad429d8dbae42d3e7fcdcee6a3ec5fd119138562 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Thu, 4 Sep 2025 12:15:35 +0100 Subject: [PATCH 08/59] removing max_dim arg from tests --- optyx/core/diagram.py | 6 ++-- optyx/photonic.py | 2 +- test/test_distinguishability.py | 10 +++--- test/test_zw.py | 54 ++++++++++++++------------------ test/test_zw_truncated_arrays.py | 2 +- 5 files changed, 33 insertions(+), 41 deletions(-) diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index 29ff2f43..678b4976 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -299,7 +299,7 @@ def to_path(self, dtype: type = complex): # pylint: disable=too-many-locals def to_tensor( - self, input_dims: list = None, max_dim: int = None + self, input_dims: list = None ) -> tensor.Diagram: """Returns a :class:`tensor.Diagram` for evaluation""" # pylint: disable=import-outside-toplevel @@ -697,9 +697,9 @@ def eval(self, n_photons=0, permanent=None, dtype=complex): for term in self.terms ) - def to_tensor(self, input_dims=None, max_dim=None): + def to_tensor(self, input_dims=None): - terms = [t.to_tensor(input_dims, max_dim) for t in self] + terms = [t.to_tensor(input_dims) for t in self] cods = [list(t.cod.inside) for t in terms] # figure out the max dims for each idx and set it for all the terms diff --git a/optyx/photonic.py b/optyx/photonic.py index 2f67f199..2b6de50c 100644 --- a/optyx/photonic.py +++ b/optyx/photonic.py @@ -224,7 +224,7 @@ >>> channel_HOM = channel_HOM.inflate(len(internal_state_1)) >>> result = ( -... channel_HOM.double().to_tensor(max_dim=3).to_quimb()^... +... channel_HOM.double().to_tensor().to_quimb()^... ... ).data Let's get the probabilities of the outcomes: diff --git a/test/test_distinguishability.py b/test/test_distinguishability.py index 19c4d6ce..5be34f69 100644 --- a/test/test_distinguishability.py +++ b/test/test_distinguishability.py @@ -60,7 +60,7 @@ def test_beamsplitter_non_distinguishable(internal_state: np.ndarray) -> None: probs = ( channel_bs.double() - .to_tensor(max_dim=3) + .to_tensor() .eval() .array ) @@ -81,7 +81,7 @@ def test_beamsplitter_distinguishable(state1: np.ndarray, state2: np.ndarray) -> probs = ( channel_bs.double() - .to_tensor(max_dim=3) + .to_tensor() .eval() .array ) @@ -104,7 +104,7 @@ def test_dualrail_identity(qubit_state, internal_state) -> None: dr_drdagger = ( encoded >> DualRail(internal_state=internal_state).inflate(len(internal_state)).dagger() - ).to_tensor(max_dim=2).eval().array + ).to_tensor().eval().array expected = qubit_state.to_tensor().eval().array assert np.allclose(dr_drdagger, expected) @@ -143,8 +143,8 @@ def test_photon_threshold_detector(): d_1 = Create(1, internal_states=([1, 0])) >> PhotonThresholdDetector() d_2 = X(1, 0, 0.5) @ Scalar(0.5**0.5) - arr_1 = d_1.inflate(2).to_tensor(max_dim=3).eval().array - arr_2 = d_2.to_tensor(max_dim=3).eval().array + arr_1 = d_1.inflate(2).to_tensor().eval().array + arr_2 = d_2.to_tensor().eval().array assert np.allclose(arr_1, arr_2) diff --git a/test/test_zw.py b/test/test_zw.py index 63410cc0..b4160298 100644 --- a/test/test_zw.py +++ b/test/test_zw.py @@ -15,7 +15,6 @@ legs_a_out = range(1, 3) legs_b_out = range(1, 3) legs_between = range(1, 3) -max_dim = [None, 2, 4, 6] # a set of arbitrary functions of i fs = [ @@ -27,13 +26,13 @@ # get all combinations of legs etc fs_legs_combinations = list( itertools.product( - fs, legs_a_in, legs_b_in, legs_a_out, legs_b_out, legs_between, max_dim + fs, legs_a_in, legs_b_in, legs_a_out, legs_b_out, legs_between ) ) @pytest.mark.parametrize( - "fs, legs_a_in, legs_b_in, legs_a_out, legs_b_out, legs_between, max_dim", + "fs, legs_a_in, legs_b_in, legs_a_out, legs_b_out, legs_between", fs_legs_combinations, ) def test_spider_fusion( @@ -42,8 +41,7 @@ def test_spider_fusion( legs_b_in: int, legs_a_out: int, legs_b_out: int, - legs_between: int, - max_dim: int + legs_between: int ): S1_infty_l = ZBox(legs_a_in, legs_a_out + legs_between, fs) @ Id(legs_b_in) @@ -57,8 +55,8 @@ def test_spider_fusion( S1_infty_r = ZBox(legs_a_in + legs_b_in, legs_a_out + legs_b_out, fn_mult) assert compare_arrays_of_different_sizes( - S1_infty_l.to_tensor(max_dim = max_dim).eval().array, - S1_infty_r.to_tensor(max_dim = max_dim).eval().array, + S1_infty_l.to_tensor().eval().array, + S1_infty_r.to_tensor().eval().array, ) @@ -183,16 +181,15 @@ def test_Id_dagger_Id(k: int): ) -@pytest.mark.parametrize("max_dim", [None, 3, 4, 6]) -def test_bBa(max_dim): +def test_bBa(): bBa_l = ( W(2) @ W(2) >> Id(1) @ Swap(mode, mode) @ Id(1) >> W(2).dagger() @ W(2).dagger() ) bBa_r = W(2).dagger() >> W(2) assert compare_arrays_of_different_sizes( - bBa_l.to_tensor(max_dim=max_dim).eval().array, - bBa_r.to_tensor(max_dim=max_dim).eval().array, + bBa_l.to_tensor().eval().array, + bBa_r.to_tensor().eval().array, ) @@ -206,8 +203,7 @@ def test_bId(): ) -@pytest.mark.parametrize("max_dim", [None, 2, 4, 6]) -def test_bZBA(max_dim): +def test_bZBA(): from math import factorial N = [float(np.sqrt(factorial(i))) for i in range(5)] @@ -222,12 +218,11 @@ def test_bZBA(max_dim): bZBA_r = W(2).dagger() >> ZBox(1, 2, lambda i: 1) assert compare_arrays_of_different_sizes( - bZBA_l.to_tensor(max_dim=max_dim).eval().array, - bZBA_r.to_tensor(max_dim=max_dim).eval().array, + bZBA_l.to_tensor().eval().array, + bZBA_r.to_tensor().eval().array, ) -@pytest.mark.parametrize("max_dim", [None, 2, 4, 6]) -def test_bZBA_optyx_Spider(max_dim): +def test_bZBA_optyx_Spider(): from math import factorial N = [float(np.sqrt(factorial(i))) for i in range(5)] @@ -243,8 +238,8 @@ def test_bZBA_optyx_Spider(max_dim): bZBA_r = W(2).dagger() >> Spider(1, 2, Mode(1)) assert compare_arrays_of_different_sizes( - bZBA_l.to_tensor(max_dim=max_dim).eval().array, - bZBA_r.to_tensor(max_dim=max_dim).eval().array, + bZBA_l.to_tensor().eval().array, + bZBA_r.to_tensor().eval().array, ) def test_K0_infty(): @@ -355,8 +350,7 @@ def test_calculate_num_creations_selections(): ) == calculate_num_creations_selections(d3) -@pytest.mark.parametrize("max_dim", [None, 2, 4, 6]) -def test_lemma_B8(max_dim): +def test_lemma_B8(): lemma_B8_l = ( Create(1) >> ZBox(1, 2, [1, 1]) @@ -367,13 +361,12 @@ def test_lemma_B8(max_dim): lemma_B8_r = Create(1) >> W(2) >> ZBox(1, 2, [1, 1]) @ ZBox(1, 0, [1, 1]) assert compare_arrays_of_different_sizes( - lemma_B8_l.to_tensor(max_dim=max_dim).eval().array, - lemma_B8_r.to_tensor(max_dim=max_dim).eval().array, + lemma_B8_l.to_tensor().eval().array, + lemma_B8_r.to_tensor().eval().array, ) -@pytest.mark.parametrize("max_dim", [None, 2, 4, 6]) -def test_lemma_B7(max_dim): +def test_lemma_B7(): lemma_B7_l = Id(1) @ W(2).dagger() >> ZBox(2, 0, lambda i: 1) lemma_B7_r = ( @@ -384,13 +377,12 @@ def test_lemma_B7(max_dim): ) assert compare_arrays_of_different_sizes( - lemma_B7_l.to_tensor(max_dim=max_dim).eval().array, - lemma_B7_r.to_tensor(max_dim=max_dim).eval().array, + lemma_B7_l.to_tensor().eval().array, + lemma_B7_r.to_tensor().eval().array, ) -@pytest.mark.parametrize("max_dim", [None, 3, 4, 6]) -def test_prop_54(max_dim): +def test_prop_54(): prop_54_l = ( Create(1) @ Id(1) >> ZBox(1, 2, lambda i: 1) @ Id(1) @@ -409,8 +401,8 @@ def test_prop_54(max_dim): ) assert compare_arrays_of_different_sizes( - prop_54_l.to_tensor(max_dim=max_dim).eval().array, - prop_54_r.to_tensor(max_dim=max_dim).eval().array, + prop_54_l.to_tensor().eval().array, + prop_54_r.to_tensor().eval().array, ) diff --git a/test/test_zw_truncated_arrays.py b/test/test_zw_truncated_arrays.py index 3e3f24bc..e13fd342 100644 --- a/test/test_zw_truncated_arrays.py +++ b/test/test_zw_truncated_arrays.py @@ -3,7 +3,7 @@ import numpy as np import pytest from optyx.photonic import ansatz, MZI, TBS -from optyx.utils.utils import matrix_to_zw +from optyx.utils.utils import matrix_to_zw, filter_occupation_numbers @pytest.mark.skip(reason="Helper function for testing") def kron_truncation_swap(input_dims: list[int]) -> np.ndarray[complex]: From 5da35f7af2d8bf338f205f0f74ec0daef618fdb2 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Wed, 10 Sep 2025 19:35:59 +0100 Subject: [PATCH 09/59] scanning diagrams --- optyx/core/diagram.py | 79 ++++++++++++--------- optyx/core/zw.py | 10 +++ optyx/core/zx.py | 2 +- optyx/utils/utils.py | 156 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 213 insertions(+), 34 deletions(-) diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index 678b4976..c6011288 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -229,8 +229,8 @@ from optyx.utils.utils import ( modify_io_dims_against_max_dim, BasisTransition, - total_photons_created, - max_postselection + calculate_right_offset, + get_max_dim_for_box ) from typing import List, Tuple, Iterable @@ -302,69 +302,81 @@ def to_tensor( self, input_dims: list = None ) -> tensor.Diagram: """Returns a :class:`tensor.Diagram` for evaluation""" - # pylint: disable=import-outside-toplevel from optyx.core import zw + prev_layers: List[Tuple[int, Box]] = [] + + # pylint: disable=import-outside-toplevel def list_to_dim(dims: np.ndarray | list) -> Dim: """Converts a list of dimensions to a Dim object""" return Dim(*[int(i) for i in dims]) + number_of_input_layer_wires = len(self.dom) + if input_dims is None: layer_dims = [2 for _ in range(len(self.dom))] else: + assert len(self.dom) == len(input_dims), ( + f"Input dims length {len(input_dims)} does not match number of input wires {len(self.dom)}" + ) layer_dims = input_dims - max_dim = total_photons_created(self, layer_dims) + 1 - max_post_selection = max_postselection(self, layer_dims) + 1 - - if max_dim < max_post_selection: - max_dim = max_post_selection - - layer_dims, _ = modify_io_dims_against_max_dim( - layer_dims, None, max_dim - ) - if len(self.boxes) == 0 and len(self.offsets) == 0: return tensor.Diagram.id(list_to_dim(layer_dims)) - right_dim = len(self.dom) - for i, (box, off) in enumerate(zip(self.boxes, self.offsets)): - dims_in = layer_dims[off:off + len(box.dom)] - - dims_out = box.determine_output_dimensions(dims_in) + for i, (box, left_offset) in enumerate(zip(self.boxes, self.offsets)): + right_offset = calculate_right_offset( + number_of_input_layer_wires, left_offset, len(box.dom) + ) - if hasattr(box, "photon_sum_preserving"): - if not box.photon_sum_preserving: - output_photons = int(max(dims_out, default=0)) - if max_dim < output_photons: - max_dim = output_photons + 1 + max_dim = get_max_dim_for_box( + left_offset, + box, + right_offset, + layer_dims, + prev_layers + ) + dims_in = layer_dims[left_offset:left_offset + len(box.dom)] dims_out, _ = modify_io_dims_against_max_dim( - dims_out, None, max_dim + box.determine_output_dimensions(dims_in), + None, + max_dim ) + if isinstance(box, zw.LO_ELEMENTS): + prev_layers.append((left_offset, box)) + else: + d = Id(mode**(len(dims_in))) + if len(dims_in) > 0: + d >>= zw.Select(*dims_in) + if len(dims_out) > 0: + d >>= zw.Create(*dims_out) + prev_layers.append( + (left_offset, d) + ) left = Dim() - if off > 0: - left = list_to_dim(layer_dims[0:off]) + if left_offset > 0: + left = list_to_dim(layer_dims[0:left_offset]) right = Dim() - if off + len(box.dom) < right_dim: + if left_offset + len(box.dom) < number_of_input_layer_wires: right = list_to_dim( - layer_dims[off + len(box.dom): right_dim] + layer_dims[left_offset + len(box.dom): number_of_input_layer_wires] ) - cod_right_dim = right_dim - len(box.dom) + len(box.cod) + number_of_input_layer_wires += -len(box.dom) + len(box.cod) cod_layer_dims = ( - layer_dims[0:off] + layer_dims[0:left_offset] + dims_out - + layer_dims[off + len(box.dom):] + + layer_dims[left_offset + len(box.dom):] ) - diagram_ = left @ box.truncation(dims_in, dims_out) @ right + if i == 0: diagram = diagram_ else: diagram = diagram >> diagram_ - right_dim = cod_right_dim + layer_dims = cod_layer_dims zboxes = tensor.Id(Dim(1)) @@ -377,6 +389,7 @@ def list_to_dim(dims: np.ndarray | list) -> Dim: diagram >>= zboxes return diagram + @classmethod def from_bosonic_operator(cls, n_modes, operators, scalar=1): """Create a :class:`zw` diagram from a bosonic operator.""" diff --git a/optyx/core/zw.py b/optyx/core/zw.py index 9d9195bc..d23b95d8 100644 --- a/optyx/core/zw.py +++ b/optyx/core/zw.py @@ -821,3 +821,13 @@ def Merge(n): def Id(n): return diagram.Diagram.id(n) if \ isinstance(n, diagram.Ty) else diagram.Diagram.id(diagram.Mode(n)) + + +LO_ELEMENTS = ( + Create, + W, + Select, + Add, + Endo, + diagram.Swap +) \ No newline at end of file diff --git a/optyx/core/zx.py b/optyx/core/zx.py index cbaf3b51..8a441dc1 100644 --- a/optyx/core/zx.py +++ b/optyx/core/zx.py @@ -70,7 +70,7 @@ >>> assert np.allclose(graph_path.to_tensor().eval().array, \\ ... ((graph >> dual_rail(4)).to_tensor() >> \\ -... (tensor.Id(Dim(*[2]*7)) @ embedding_tensor(1, 5))).eval().array) +... (tensor.Id(Dim(*[2]*7)) @ embedding_tensor(1, 4))).eval().array) As shown in the example above, we need to decompose a ZX diagram into more elementary spiders before mapping it to a path diagram. diff --git a/optyx/utils/utils.py b/optyx/utils/utils.py index f3b9f292..b25e70fc 100644 --- a/optyx/utils/utils.py +++ b/optyx/utils/utils.py @@ -427,3 +427,159 @@ def max_postselection( continue return max(int(max_dim) + int(sum(input_dims, 0)), 3) + + +def update_connections( + wires_in_light_cone: List[bool], + previous_left_offset: int, + previous_box, + previous_right_offset: int, +) -> List[bool]: + """ + Replace the previous box's COD segment in the light-cone by a DOM-length + segment that is either all True (if connected) or all False. + This pulls the cone one layer backward. + """ + connected = is_previous_box_connected_to_current_box( + wires_in_light_cone, + previous_left_offset, + len(previous_box.cod), + previous_right_offset, + ) + + start = previous_left_offset + end = len(wires_in_light_cone) - previous_right_offset + + # replace cod slice with a dom-length slice of the same boolean + return ( + wires_in_light_cone[:start] + + [connected] * len(previous_box.dom) + + wires_in_light_cone[end:] + ) + +def calculate_right_offset(total_wires: int, left_offset: int, span_len: int) -> int: + """Right offset = number of wires to the right of a span.""" + return total_wires - span_len - left_offset + +def is_previous_box_connected_to_current_box( + wires_in_light_cone: List[bool], + previous_left_offset: int, + previous_box_cod_len: int, + previous_right_offset: int, +) -> bool: + """ + Do the current light-cone wires intersect the COD of the previous box? + """ + mask = ( + [False] * previous_left_offset + + [True] * previous_box_cod_len + + [False] * previous_right_offset + ) + # lengths should match by construction + assert len(mask) == len(wires_in_light_cone), ( + f"Mask/wires length mismatch: {len(mask)} != {len(wires_in_light_cone)}" + ) + + return any(w and m for w, m in zip(wires_in_light_cone, mask)) + +def get_previous_box_cod_index_in_light_cone( + wires_in_light_cone: List[bool], + previous_left_offset: int, + previous_box_cod_len: int, + previous_right_offset: int, +) -> List[int]: + """ + Get the indices of the COD of the previous box that are in the current light-cone. + """ + mask = ( + [False] * previous_left_offset + + [True] * previous_box_cod_len + + [False] * previous_right_offset + ) + # lengths should match by construction + assert len(mask) == len(wires_in_light_cone), ( + f"Mask/wires length mismatch: {len(mask)} != {len(wires_in_light_cone)}" + ) + + return [ + i - previous_left_offset for i, (w, m) in enumerate(zip(wires_in_light_cone, mask)) + if w and m + ] + + +def get_max_dim_for_box( + left_offset: int, + box, + right_offset: int, + input_dims: List[int], + prev_layers, +): + from optyx.core.diagram import Swap + from optyx.core.zw import Create, Endo + + # Boxes with no inputs (or a pure Swap) don't constrain the bound here. + if len(box.dom) == 0 or isinstance(box, (Swap, Endo)): + return 1e20 + + dim_for_box = 0 + + # Light-cone at the current layer inputs + wires_in_light_cone: List[bool] = ( + [False] * left_offset + + [True] * len(box.dom) + + [False] * right_offset + ) + + # Walk previous layers from nearest to farthest + for previous_left_offset, previous_box in prev_layers[::-1]: + total = len(wires_in_light_cone) + cod_len = len(previous_box.cod) + + # Clamp the left offset so the (left, cod_len) span fits this frame. + # This guarantees previous_right_offset >= 0 and len(mask) == total. + max_left = max(0, total - cod_len) + adj_left = previous_left_offset + if adj_left < 0: + adj_left = 0 + elif adj_left > max_left: + adj_left = max_left + + previous_right_offset = calculate_right_offset(total, adj_left, cod_len) + + # If connected, count created photons that lie on LC wires. + if is_previous_box_connected_to_current_box( + wires_in_light_cone, + adj_left, + cod_len, + previous_right_offset, + ): + if isinstance(previous_box, Create): + idxs = get_previous_box_cod_index_in_light_cone( + wires_in_light_cone, + adj_left, + cod_len, + previous_right_offset, + ) + if idxs: + dim_for_box += sum(previous_box.photons[i] for i in idxs) + + # Pull the LC back through this box (use the same clamped offsets) + if isinstance(previous_box, Swap): + # Swaps always connect all their wires + wires_in_light_cone = ( + wires_in_light_cone[:adj_left] + + [wires_in_light_cone[adj_left + 1]] + + [wires_in_light_cone[adj_left]] + + wires_in_light_cone[adj_left + 2:] + ) + else: + wires_in_light_cone = update_connections( + wires_in_light_cone, + adj_left, + previous_box, + previous_right_offset, + ) + + # Baseline contribution from current inputs still in the LC (+1 safety) + dim_for_box += sum(2 * dim for wire, dim in zip(wires_in_light_cone, input_dims) if wire) + 1 + return max(dim_for_box, 3) From 4d7dcaf175786adb51b23aaf18b394c361dc8fe4 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Mon, 15 Sep 2025 14:13:34 +0100 Subject: [PATCH 10/59] fixed a bug in dimension scanning algo --- optyx/core/diagram.py | 23 +++++++++++++++++------ optyx/utils/utils.py | 6 ++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index c6011288..ce5bf36c 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -346,14 +346,20 @@ def list_to_dim(dims: np.ndarray | list) -> Dim: if isinstance(box, zw.LO_ELEMENTS): prev_layers.append((left_offset, box)) else: - d = Id(mode**(len(dims_in))) if len(dims_in) > 0: - d >>= zw.Select(*dims_in) + prev_layers.append( + ( + left_offset, + zw.Select(*[int(i) for i in np.array(dims_in)-1]) + ) + ) if len(dims_out) > 0: - d >>= zw.Create(*dims_out) - prev_layers.append( - (left_offset, d) - ) + prev_layers.append( + ( + left_offset, + zw.Create(*[int(i) for i in np.array(dims_out)-1]) + ) + ) left = Dim() if left_offset > 0: @@ -381,6 +387,11 @@ def list_to_dim(dims: np.ndarray | list) -> Dim: zboxes = tensor.Id(Dim(1)) + # print("------------------") + # for d_ in prev_layers: + # d_[1].draw() + # print("------------------") + # pylint: disable=invalid-name for c in diagram.cod: zboxes @= zw.ZBox(1, 1, lambda i: 1).truncation( diff --git a/optyx/utils/utils.py b/optyx/utils/utils.py index b25e70fc..65b23b4d 100644 --- a/optyx/utils/utils.py +++ b/optyx/utils/utils.py @@ -546,6 +546,9 @@ def get_max_dim_for_box( previous_right_offset = calculate_right_offset(total, adj_left, cod_len) + # if isinstance(previous_box, Create): + # print(previous_box.photons) + # If connected, count created photons that lie on LC wires. if is_previous_box_connected_to_current_box( wires_in_light_cone, @@ -562,6 +565,9 @@ def get_max_dim_for_box( ) if idxs: dim_for_box += sum(previous_box.photons[i] for i in idxs) + if sum(previous_box.photons) == 2: + print(idxs) + print(dim_for_box) # Pull the LC back through this box (use the same clamped offsets) if isinstance(previous_box, Swap): From 6842d10053d10da91f62898058f8ed9175891973 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Mon, 15 Sep 2025 14:32:14 +0100 Subject: [PATCH 11/59] remove debugging code --- optyx/core/diagram.py | 5 ----- optyx/utils/utils.py | 6 ------ 2 files changed, 11 deletions(-) diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index ce5bf36c..cb81f403 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -387,11 +387,6 @@ def list_to_dim(dims: np.ndarray | list) -> Dim: zboxes = tensor.Id(Dim(1)) - # print("------------------") - # for d_ in prev_layers: - # d_[1].draw() - # print("------------------") - # pylint: disable=invalid-name for c in diagram.cod: zboxes @= zw.ZBox(1, 1, lambda i: 1).truncation( diff --git a/optyx/utils/utils.py b/optyx/utils/utils.py index 65b23b4d..b25e70fc 100644 --- a/optyx/utils/utils.py +++ b/optyx/utils/utils.py @@ -546,9 +546,6 @@ def get_max_dim_for_box( previous_right_offset = calculate_right_offset(total, adj_left, cod_len) - # if isinstance(previous_box, Create): - # print(previous_box.photons) - # If connected, count created photons that lie on LC wires. if is_previous_box_connected_to_current_box( wires_in_light_cone, @@ -565,9 +562,6 @@ def get_max_dim_for_box( ) if idxs: dim_for_box += sum(previous_box.photons[i] for i in idxs) - if sum(previous_box.photons) == 2: - print(idxs) - print(dim_for_box) # Pull the LC back through this box (use the same clamped offsets) if isinstance(previous_box, Swap): From 410d1e44df6796f69fa80e57895959f3761205e1 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Tue, 16 Sep 2025 16:31:56 +0100 Subject: [PATCH 12/59] further improvements to the scanning algo --- docs/notebooks/graphix_workshop.ipynb | 20977 ++++++++++++++++++++++++ optyx/core/backends.py | 6 +- optyx/core/diagram.py | 4 + optyx/utils/utils.py | 10 +- 4 files changed, 20990 insertions(+), 7 deletions(-) create mode 100644 docs/notebooks/graphix_workshop.ipynb diff --git a/docs/notebooks/graphix_workshop.ipynb b/docs/notebooks/graphix_workshop.ipynb new file mode 100644 index 00000000..e9c850a5 --- /dev/null +++ b/docs/notebooks/graphix_workshop.ipynb @@ -0,0 +1,20977 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "45687b1a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\n- diagrams + syntax (building blocks + types)\\n- qubit teleportation\\n- evaluation + backends\\n- interfaces + extensions\\n- distributed fusion\\n- distinguishability\\n'" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'''\n", + "- diagrams + syntax (building blocks + types)\n", + "- qubit teleportation\n", + "- evaluation + backends\n", + "- interfaces + extensions\n", + "- distributed fusion\n", + "- distinguishability\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "28076593", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nDiagrams + syntax (building blocks + types)\\n- diagrams are syntax\\n- function and normal syntax\\n- types of diagrams (qubit + mode, classical + quantum)\\n'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'''\n", + "Diagrams + syntax (building blocks + types)\n", + "- diagrams are syntax\n", + "- function and normal syntax\n", + "- types of diagrams (qubit + mode, classical + quantum)\n", + "'''" + ] + }, + { + "cell_type": "markdown", + "id": "22456298", + "metadata": {}, + "source": [ + "# Building blocks" + ] + }, + { + "cell_type": "markdown", + "id": "36f0ed2d", + "metadata": {}, + "source": [ + "## Photonic generators and syntax" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "66790776", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.photonic import BBS" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "13dbbb3a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T12:01:49.627815\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "beam_splitter = BBS(0)\n", + "beam_splitter.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5623660f", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.photonic import Create" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "79ab4b08", + "metadata": {}, + "outputs": [], + "source": [ + "hong_ou_mandel = (\n", + " Create(1) @ Create(1) >>\n", + " beam_splitter\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cc4724df", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T12:01:49.762468\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "hong_ou_mandel.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "801f0884", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{(0, 2): 0.5, (1, 1): 4.9303806576313227e-32, (2, 0): 0.5}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# evaluation => the semantics of the diagram\n", + "hong_ou_mandel.eval().prob_dist()" + ] + }, + { + "cell_type": "markdown", + "id": "aa602937", + "metadata": {}, + "source": [ + "## Qubit and classical generators" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8d45cf0f", + "metadata": {}, + "outputs": [], + "source": [ + "# ZX-calculus\n", + "from optyx.qubits import Ket, Z, X, H" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "c4999dab", + "metadata": {}, + "outputs": [], + "source": [ + "diagram = Ket(1) >> X(1, 1, 0.5) >> H() >> Z(1, 1, 0.5)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "83c7f83a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T12:01:50.909420\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "diagram.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "f7f0cf81", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{(0,): (0.7071067811865476+0j),\n", + " (1,): (-0.7071067811865476+2.5978681687064796e-16j)}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "diagram.eval().amplitudes()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "7c1af845", + "metadata": {}, + "outputs": [], + "source": [ + "# measurement\n", + "from optyx.qubits import Measure" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "e43b8f77", + "metadata": {}, + "outputs": [], + "source": [ + "measured_diagram = diagram >> Measure(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "4e217d96", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T12:01:51.044675\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "measured_diagram.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "be987eb1", + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "Cannot get amplitudes from density matrix or probability distribution.", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mTypeError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[16]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mmeasured_diagram\u001b[49m\u001b[43m.\u001b[49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mamplitudes\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/optyx/optyx/core/backends.py:144\u001b[39m, in \u001b[36mEvalResult.amplitudes\u001b[39m\u001b[34m(self, normalise)\u001b[39m\n\u001b[32m 137\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 138\u001b[39m \u001b[33;03mGet the amplitudes from the result tensor.\u001b[39;00m\n\u001b[32m 139\u001b[39m \u001b[33;03mReturns:\u001b[39;00m\n\u001b[32m 140\u001b[39m \u001b[33;03m dict: A dictionary mapping occupation\u001b[39;00m\n\u001b[32m 141\u001b[39m \u001b[33;03mconfigurations to amplitudes.\u001b[39;00m\n\u001b[32m 142\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 143\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.state_type != StateType.AMP:\n\u001b[32m--> \u001b[39m\u001b[32m144\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[32m 145\u001b[39m (\u001b[33m\"\u001b[39m\u001b[33mCannot get amplitudes from density \u001b[39m\u001b[33m\"\u001b[39m +\n\u001b[32m 146\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mmatrix or probability distribution.\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 147\u001b[39m )\n\u001b[32m 148\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m.tensor.dom) != \u001b[32m0\u001b[39m:\n\u001b[32m 149\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 150\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mResult tensor must represent a state with inputs.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 151\u001b[39m )\n", + "\u001b[31mTypeError\u001b[39m: Cannot get amplitudes from density matrix or probability distribution." + ] + } + ], + "source": [ + "measured_diagram.eval().amplitudes()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "f02f6b44", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{(0,): (0.5+0j), (1,): (0.5+0j)}" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "measured_diagram.eval().prob_dist()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "14fff50d", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.classical import AndBit\n", + "\n", + "circuit = (\n", + " measured_diagram @ measured_diagram >>\n", + " AndBit()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "6d735aae", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T12:01:58.617450\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "circuit.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "d77483b2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{(0,): (0.7500000000000001-2.0526832973508108e-48j),\n", + " (1,): (0.25+2.0526832973508108e-48j)}" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "circuit.eval().prob_dist()" + ] + }, + { + "cell_type": "markdown", + "id": "b1f34bd2", + "metadata": {}, + "source": [ + "### Qubit teleportation - function syntax and backends" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "47e64a7d", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.classical import (\n", + " BitControlledGate\n", + ")\n", + "from optyx import qubit, bit" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "2049d62b", + "metadata": {}, + "outputs": [], + "source": [ + "teleportation = (\n", + " Z(1, 2) @ Z(0, 2) >>\n", + " qubit @ X(2, 1) @ qubit >>\n", + " H() @ qubit @ qubit >>\n", + " Measure(1) @ Measure(1) @ qubit >>\n", + " bit @ BitControlledGate(\n", + " X(1, 1, 0.5)\n", + " ) >>\n", + " BitControlledGate(\n", + " Z(1, 1, 0.5)\n", + " )\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "cae3c5a8", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T12:02:00.987603\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "teleportation.foliation().draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "393f7c4a", + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "Result tensor must represent a state with inputs.", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mValueError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[24]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mteleportation\u001b[49m\u001b[43m.\u001b[49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mprob_dist\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/optyx/optyx/core/backends.py:169\u001b[39m, in \u001b[36mEvalResult.prob_dist\u001b[39m\u001b[34m(self, round_digits)\u001b[39m\n\u001b[32m 161\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 162\u001b[39m \u001b[33;03mGet the probability distribution from the result tensor.\u001b[39;00m\n\u001b[32m 163\u001b[39m \n\u001b[32m (...)\u001b[39m\u001b[32m 166\u001b[39m \u001b[33;03m configurations to probabilities.\u001b[39;00m\n\u001b[32m 167\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 168\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m.tensor.dom) != \u001b[32m0\u001b[39m:\n\u001b[32m--> \u001b[39m\u001b[32m169\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 170\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mResult tensor must represent a state with inputs.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 171\u001b[39m )\n\u001b[32m 172\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.state_type \u001b[38;5;129;01mis\u001b[39;00m StateType.AMP:\n\u001b[32m 173\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._prob_dist_pure(round_digits)\n", + "\u001b[31mValueError\u001b[39m: Result tensor must represent a state with inputs." + ] + } + ], + "source": [ + "teleportation.eval().prob_dist()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "f7f2b98b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[[ 1.+0.j, -0.+0.j],\n", + " [-0.-0.j, 0.+0.j]],\n", + "\n", + " [[ 0.+0.j, 1.+0.j],\n", + " [ 0.-0.j, -0.-0.j]]],\n", + "\n", + "\n", + " [[[ 0.+0.j, 0.+0.j],\n", + " [ 1.-0.j, -0.+0.j]],\n", + "\n", + " [[ 0.+0.j, 0.+0.j],\n", + " [ 0.+0.j, 1.+0.j]]]])" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "teleportation.eval().tensor.array" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "c8dc0076", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T12:02:04.440497\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from optyx.qubits import Id\n", + "\n", + "Id(1).draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "bb29783a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "\n", + "np.allclose(\n", + " teleportation.eval().tensor.array,\n", + " Id(1).double().to_tensor().eval().array\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "8c0301af", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx import Diagram\n", + "\n", + "@Diagram.from_callable(\n", + " dom=qubit, cod=qubit\n", + ")\n", + "def teleportation(a):\n", + " b = (\n", + " Z(1, 2) @ Z(0, 2)\n", + " )(a)\n", + " d = X(2, 1)(b[1], b[2])\n", + " e = (Measure(1) @ Measure(1))(H()(b[0]), d)\n", + " f = BitControlledGate(\n", + " X(1, 1, 0.5)\n", + " )(e[1], b[3])\n", + " return BitControlledGate(\n", + " Z(1, 1, 0.5)\n", + " )(e[0], f)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "7925be20", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T12:02:06.752830\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "teleportation.foliation().draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "499fe3f9", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.core.backends import (\n", + " DiscopyBackend,\n", + " QuimbBackend\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "936fd7d2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[[ 1.+0.j, -0.+0.j],\n", + " [-0.+0.j, 0.+0.j]],\n", + "\n", + " [[ 0.+0.j, 1.+0.j],\n", + " [ 0.-0.j, 0.+0.j]]],\n", + "\n", + "\n", + " [[[ 0.+0.j, 0.+0.j],\n", + " [ 1.-0.j, -0.+0.j]],\n", + "\n", + " [[ 0.+0.j, 0.+0.j],\n", + " [ 0.+0.j, 1.+0.j]]]])" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "teleportation.eval(DiscopyBackend()).tensor.array" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "a1feb431", + "metadata": {}, + "outputs": [], + "source": [ + "from cotengra import HyperCompressedOptimizer\n", + "optimiser = HyperCompressedOptimizer(\n", + " chi=1\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "5139ef70", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[[ 0.04264946+0.j, -0.04264946-0.j],\n", + " [-0.04264946+0.j, 0.04264946-0.j]],\n", + "\n", + " [[ 0.04264946+0.j, -0.04264946-0.j],\n", + " [-0.04264946+0.j, 0.04264946-0.j]]],\n", + "\n", + "\n", + " [[[ 0.04264946+0.j, -0.04264946-0.j],\n", + " [-0.04264946+0.j, 0.04264946-0.j]],\n", + "\n", + " [[ 0.04264946+0.j, -0.04264946-0.j],\n", + " [-0.04264946+0.j, 0.04264946-0.j]]]])" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "teleportation.eval(QuimbBackend(optimiser)).tensor.array" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "6113a332", + "metadata": {}, + "outputs": [], + "source": [ + "optimiser = HyperCompressedOptimizer(\n", + " chi=2\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "f24413ca", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[[1.-0.j, 0.-0.j],\n", + " [0.+0.j, 0.-0.j]],\n", + "\n", + " [[0.+0.j, 1.+0.j],\n", + " [0.+0.j, 0.+0.j]]],\n", + "\n", + "\n", + " [[[0.-0.j, 0.-0.j],\n", + " [1.-0.j, 0.-0.j]],\n", + "\n", + " [[0.+0.j, 0.+0.j],\n", + " [0.-0.j, 1.-0.j]]]])" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "teleportation.eval(QuimbBackend(optimiser)).tensor.array" + ] + }, + { + "cell_type": "markdown", + "id": "a727d58e", + "metadata": {}, + "source": [ + "# Interfacing with external libraries" + ] + }, + { + "cell_type": "markdown", + "id": "5086ad32", + "metadata": {}, + "source": [ + "## Graphix graphs" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "eaaced50", + "metadata": {}, + "outputs": [], + "source": [ + "import graphix\n", + "from optyx import qubits\n", + "\n", + "circuit = graphix.Circuit(2)\n", + "circuit.rz(0, 0.5)\n", + "circuit.rz(1, 0.5)\n", + "circuit.cnot(0, 1)\n", + "circuit.s(0)\n", + "circuit.cnot(1, 0)\n", + "\n", + "pattern = circuit.transpile().pattern\n", + "\n", + "# open graph zx diagram\n", + "optyx_zx = qubits.Circuit(pattern)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "d921eb1a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The pattern is not consistent with flow or gflow structure.\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T12:34:35.690505\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pattern.draw_graph()" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "3a8c5542", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T12:34:36.370631\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "optyx_zx.foliation().draw()" + ] + }, + { + "cell_type": "markdown", + "id": "4870dd44", + "metadata": {}, + "source": [ + "## Perceval circuits and processors" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "3f1613ed", + "metadata": {}, + "outputs": [], + "source": [ + "import perceval as pcvl\n", + "from optyx import Channel" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1f07af00", + "metadata": {}, + "outputs": [], + "source": [ + "p = pcvl.Processor(\"SLOS\", 6)\n", + "p.add(0, pcvl.catalog[\"postprocessed cnot\"].build_processor())\n", + "\n", + "p.add(0, pcvl.BS.H())\n", + "p.add(0, pcvl.Detector.pnr())\n", + "p.add(1, pcvl.Detector.pnr())\n", + "p.add(2, pcvl.Detector.pnr())\n", + "p.add(3, pcvl.Detector.pnr())\n", + "\n", + "ff_X = pcvl.FFCircuitProvider(\n", + " 2, 0, pcvl.Circuit(2)\n", + ")\n", + "ff_X.add_configuration(\n", + " [0, 1], pcvl.PERM([1, 0])\n", + ")\n", + "p.add(2, ff_X)\n", + "\n", + "phi = pcvl.P(\"phi\")\n", + "ff_Z = pcvl.FFConfigurator(\n", + " 2, 3,\n", + " pcvl.PS(phi),\n", + " {\"phi\": 0}\n", + ").add_configuration(\n", + " [0, 1],\n", + " {\"phi\": np.pi}\n", + ")\n", + "p.add(0, ff_Z)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "3b4867c9", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "POSTPROCESSED CNOT\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Θ=1.910633\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Θ=1.910633\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Θ=1.910633\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PNR\n", + "\n", + "\n", + "\n", + "PNR\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "FFC\n", + "\n", + "\n", + "\n", + "U(FFC)\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PNR\n", + "\n", + "\n", + "\n", + "PNR\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "FFC\n", + "\n", + "\n", + "Φ=phi\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "[herald0]\n", + "0\n", + "\n", + "[herald1]\n", + "0\n", + "\n", + "[ctrl]\n", + "\n", + "[data]\n", + "\n", + "[ctrl]\n", + "\n", + "[data]\n", + "\n", + "[herald0]\n", + "0\n", + "\n", + "[herald1]\n", + "0\n", + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pcvl.pdisplay(p, recursive=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "22342f65", + "metadata": {}, + "outputs": [], + "source": [ + "# convert to Optyx\n", + "optyx_diagram = Channel.from_perceval(p)" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "8b7699cf", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T12:45:41.985074\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "optyx_diagram.draw(figsize=(10, 25))" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "af82f2ef", + "metadata": {}, + "outputs": [], + "source": [ + "to_transmit = (0.7071067811865476+0j)*pcvl.BasicState([1, 0]) + (-0.21850801222441052+0.6724985119639574j)*pcvl.BasicState([0, 1])\n", + "to_transmit.normalize()\n", + "\n", + "sg = pcvl.StateGenerator(pcvl.Encoding.DUAL_RAIL)\n", + "bell_state = sg.bell_state(\"phi+\")\n", + "\n", + "input_state = to_transmit * bell_state\n", + "p.min_detected_photons_filter(2)\n", + "\n", + "input_state *= pcvl.BasicState([0, 0])\n", + "\n", + "p.with_input(input_state)" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "4cc23c53", + "metadata": {}, + "outputs": [], + "source": [ + "result_perceval = p.probs()" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "d9bc5f3b", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.qubits import Scalar\n", + "from optyx.photonic import DualRail\n", + "\n", + "bell_state = Z(0, 2) @ Scalar(0.5**0.5)\n", + "transmit = Ket(\"+\") >> Z(1, 1, 0.3)\n", + "\n", + "protocol = (\n", + " transmit @ bell_state >>\n", + " DualRail(3) >>\n", + " Channel.from_perceval(p)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "ad7fe8c0", + "metadata": {}, + "outputs": [], + "source": [ + "result_optyx = protocol.eval().prob_dist()" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "e787f65b", + "metadata": {}, + "outputs": [], + "source": [ + "def check_dict_agreement(d1, d2, rtol=1e-5, atol=1e-8):\n", + " for key in d1.keys() - d2.keys():\n", + " assert np.isclose(d1[key], 0, rtol=rtol, atol=atol)\n", + " for key in d2.keys() - d1.keys():\n", + " assert np.isclose(d2[key], 0, rtol=rtol, atol=atol)\n", + " for key in d1.keys() & d2.keys():\n", + " assert np.isclose(d1[key], d2[key], rtol=rtol, atol=atol)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e433baf1", + "metadata": {}, + "outputs": [], + "source": [ + "check_dict_agreement(\n", + " {tuple(k): v for k, v in dict(result_perceval[\"results\"]).items()},\n", + " result_optyx\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "36241fe2", + "metadata": {}, + "source": [ + "# Fusion teleportation" + ] + }, + { + "cell_type": "markdown", + "id": "5721aeab", + "metadata": {}, + "source": [ + "Graphically, the fusion measurement we would like to use, takes the following form:\n", + "\n", + "![Fusion II](./fusion_ii.png \"Fusion measurement implementing a Bell measurement in dual rail encoding\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "1ab1655b", + "metadata": {}, + "source": [ + "where $\\underline{a}, \\underline{b}, \\underline{c}, \\underline{d}$ are the measurement outcomes as the measured photon numbers. " + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "5b0a58bb", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx import qmode\n", + "\n", + "from optyx.photonic import (\n", + " DualRail,\n", + " Swap,\n", + " HadamardBS\n", + ")\n", + "\n", + "fusion = (\n", + " HadamardBS() @ HadamardBS() >>\n", + " qmode @ Swap(1, 1) @ qmode >>\n", + " qmode @ HadamardBS() @ qmode >>\n", + " Swap(1, 1) @ qmode @ qmode >>\n", + " qmode @ Swap(1, 1) @ qmode >>\n", + " qmode @ qmode @ HadamardBS()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "f7998428", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T14:24:01.625617\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fusion.draw()" + ] + }, + { + "cell_type": "markdown", + "id": "ea1f931a", + "metadata": {}, + "source": [ + "As we are dealing with dual-rail encoding, we will restrict ourselves to the outcome results where the total measured number of photons is 4. We have that $\\underline{s} = \\underline{a} \\oplus \\underline{b}$ is the Boolean value of success (whether an entangling operation succeeded) and $\\underline{k} = \\underline{s} (\\underline{b} + \\underline{d}) + \\neg \\underline s (1 - \\frac{\\underline{a} + \\underline{b}}{2})$ is the Pauli error.\n", + "This means that the error is $\\underline{b} + \\underline{d}$ in case of success and $1 - \\frac{\\underline{a} + \\underline{b}}{2}$ in case of failure.\n", + "\n", + "We interpret this diagram as a CP-map which means that the sums represent classical mixing and not quantum superposition. We obtain different protocols conditioned on the value of $\\underline{s}$ and $\\underline{k}$.\n", + "\n", + "In our analysis we will ignore the case when the fusion fails." + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "0ce269cb", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.classical import (\n", + " ClassicalFunction\n", + ")\n", + "\n", + "from optyx import mode, bit\n", + "\n", + "def fusion_function(x):\n", + " \"\"\"\n", + " A classical function that returns two bits based on an input x,\n", + " based on the classical logical for the Fusion type II circuit.\n", + " \"\"\"\n", + " a = x[0]\n", + " b = x[1]\n", + " c = x[2]\n", + " d = x[3]\n", + " s = (a % 2) ^ (b % 2)\n", + " k = int(s*(b + d) + (1-s)*(1 - (a + b)/2))%2\n", + " return [s, k]\n", + "\n", + "classical_function = ClassicalFunction(\n", + " fusion_function,\n", + " mode**4,\n", + " bit**2\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "a1764edb", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.classical import PostselectBit\n", + "\n", + "fusion_failure_processing = PostselectBit(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "08e9fc37", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.photonic import Phase\n", + "from optyx.classical import BitControlledGate\n", + "\n", + "# apply the box if the control bit is 1, otherwise apply an identity channel\n", + "correction = BitControlledGate(\n", + " HadamardBS() >>\n", + " (Phase(0.5) @ qmode) >>\n", + " HadamardBS()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "76f472af", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T14:24:42.083969\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "correction.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "c557c4b8", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.qubits import Z\n", + "from optyx.photonic import Scalar\n", + "\n", + "channel_bell = (\n", + " Z(0, 2) @ Scalar(0.5**0.5) >> DualRail(1) @ DualRail(1)\n", + ")\n", + "\n", + "dual_rail_input = DualRail(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "4b5ee771", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.photonic import NumberResolvingMeasurement\n", + "\n", + "teleportation = (\n", + " dual_rail_input @ channel_bell >>\n", + " fusion @ qmode**2 >>\n", + " NumberResolvingMeasurement(4) @ qmode**2 >>\n", + " classical_function @ qmode**2 >>\n", + " fusion_failure_processing @ correction >>\n", + " DualRail(1).dagger()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "12531eea", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T14:25:06.777764\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "teleportation.foliation().draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "c8c49c91", + "metadata": {}, + "outputs": [], + "source": [ + "array_teleportation = teleportation.eval().tensor.array" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "5017fe5a", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.photonic import Id\n", + "\n", + "array_id = (\n", + " Id(1) @ Scalar(0.5**0.5)\n", + ").double().to_tensor().eval().array" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "c19354d7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "\n", + "np.allclose(array_teleportation, array_id)" + ] + }, + { + "cell_type": "markdown", + "id": "07c143a0", + "metadata": {}, + "source": [ + "## Fusion with distinguishable photons" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "74e3f64e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T14:45:27.340645\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fusion_channel = fusion >> NumberResolvingMeasurement(4) >> classical_function\n", + "fusion_channel.draw(figsize=(6, 6))" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "fcbe90b6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 0] [1. 0.]\n" + ] + } + ], + "source": [ + "amp = 0.1\n", + "internal_state_1 = [1, 0]\n", + "internal_state_2 = [1, 0]\n", + "internal_state_2 = internal_state_2 / np.linalg.norm(internal_state_2)\n", + "\n", + "print(internal_state_1, internal_state_2)" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "bdb9611d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T14:45:43.979798\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from optyx.qubits import Z, Scalar, Id, Measure\n", + "from optyx.photonic import DualRail\n", + "from optyx.classical import PostselectBit\n", + "from discopy.drawing import Equation\n", + "\n", + "bell_state = Z(0, 2) @ Scalar(0.5 ** 0.5)\n", + "dual_rail_encoding = lambda state: DualRail(1, internal_states=[state])\n", + "encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(internal_state_2)\n", + "post_select = PostselectBit(1) @ PostselectBit(0)\n", + "experiment = bell_state @ bell_state >> Id(1) @ (encoding_layer >> fusion_channel >> post_select) @ Id(1)\n", + "measure = Measure(2)\n", + "Equation(experiment >> measure, bell_state >> measure).draw(figsize=(8, 8))" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "2fbb6c45", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.qubits import Discard" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "aa3042f9", + "metadata": {}, + "outputs": [], + "source": [ + "fidelity = (experiment >> bell_state.dagger())\n", + "\n", + "normalisation = (experiment >> Discard(2)).inflate(2).double().to_tensor().to_quimb()^..." + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "id": "c83b686e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1.0000000000000002-1.8369701987210297e-16j)" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = fidelity.inflate(2).double().to_tensor().to_quimb()^...\n", + "f/normalisation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e5c4078", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "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.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/optyx/core/backends.py b/optyx/core/backends.py index d510dff0..b87508e5 100644 --- a/optyx/core/backends.py +++ b/optyx/core/backends.py @@ -122,7 +122,7 @@ def density_matrix(self) -> discopy_tensor.Box: """ if len(self.tensor.dom) != 0: raise ValueError( - "Result tensor must represent a state without inputs." + "Result tensor must represent a state with inputs." ) if self.state_type not in {StateType.AMP, StateType.DM}: raise TypeError( @@ -147,7 +147,7 @@ def amplitudes(self, normalise=True) -> dict[tuple[int, ...], float]: ) if len(self.tensor.dom) != 0: raise ValueError( - "Result tensor must represent a state without inputs." + "Result tensor must represent a state with inputs." ) dic = self._convert_array_to_dict(self.tensor.array) @@ -167,7 +167,7 @@ def prob_dist(self, round_digits: int = None) -> dict: """ if len(self.tensor.dom) != 0: raise ValueError( - "Result tensor must represent a state without inputs." + "Result tensor must represent a state with inputs." ) if self.state_type is StateType.AMP: return self._prob_dist_pure(round_digits) diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index cb81f403..d0d52299 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -345,6 +345,10 @@ def list_to_dim(dims: np.ndarray | list) -> Dim: ) if isinstance(box, zw.LO_ELEMENTS): prev_layers.append((left_offset, box)) + elif isinstance(box, DualRail): + prev_layers.append((left_offset, zw.Select(1))) + prev_layers.append((left_offset, zw.Create(0))) + prev_layers.append((left_offset, box)) else: if len(dims_in) > 0: prev_layers.append( diff --git a/optyx/utils/utils.py b/optyx/utils/utils.py index b25e70fc..bf3f04a8 100644 --- a/optyx/utils/utils.py +++ b/optyx/utils/utils.py @@ -334,6 +334,8 @@ def preprocess_quimb_tensors_safe(tn, epsilon=1e-12, value_limit=1e10): for t in tn: data = t.data + data = np.array(data, copy=True) + if data.dtype.kind in {'i', 'u'}: t.modify(data=data.astype('complex128')) continue @@ -514,7 +516,7 @@ def get_max_dim_for_box( input_dims: List[int], prev_layers, ): - from optyx.core.diagram import Swap + from optyx.core.diagram import Swap, DualRail from optyx.core.zw import Create, Endo # Boxes with no inputs (or a pure Swap) don't constrain the bound here. @@ -529,7 +531,6 @@ def get_max_dim_for_box( + [True] * len(box.dom) + [False] * right_offset ) - # Walk previous layers from nearest to farthest for previous_left_offset, previous_box in prev_layers[::-1]: total = len(wires_in_light_cone) @@ -563,6 +564,9 @@ def get_max_dim_for_box( if idxs: dim_for_box += sum(previous_box.photons[i] for i in idxs) + if isinstance(previous_box, DualRail): + dim_for_box += 1 + # Pull the LC back through this box (use the same clamped offsets) if isinstance(previous_box, Swap): # Swaps always connect all their wires @@ -579,7 +583,5 @@ def get_max_dim_for_box( previous_box, previous_right_offset, ) - - # Baseline contribution from current inputs still in the LC (+1 safety) dim_for_box += sum(2 * dim for wire, dim in zip(wires_in_light_cone, input_dims) if wire) + 1 return max(dim_for_box, 3) From 69a64bfc7c03571c4fa1dd6ffcf4543891afc4af Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Tue, 16 Sep 2025 19:54:17 +0100 Subject: [PATCH 13/59] an example notebook --- docs/notebooks/classical_generators.png | Bin 0 -> 174763 bytes docs/notebooks/generators.png | Bin 0 -> 81669 bytes docs/notebooks/graphix_workshop.ipynb | 10033 +++++++++++++--------- docs/notebooks/photonic_generators.png | Bin 0 -> 218623 bytes docs/notebooks/qubit_generators.png | Bin 0 -> 101147 bytes docs/notebooks/teleport.png | Bin 0 -> 18428 bytes docs/notebooks/teleport.svg | 998 +++ optyx/classical.py | 2 +- 8 files changed, 6884 insertions(+), 4149 deletions(-) create mode 100644 docs/notebooks/classical_generators.png create mode 100644 docs/notebooks/generators.png create mode 100644 docs/notebooks/photonic_generators.png create mode 100644 docs/notebooks/qubit_generators.png create mode 100644 docs/notebooks/teleport.png create mode 100644 docs/notebooks/teleport.svg diff --git a/docs/notebooks/classical_generators.png b/docs/notebooks/classical_generators.png new file mode 100644 index 0000000000000000000000000000000000000000..4c84d1bf7813aacd4859c81e41f8dbf756ce618a GIT binary patch literal 174763 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%0D~#KW|C?J{TeOw3`k zsi~vqmjByeX=qT;rM3%SeC24kp1+xdI06EgSUvl{&AghmzUD&l=KIgg>;GKp1aTJS zoBsgI|Fzt{`v3cW{Qqu5`2X65nXmm1Wg*uA{@v9pFOQ2vgoWMz56XB2-2{pC{Ug2q zRb~^Ypq+_3Xkh*f21@D2gqkus=Mh3~(Y%p8$AGd2ybChIYCqgm3Ifdk&IwFO6B7rJ zN%#G&U|On0!`QLByeujPDQ0tDU!R>)m|QI6=+*cDvDxV5n4c(vqUa0^SXG5FNc1is zt67wLWQ#>k6 zEw{~ef<16Bt#5TU?@Pk&1IN$B|nO55q6cvrwbn@G!Pof zy)7I8@a={Z3>U~45sBAwyJ2*K%zuZ}qW}`sP}Ui|1D+LL!K6OQt9F=8P=5`mIj6)5 zA`?W=*Vu`v4d5#pE;vS*4x7=mvlGTSzV>Hju6U&vp-7dcRo?^4n32pqgk?%eely*G zAcFAbo#F{+uYXNq#9%vPO3m%_nCT-kVt^?ZUr3fCD@Bq<8apxH2~~pu69!~J2>ewS zIqA%uniG5W?K40${+R3hp)P1~L^Mx;Rb+V7??0C$q3M*g^g}?P;9v$4o_QkXkY?AI z3E}wG-`{G&=%r)B@}E9^`bWfA9Q(V2uHe7307pRyfZFNUMeRzUi<3#N`s=aUNQ^VX z2*qx!!j#0Fo}Qj6tF4M5B~ynRDxd=bz~4nv@59hxDM(J$z%k;q3xj7srPv10auVhY zk~q<`+E7I91J3k=2PtVnt}t{W+X1#msyWi1WZain`E3tQA@)>)kjxiQXP|MufJSJX z7LaP>Lj_KnnDBTkQR1*Dkkb4m-4RG<)Ik+!%g_qfItk1#K~8G{3xZQ^hn@yP0dCa z+5=q`)1lZzT*0s>7h{!5o1167bVVL!J3!n4huwJk^l38giZCxAnI`{2$%2Ho&~ZKyz&sNUkq} z5bRRR{xwh+RBZjctMrhL0$2T#X;`fk(m%gFq#0jX5LyT2&tajk{aSHZ`9v~GWx?!V zz(94F0n|6m-%~_-#L?4p?t%*iQ7pby2*$BVXMT>r{BZ;?0qf#F^noRMSIT`EDbvO7`Ons#4c4y>m&d%DLXX6ErpW`O56K z>)KAyRKfBIZzpBbVq*v7w|`g@ym%jER82`<_dFu?mnHkYZM?iMWEXtKPOvO%t zTy6yP!q^W9PHyg|AF6_BNJ5L{b0rN8TRCpczY4yNl)2f8rMi}u+8+%O6dGx~ZT7+( znL2=gMrh;{QF}hvxeFbYpFe*t2LUJJq9i?Gs9W`rPZcoGd2ajxlBD{ep=2l?x)=XD z4b8T^8}WT&*DWnmZ|0q+5Q+ixlf7_M-_UR^02#5S@P7Q4#ZaEe)Pmi3$9Ch|XS|nn zW|lVSEiyaoQojmQ0mCmJ5MznS2AZu3?R23Bn^(EH&6}?SBVmFVAyEn=8?NfKT)|ZH zQ5Zv#M0bV^XTtcw-_Nhi_=VeEi8tBVM7xz2Fg7&wBC`~^7k>bm=M0N!s;j?*!c9yC z-0#_jb%M92SJ-=<{+1thUv?#4W$b~<8>$05VNyoD8mtF@`9FZDSBm|STK+VFpikO& zrb2b!WfMC3kYeH>~#yf95IqWcA(~&pu>_(ks%VrWrM{)s%Z6G{}4BMsX74O7J9FRLBJ<#*>XC?34+O=!n0)6lK;eFzuUQw{- zkL#WJd!|lsKhnB*b{85)*a4kW#kc+-#u5;o?#}(Y| zftqnJ@Hm+!zx3^&M_o6q$W|rC*ALbS^Z1F5s6XVo0g+VhxIo>rfrH5J`R<)qgovePo5q3~*G^m9fK9AbWnjPc@O}&2S9T)s*y~yU4XGcH z>avIE4`Sp703-a9yBHE>C#f-5a(v}Z`(ULPFE8+e?q*aq(MH;wxno~N#H9G5CsZG$z*O{-yMX-Z43O0MdHqf zQz090kP5+$6(?JzpDiUM)H0&SNl<%!eKG}T{UA$Woc z10S(zzpu+&4m7zG3K``k+!(nRN8#y`vjcnPByyWLLa*+1mLs>xCzWZbzN~Ac?JGHlFG$7f1yt+YtL(&){Pa*JxYbyLbF<%jnsy ze<*-Ore+@v2ZEkGs~I=Pe-4Rc-^ALaaPs7;uL+8G#U&*8#rRp5S7YGa`)dZep^|BP zvRe9H3>0ix)k7b`d(H%v_VIjN`r zHA%(7XaL=7YIaPkb_!TDvm2G*N1)Kx=cQr!67cXzKOYi!ZHyUqy|CmI4s!9W-QG(^$d6S(AX6N5+E z0ksA^Q_m|X0EQjj{T==z(eZm>m_`J}vkC{_-L_9b`6iPvk55HVVsG*_xI=QOYO&-U zT_71R>BcnFz+SPqEBQXv|RFV{ia6eRicSgyTj z8C3zD$V|Ms-o1{36t?yI+T}2MHPPUoi;!KVP<)B4sA434H-df(|F$+D1Tx$TI&!QViYGkgpywZw+uWEmj$Av)M%=`;YhE#nRizwI9 zUTLu>%iJI0mX=ml#%E@|I(csS$N@GENmnUI$q=iF`a{MD6YW)lV`F00I81bv1LP_~ zfL_$!rn*g8y>8MKkcKQ)22AgIK!Y9}9)91@pfuFljHc|kIJ+OW;8kp_7oZODswp0@ zygrndW94Y}>#`e3KVZ9M(X9xfz=+ja zu+^_hOt4_G5aJcyg3K zR@MNQUha&s;t{kr@4&$Op`lEG4lA+&y=c(%2)n^zf(C#&{hcVe6c3VB@&MtlN?+7V zq*X3QX0OfV;TannK_o3pxL;68z%yQ@r|Z3fTQ*{V(>U0axJ^z@jzYn=B*_$lx8Y*3 z;(1Tc!k@m_#(fI%AS$`yrAr>*3ODSYV_+C#4Ci9MkIBobj5*6DoX3-FMprcuHw1?U zHWN%gFO*##J8N9O(`eZ%Sr2XT=fqt`LuG>Ot@pKcCfO_X-1_XCNwbG2Z+U(vh~4Df~L9_;wE_t1wKK~*w_Og({sYJ zHa0exS7s*<6#;4|rVeShU>@zcmVTgy(dat1zk;7V^M{+;3k?WgtbfN-371^Y0&KB} zRR_<}&oEZWGcB+ur%<>xvrTRY*In-}k_A@AW41QE zy5x<(&?!#39zfG_Y?`97@&}_NP=?;>cx07Knp3vJLWWH*nE3m=)BOC@E^w`?&kCK&y2I;La@M_RX$<>ez6`YAkK zZ&s`8$^aIX$V*Lhw(afhWJB@%mUQ!5K6Smtckr@UVuS@nJiK4Sxq#jL#LERwbtor; z_-WaI@8tO}(6})w!HnoGTHjiTKO_W2jMUzjA6iYJTk`p!q_X(htT-$;Yyh`r+j*^H3x|c=Gz?roetsgu0lWHoWpLXot;JD ze2`Bf@{LDSloh}T4Ui6#28v2bRPYElvK*pdiog?!m)vtd0Y1&mcybB3hBw`#T#z9n z&#odR7w45I7^n}|HY{TMuVSi~$RQ0*Mex;{)AhDM@52{+k6Mia12?4tPtUmv{70*{_1$ELba4cQs zK;|kZoy;Vie=Z*WtJrtAPSSPW1H~LTb{m+1wXN+b$WM?AubP?pk}x_lhC=(+x(3)P z$Pn50B3(7@EwvxQkvlH$+@x}3p5?~_1%NK;m zYKK%}N1f-Ew6wH>@3|IjcR>9!-EiCS#?pJ7NQ57gCjkIoR1}0o4!JGZ0aKCCP2GzV zY9niQn##z^UIlg}@pPQ6d>qA73Ji6$u0*1=JKryXd zA^In3O|2L`%^D;nf{(4-n2W~9tQRJU`tZD$v**sOq9;$CB0@FhaeWaFyb9~FHOHJ8 z!5LD%aPJJTiy=Q4UI`DYJ2rN9M()1_WDfpC0{jUmZ87QT7ttbO(F_O%#I}}0a#r8667{Y2c#a&<<#={>6 zzJH%|)m(B~nitH=&)-VXd~1yb3{v z3-0OhA%HAD0RaIMe4?!rgIJ>`oEs`B(9&2)P~m?>ktcR?cFs(d3*j5h^Ig%)wjXO( z8FyQ^cC8{%`B^Qkr-*P|z)p{qcg!4KY-*2qd|;mAGs-3KBi;iC6q2-2 z*3y^2J{5Y8oM^f6h4U%kn2@00)w(RwrRESts|xu6HmklO-TVU|>dnCrJcMO#3BF0@ zQr#25yLNVV*Q%fuT^>GC1n|E17kHT0+}FGt#(P(w`&I|vu(efEw}J$pGU+TMgN01~ zGPlYj4YYYglXW-T2QEw(QAy$E8m%z@UJpAtW|mFX;#=;8VX;KLVo5BFBKqgGqBpol z^+2~yKYycbH6h9$K6G46tP#DYwFnfsV+LcYPb{E*G3c&ftIl`9dAE{e4AB5R@0!~` z@%)bkVOVadD^!RpUahOZ>1{as}aSShl}erK=2@-84gS7us^7z*PPByWtGh&8w~Z}IOYIt z$EP6GW+N9Xbo6LELMckt)`zfGim*d4EpVOO9x5q3Xf)`X19SZA*Fkv3(|H_!Z5^E< zyz;YtJUnb4rk#>BbNK!&EXX~Z7#NU64IXWedf@$kaQ7$fShj87H-0pi(mbgsN`o{Y zl?KU>LPe;QG?>y%2}N;6X%b~fX`l!xp@Bj(LMf3nCqq#Q2}$11)^p#_@Av)-@3P#> zbzkRs700pf+pw+c=J21!w24xR@|U2agFkb0+W5X45F6fRiG#*5b6lw;lhmooR^lB;p|c+B$UBuJfEs`A~!-o;=FV zUL!kKv!8f87Q-iu>!BMd-9W)Ucjd}6G_WJ4%(UHq@ZfNYi?&(-xVx94*X4u|`x$ zT$z57r=D%vjquyIckfXM?1F~z3-~DrQysd60(Nu=RJX~<%uL$R%B4BP!d5zz-yY_7 z@bcyH+<*s2#97GyFBt;VE%Pul({O%fX68O3{Y=I`ymdVX@s=BXZP5}UPa=knHu=4iT>lzHQ+$OGcPyASFLeH}o=E&oz3Q9S+JR)VyQeESjf-2;Qd3{H;#*Ou z`-A*-UbpRf-}YuX>Rtu+M36XGe?JIFJFC4Xf$9t_X-mVxPMy+t@839VMbO?{iaFH| z9VO`WPZ$-mYW*)=8aHZ!?G5;(v8ndG1ej#Jt>!K2LO6K6)cE?9S~5Cz03|Duw|EVa zmF*%4J#iwR&k=ghxEHuXuA3c*l9Mf`*FvqBMdQbgHN3omEC1FJp;g_qeEY|H9k>e> zKO`0I54jBE~dvX_y!SodymStk4ufGq_beQ?bv11QDpY{94$96!l z#AP-3Mqgd2Xtgww;eh8~hXi;T$^;gk*;t(DQ@{LtkWMeES~J+i{KCRW?(XdQ zrm|)3bUf`n5rmalE&rKoZkuIRw6nj9cJ0rf=K%nCMJK)MI+?_nB(k8|dnymJic$Pu zEr7Ce-xu{XYhR~3Zr>iC{G@-;YR4}vfofx7ZWy&c2MuT@bB{Dc`xs(P2~xCa>Je#Ty&$@xo{9{T}S zgq~V%adW+MaXb3Fc?ebH&u%*!WIQ@hsp01r(@JuBzf@M{BZ!a8rsLRW`hIK}MGi6vYrN;%zmB=WW}jPP@UXT!g0YGd;Led`;w!LK#*1%9q1VAJHDA zp%E(mU1Z{!&Iz>RG`ERTtW{Q-IPokG;YW5gS_n7uvn50Q=k6ab?O5HzOY3ZY#zod~ z`#>c(+sLuITKMme=5NOEVDtiu^SyRP55$G}hN{D@>{{yHT+Z#N=&uDa$1ICMgSH>$ zesS_UETgv9bJ4>2dhT_Prwr1G>L|Uk4F`*^E5|d#)pYoX%19R#B z1ZZE%39FdYXGJjh@fFJVlbLm!Y=^7b3>q|O5jc%KF)UFO)cLdw8XaHK&V}T7>gf)N zpP#b>>@8oS6oAe! zXUq*=+&09AlO@v#o*FeYzvmR2j_uoTNk78hxrr5l%l5EZ7K>I9_Ft)GgKu)ncz&T? zo>%puG16t$g2=tyr6x4^K;P;T-%6XB$2mC%Km9lw5O6naN}H!t>t#_XM93}J0oyz- zZCA?)**yGyz+H0(HnXLF(HTZacj?;o9AEn>i28BsgV(Q5ChaJsp>FiS=)cAp{$mc~ zB1}jXhF)!lmLfhP$ZZfOisE%7Atv16#XI9cHeeg)#&p(U!HT1Cv0XnCOG_gPvk?+0 zSx>!Bi>W(8rKUIn$m>Y5GBWnkSr0Syika8L&+jFv(?)q^|_!S;z69kNY&MDDP-KKX< z(HY`p_P1}_rc3*_p&i>gLb2p+TTwewC;D6%)S~~A^Mk{U=OPzTQnQJzn%Sqd3;U|0X zMO9E46lQx*(2RKF?X0-=S(9y0jyrzWJKa6ZH~Q>ZPcX8VH=^dY-n$|9C@X8#oLnCK zqe%z$)0me2%qc6=3Hmmz*E5P&4QJBH_Go14<>}K+nP!>?e_tm1%aisi@y3l&5)n@n z+Fe;Y++Sv2S)sJ}roE^)k4Sc1pWs}74jcFJbN6B4l+B}}qkV%`kYe`kX2yho_$U6w zxWwCP(M+dakZUCfD(<<${2Ik~SF%r6fw40@!8giCQ~p$lSW`VSWQu{yVnB;#~_{!&a64uq^0(?I2aXpyY@-`=SeW#<83h zO;@CS86`>WI|1f8f1s-R+D0jVyR5!4lQG#nRw<}aw@KgKdfNItri(*H#gw5F^}0%Y zthOo?*k+X`sc(97oC?4!yow5A}71GfG)JD{C) zu;&tmgPS?-E{F?ATz(thr=Joq?bcNzHf5Pz6_j6UT3V1)kZJ$J@^w|`sCT|v?Ay05 zsr6vPwSCfqGp45{IwvZ3INE6Rl!hbQXkn@2xT8T8#k`MpPre%2b_;dCPE|d3YFDL$ z8U7YczJpa)SXz$8lv9p|e=fa#6y=>Mp@>;epZas;D<;g?KS@_@u;fvhk&XQ2wZZCr zs(>|&+Kd>d6fgpeH^mI8itP{`BI~j+{o35x1{oESV0N5ziJgMa4$1=T1 zFA3M4py8;Sq5f=Y$<~0=r=K|b#nDF*qaIyt*(De@GlZMb9{C1oKew3XJ`j(gi7$|pZ>!S+2KbzY@a`yj(W(SX%zUz4xjrnM7w$MMfHmmqB6XPur? zJ!lI?^{6wXm0556Ro?I~#CJF%7L3f}fNBSA(?&w6kwF1$oBbl%q#c*%UXFf=07x6D z2AWj=hLUnS2Rx92+_Ko>nQ<4v@xG@QB+YKmqKcL2?lK4_B%WL|)=<={&GSLnUtV?S zvwq<}Stp8&vg`(M!vy+!IQ^iy-E{4^pZbw;>V@h&CBHvDkz`5>W7>&>CX?h*AtFk?b?Xy1yI{>| zhJ8U^W4>_8uc6PBNYMO(totq5MTqO8T|z{+DDyJE!@B?$Dtq`W-xSx9qS>knEm=H}arFg)hG>oAdBg%Yymy z&5vsiVFf_EE-5R-spy z%G^#7qFQg49r2_=dB+0il7Cojc5O^o%F+aax316H{&lHU(}#9%H&rsOg+hM#qO;dt%Z_LH09P?r|%t{!q7o?JBI=zESH*Rv$O+Vbp&5 z$t#YlK-EANluUyc&aC~@w3R&f_7Y>VIDCGu?&Y2x7W>-SbLT=lJ7Lv>M}OPRDm1(| z$C%>P{I#%8U!kbEK8p;W&_vuTM%8v0pvnCC@#IG0k1^}>ZOn_0EV?ki%CPjJs?C8z z#*z=8KW8=1;9~pL%q!pUW4v}jOnV8GqNN)r-`1d0R|zuyf9_ovR?zjE1r^T#Uqv>1zZ8 zpx`CaXU@Q`0udhmhGg0rFw-DX{K@W$o*Nz0nJPcHQB#mH zlt&_ANFeFLiwb_&_UYe0qnip9U1_(a7tLbs9XgCU0413Dv=(8UFZWEL z#r}FjSx<|uQ&^fMk=f>M2E%$qOg6SSG08#UnzRL645_9^5RR{bMBn1#l8I`0Qg@YB zXjG#Q*u#N)_xOqd5>$Q$vOTO)oP5SOqJzse{L)2&w$#Y2KO{|fGBMltk*vJj<+iOG zJr9W)Wgb=*Vw}zXNoDdqJAWuI@2GY2`8^ckTR@Nm%Ozq9LKo;|d>}so&f$cmOijXW zixxvSlO-C_ovBA`Z*!>#Gtd)9g?k_p#hPba-o#m`m6yursptuEs?l!1or*ETD|P$r zxXbCO6exC6VWG$+mIPLwqbRN+)k`>hhRBBb@+_?(o~7zC_T|-|)|;kg@gt@ysO|wQ zm6Aw5Pv9`)P;OVnxBJlKOy0U%ybi99_8Y&2X)3qIf^a{W2umBu$ zy|Fte^48*OGYMcgGQTJ3I67Q=Wmc_J)fh8DhTCqwa3OEMQnN|W#^=A^WToFXptJ5u zjaBNZ=R0;=lWW$zV=X_w^xtVsGY(R#l zZuuYq5kAPzdG~Fhu5NouCQ0Cq@cpS@`#vM5OiZy7alFQx6rJ>hAP8M|X*RP3WD#@S zY zbr2c$i<)}NYtF%u|4DsLzZGKO3&7lv9`0PX=>9EB!XhFRaJ>i@F257qmQ7}$>>f~% zv5N6Z`W>8u_8buNTi7#Eo@rz}04Qeo>Ferl>ARQPJM~=xaUeu~xQ@9NbU43WBir|; zhzNiTcs(KB3PJD5(W6KE5ALUBUgl2wBUA@ab>5WNce&940(pp9^l{JNNw!tJm|y1c zfL#>iwjl9zKx4OAxVR(hex&d-?!e6!rz5Z+QtOg&MF{gyfV0&@Cker)ckQRFYGF~vVxe^$1izxjY2?<{KR1x|;qxHG=r5(oG;%Yn) zsG-u|m`D{`l$*W19HJMx^Rf`gd}|}JUS4k2+}`Kxwzkhh4zPKE3zZd~R$O;5@3=Bf zzK+cT?Q6H!NI`fNr(ZVe?3Fm@HmI_n{8nHbp(p{|B0Fw`nyg8qnq)(Uk=~f9!{ffs zZ_$9!?FzUm%0HAE;nC4^V-;8akr}OqczgO_z!%}sq02&MCP8+LKH@CW2c?uwdcGaU zOMVc0@y==rx}2V!+lL*Jcc^MzMF9*)rH6y<6L6wW=hSggLPKl#|H>wxO~rFyM(IJJiJ}F!h_o~SbD80 zvg*EG>WqekYqTfji-^_|!*PVp{l@!U7lW%D8lAorCyf#(b;-l7lE~GC;C&i?V@tx9 z2T3cAzT6cqqkKr8g-eR74Xtjvk5N)88JNPj4^Jwex@koW0EB@J(8y^sTDDb=nuYy# zhud=%$ykoYx{EI^K?n(!MY1M3k3#)yrhIuZER6XPW3c)vL?{JTEb zZ|HN+2ltGubkD1;Je!!cV@}EY^NCV_^BxI|>Z8U5qtJUfV-%E>Vl8u|@ZYatm49Yv zQP+>_391y4HXKV|-Ovch(H8dmK1%5xxk1Q#M3CetT^9smRJ2#%(>b|UgDImx_A;=y zX=|x7(s>h7y*bv72SN+M-`g>`>$=}jLiC!2RlI6G3TRtr+s@Ndn*r#8P(>CnaQLn~%LypoOrGtphCw@x5al=KiVvde2 zLEle`Ck&1?pYi5+VpZ&csS$vOT}y^KA3V4u$hXx{8p5aC>503wRaPsY8cw7+3_YCdJOTgBz6pS{0UQnVXizZRrM9$Q*bTPKr zer!SzS>K6SBO$|%eRh%D;byn+-UkL;w_TyNchef_P~h;7W{ZHf!u<4MtE#VNr|UXQ zz%=I;O|lTj6w&vOLf?fEwSXFDIF`FToqCjCdm^(kd&jOHp-z{_Bc}6Y(X^3}hn%DQ zTg$|p!l6<5#RtmNJ z*M^X<0ZQ6DF}_|W<5!bsA)Pt8_5AEpP>xuG{z{B*N?NGq&z?JX|HUa~T5P5)#!fti zfo$T0wD{mSgs7E`GP^)*NGQ+%zKI96Hv2-9%u_aq8FPm@d(X;5F$CDaUq7t(2eY)7yOUn~#Ojhg5`8zC7r;N=YD2-f>;TJC+ zq=~cUCk6$X2mN?BNR{kL4K>vcZQIz(%Glb)`1beiCqK^p0rkW)&L>MkNNJA|Iql&t zpv`DU4bB?-07udYeQyGD>hvaHTXuP*s(m7}VoLb&Y|PovY~nzkI(_}uHo0yQ^$fD2X!0d%B366I9lmQ?qta1)tTvLCwpi}6(9KW}V&J@RAAxl5O%#kh;X zQ@S(SV>WDHdQ1|HQx44_ee}ly2S0`h0Yer%6|n{Um$IKG#r2az13?pWhTQ(F<_RDdehg zr;@6o+KnNNxmPZaj@W!2z*|GfJw`kqOoL%pRu58IP^_}0`1i8ZuS$b2XjF!Dne!#rtb2P zp;#HLkz&nWt0@*XjN4}ZsiI;ZLRo`9?}-N%>0d(r_QJDYc%`EKgQ{g-TE^dRrYijE zpc$RGB7SsG_^rkJW@`Oev3tR-{q$Klp=Q0V&(48p7E)GFvrn9d0GHkriNJ8en01w` zZ5%I4leggJxOUGyU~ew!9)TPvyttOEe@j)aZHd8f_yHkN)h>q_6%&F*z82~?dW==P zG9jUZa26(&$;(ZGC_6i$&E3!n*QRv4<4UpVztRzsJ{ zJm^c-~0A)=CcIqh04PV^Hu zlO7J~3#v9XscZTq-_8J5#ODn_m}FU8+_c2xdit1K*InJ}B~ALTB6WLHUv zTz5LA+ZN|;{VaA{xF1s5xPP!M3A1BNvyec_a&!ib8N0q4qffWKc(L0d`r;5XZ>sq% zVF}rlhlsOz3TSnGG*5xJ!X>aod0YDN{@QpotK2bEh(dH)5#c zBXO8z&hh_zoR*U|jyS~W@g0HYn9 z{#OgozWoo)&D`KhD-6r|8DaJ!3l&pJ1VS%^34^$49e*wF>trk<_7}BI=qptNMPo2? z*!`mil3Pzp4*f8p7pPY~hTQ5J#936h?(qTmB5@XFjhY{|iD-#IN z9V8gx?wGKRBehd^t;8k>R#BSW+}J2G2(`X+3qnCXCUvjt+`$&|O}@Tv#xx*KFTA5i z0}nk!Yw|LkaZK6yi}z;l>fYJ`050?1r$2Cgy~B^thh^KHe4Da$pXvDX@_#)t_QWXa}>z17(97{@%qzrAWt&d;_NkTPB!fC{>qdi6gGn?Ww8OKj_7+KE27-T2ZDo$lbm|4)E;J zBOsQr4!oRC3SnbX+T`=}mx`V|7`(J@eCX9a9$$V5q z;@ygqNC@q#VwdQ;{8WF@L44d#2e>F4gMT00r=N7V0@-c;GjIO{DyN`{*P{4hUUKy>|Xqr zlhp0hsIE1R=T&L-`M7r0l9Q2} z==+rty!R8jPtH4N%ey784xgNu4Lx&l(m9QlpbaW$Wc#0Z zjxUH~EIKe13s<5HMCZpvow5Yk^S8`)kHP{wn7t zPC`~{@m6lgkX%Fg^9C3e9@w4bJng|wJgS89?+DlJMfC^E(Wu(n-I(jONalxw&Vy5G zr5;0}0mZF~#FY6;^?H|%{8UsWxZF?e8zs<)ba`aqPvUkzYqaWBlG6q%d`{&{Ct$;` zCqLYB_XHPfo-C%9_WHg^2E}S_w-rcGQ;YgehZnhe?OLeQj4@;Oo1Tfb?q*dSoirp+ z5m{Ea5lBA*hP+=(7+Z90vj(kN`RB6g>b&VjZ`o&Nu{y>sGQCy~U3kK;qyOa#CczwD zS2jN>Dhde+7)D1$8ji%Es`{%yDWj zMA|OIr;iim@>9TiYK?xCvRqcK^*%1&UOmjHp$qvq)i-b-`ik(~t$ZXM6~nG4$4YD3 zE-?RgGq&*!nyHuVP;Di+)~vZcVST=-1^4A)j9W3&l=Qay@Lv#*y9ZA!?RWRi9SM~t z7|L#2`?5N%b$6h~Bt0dn>go^_ytTskm1jH^0R8Jya z?IK~RT7C3@lRXHw9DV-0Zp@!7Yfjkqp4_{7w5DQIIOS&q<(E{KF5yJI95{01f&kwg zQ0E7|ZJ>*=%|^v$0ztbpG-k!E$Q!@C z@1qnL)u4&4IGW4ls_>|`Ub=Ltiv$by?C(vwx}0nyB-;QSd=hE08vk(NavhCSM_VHy zy6xa-MEkL5&+NNMgrcx;_JQjBx7i8lKSgr^X-;4#Rh&Jr1sKI|)H7bOr`z>1p{*c@`P8FI#BtOmLD@OC_w%S0+?vjM z4^8BCmqIVv(1ea{m^pI92!H%-$HYfsyi-!`N@P#~CFkJ0RArcQK-f)4s2zcZV|6$h zzRtiQy}vf(*s=S~8dM~UFmGDyn6l}O|J-W6ig-`I31yF=yEf`CVd9C!rr#w^{WlVF zzN&(O6LU(ERqG$1rL$PZq4QzJeLSd@q@P?keN>-rTBBh*w86Wk#v4pw)u(5-$%_C! zbjs|?X#sUPcI0l@rv)n%wSW3W7Cy3VLN;w{XO}n$;N6e|K(+ZRkH0+iHm~G4J;ciz z=q4eC)}Lc?6I(#vfdjK_C@#lblO`$aEPTyVe3Tj+tzpDUgDYSVV!rU)6DLQ1Rk6+3 zh&(}g!tdX|w}H!UkAsNsK2*~PKy|fhn>KA!pCjlWSCIne;^(57J_irto$uGUhf?$U zNcl_xLV1!Tesx)Sxk1o`F=N6huKGw4uUt7xE1B};wtLgjv?QA9>>yy(v2B>sJ}#v? zIQnYb!AciW6H>m-g`T=~gV2kdz-Cx1sP0}8A-+y?tDCb)4rQuXI3&hC{yU1Arp1)% zG_-=d${%qq!uvjwL7MJUr<0mI{)DRSfd?9-EQD2?_aYj`rWX0c;?a2noP*odr27e{ zMS90xlqOZK^@ka&lj=Gfpy{8j<@}Xa$Le=8@ea%J$L7t{q&M9D4Ng60zM=QcoX))h zE?yk_{953pJ$1FULZeQOjjdHk{9onKqkZ4z2=#ULe!_VAt{;mpNzrscVcCq4BlpVA z;>x-AQ%I&c<^mb{W4yTknNKqhHsk;`m6m6|e}CqYh!l>p1R|vpJ?!zC`qSyTM^mk0 zbCl#M3{zS5*c@>9NBQ|j)#RA*T;{P05Ex1HmAV@niWQb4YKfEK)#iQ`v}^4>!AlhDlU>jBli*oduxSShXEXfqZAF5F2;)wvb*~EG zN)Fz{rs?N*k!6tkNTdwdWXDFV7*N3)3R96^sifm_Y5Yzte9rY8?h=1Q+brHkkM$AL zFr_Ga$es&PQL3`c==nCn4{+iPO-HGf&Uu|UtF)Vz8VdFG=ct8+vWipD0l{qh*ot>?%9$K)Y7LR^&bTl|{G$swdj+N#F z=|@dmYgd8H4Rm$capC+zlS((C`r7+GaSyqhok>KG%5}oht;PEpE)j+U5kINKYIeXj zTR@77lCpB?kUr`i+j?nT_L{*Z!uW@>?v}VnjNJgN_o_YZ^B%_Q3&q1pD2EM0|SQs>2D=#Z+*xe#xqtDM)q8XY zXWL^=EB*52QM1RBP_=zq)44)0ZkfWEOl=*IHrB%E#H4v8(}QfonqOhnur|h5Fej&@x6NGHV|=?R|FTP_j!WR@l3JTIWcB^a4Cf_)_MvdI~>bV1vXAk}edb^*RJauG6|(D%BK*TRKC!09l@4Yb~2o0pup7t7;@ z9DPIym)`n!XIq0)eRcP$(b2lq;%7F$Of`W(aNacn=-+s6DChWS> z`0ie1+j>3NI<^Po8NT=Ot4-p@JsCn9rdmwlntiDg^EN_N;z8e4 zWfOI$tu~n{37j@9d(is8ePH!lU)72U1wjL(d{{dRg}dwU&{ zG~PxpI8DFkH8GRL5Qs16b0^~c4lH^5pi_W+9|?!%d~JQD2vA7+u(?#@$C~~=kPf9R zEI@b?TK^XOUy*aZxk3%k1Tq z0}xaZi}qOamtqdYaMoZWJ7%V+OZz7*opxT*-Mf$EceT|b4&o}nnb>WNK0ZqKA}u>D zkQ2dm=i4y{8&@5yp6uSZB_`-IhxPG$w^!fayNzz2u^i{|+)8!pcAi&5MKpl?p`-YD zPSqgOcna`DOoAV{;wZIv?vyoUA}#1A4A)KfCRM7=N0-j(fgJj9c`raoI0<4_s&nVF z;0L0J=If$OKm7Stb^5Va&l0a+7oNCRC|tR!^7+}q8ygr9FdH2<`8nb=5W;L~ie&B0 zszRyRJ;Li!-24+2Z@?%uR3QdZFV}NgtSe58%v~=tc<^)9ludW3zG8+)XofcGwLxlj zhjQy-k=&7^K2wKF`5EuMAx5g>*m*P^8me>drrS~=uQ{8CDy-Nd;BT1Qd*><9T<2bFtOXnzW0|}+bI~$d$g&e zb>nfnIBS`1_g7_f9==}Bx7WQxkCts$a4=am?{I#3nCXh!vwojy-szWAJl+<0oT*CB`?BMGk#p0*4!`t5cwtH0U1M`AILp?!eg6D;^oBRCC#hhLi7pA& z$fPnwSb+hm*R(cw6*8!V>a{$`$xfwneR_007#kO71I=#BMi&FOHX!IA7DyC`3Gmg4 zD8$r2#qBn2da|pv#U;q^8(NlJP-iNNB+)BlDL6UPt=60P_G260BnJo#0*_82>i4X# zCJiKksL(%rALH@t;hj64RJ1ArgEhl@V%njY~;RzCvxM#?K%BVE}&s zpyJ`2t3Aha`{Z)(iwANmLp0~$qLG?IHu9Y?Y%1Jv*{f6;A?Mps70cjDD&phk&JFJ> zEp5v?k4sEE${O^2OoE=n+O-qG;;*~a*#%{jh>%-9E$PM$d!gV5L9-QsUeNd(sAHJA zqg^tkzx5$u_2H5&;B)!Fg0j>ozDicq4Z5N8xdJT3t zYu@2khRUx&d2CZwRu*^uy!YF*ogp3!B8o#2!{K1Nu1e+HlRS-?Gf(|nBb5d7BBYm? znjT}d1mLfCa<0bnZBJ5d?;c8R3x^v~%p~IIpEu6M%}s-_n8^T0w1?Z3Crt`Wqo*-n zyf_go>x!WM`TYIK2Ik{FsO4f=!*{YllW=XC3lR<>jl0xXi+sdI18n77-RnNuL(nC3 z@;X0``{LO0p|C3>jh?MDe+fJDI3Zl==!)(z{1ncw<%SFC0aKV%&<#cM9wx z_u)gIu2<8WcHR@q3kBGB7fYRMD~fDqc;;0k;ZpQN(xAc;pDb`U)P>|36$__3^<(I@ zYw9P}*9YIbehqMD(}*_wa8iRb#7mz{t@P`e{?K{bHgH?52IaNogRD7K%sLdLr^&)GYASN+2T5>iqvA4VCP_!l7FM?l& zNCjJZeE8vQPI-4G!CLOZKJam*cVS_nQ2r{79V;{!KU`<x=OYN^5xGv} zS|R)KKXays1f>{*GQD-vp^=0<+K;p`8WmzDhVV?bke&z-Bqn-oabRHz3i%CFCRn;+ z!d~AeXMXUoQ6Ni$e&_%cQUupvP5i`MBjex6V0<+kUnEU*pcfONasQKrj~3tX?IuJp z$C(>|Ci*{C76zhE>`2l#yg-6Pjt%#>{IFpX=s2@jWpDrAOW@|vXDBd2`>O{BF!Z)H z>bl;q&CJa|(!TIlXM<^A-nj7d??7t;LX|`W6t42X;9$Yb2x*jN^Vg(hdHYb)c|tOc z7&%e_`70f)NWQ@bL<-Zmt+%dTog~ISb1xWt(_guAsCe10Z^XZG_p!RY>o6Z^7*^UZ z)@@=dEb%7x;qRHhx*Sz8TP!D*$=y#if)C=eI&G~=oxtmK{PAHn&h7n=+eE~~bO9l9 zZz>B}b34Ixh8&w?luA6Gus-Wo~vCzWY% zvJ2Hhdw!oj2gbv9x6y^-e;T2(Ie=*))FEw%0U~MAy7g}hn=c?`CH`VD5{p|zBpK0n z=QfE8^dn<`w)#bY;);ijWI_+bjQVFUnNmGDsw>K`!Cr7c3`o{Etv+c|vO9DFL5b?{ z2%}eYq7x9IrS6PRWGqd}y`LZu#5zZ3*Ez$!hjW_<7lpxVMcy$1I3OXe;2;7z|NOZ# zvt8)k%wlHX-S*;|j^G9t@tY!3hvM*}nP0{_96wGKvli>3fn+bhhKsn8b$?!8ID1wC zJtl@I3Ocm5%#g7m=V&8@o(JP!SFZb@x_+J8i;!s%G71(XHWc@;9u=XAO;*oCDDr^( zLsD8`SqL!e0KvEES$=-oGkF!S+D@7@No1mhx*?(d#2cB)I2PK`I~8@S9US(zY1eU8 zZRsOaA;)%h1HU8W{0>rae*|#cnj#?-jZh{-4paOYvdn-d z%b#3euLv;=Ws2+0onkP_(UgrVUet-hk2c~SSKcZ@=7?|+5&%r#BK(WI0dVmSbQVxc z`XAk$Viy%vShBtFGU|Liju8$=L9%sujjQF`TLiQ+t>ItK^GildpIW+O=ammHjU zfoWu{>o*?8tO_o$`#3>+4jd@B-xA=p2y5?qcbMu#UvtZ`y z!ZJ@H0()>dhx_=zsf8cwa|aT7(;+)Mn_!B)VD+I}gZd*Q<3JUWi+pTwCRSS;X=&*M zE{U|&w1A&E0S;&1remgFT}1=4>X1A{F!Btc_hVzzfJsrPitKEt!NAwuR}v)W(SQI? zhLa#VF7AOa4`B!<&o^NGD3Qm(A@+;`?kQ!anI5HdC!M9GAMzQ6z*vk~BD#((naOJw zB(E5~EA+QZioA1JpeY(tB4Zvk{H7jtL=dpQYVJ?9vbv_vg%<~aR!(rfEnU2QMNy3> zOGb<=5`@2qqO`K|gZGcX8^wn-yLp++nt#d2D42+xnWU~Ra?-?rz>+EJKs4E#3ftd; z(EpcLvDNu8QfD>0T#50l+vhlQRW`qy0h=iNPCT8#SFc`8-npMNU?g+_q&@;e5ke_O zHmy1&-Xu!_&jrX(%AIUwa9bf|E*nn;lkcYh!ZvW|x{Fhmyz4*td zUmwi^XOY>(abPFmA}lDZ}oGV%@9t(<2;GL6H%duqR147#KT z%t}1s;G3hpCrzWa;%M%4de-iDPxa)_n^Z!3a3d30`;>q7&XOPJKd-aAZrb?{s$Jw` zyLRuM!Pu~;q~0Q9S@uz9jy9k14nKivxec0dy1j5e!&uGQTT1DjpfwMY#~HUYLHou%6n>Yo$lUd}$zG&bzJ9%&KO-T+a}A8yo97RK6E0m;=&jvZ zUV0>39rud#if-D26mM#F4!9H-*G)twQdQ~b5~dGDUJ-A5}a-GjGlV|L`_*$qAW zNDvcxQL;)TJ&4qtDY>>A%Ll+uHj+`)5D{fJ2nY{u^7S-HCD-Qs&$JLm5-mAbX( z_Tvgqeqw+kc~^6W4Abo>e&IJBq0g~n&zDbk>cQ{g7oK-S!O2upjBWNyBlY~b^w5118&;CS{)y{b4lE<$NrrJMfcJD4eyaRU0 z8cy#M)yI1x0#_2TiU6ch;Rm(np6iRsk!oLkn~M0O{O;<`tCcYk522DG&`fC~JIXsd z+d#5;$&8A$?*TF4;X;2bxdWx&S>zo2g85SPDYjDx12NFa>8+qg(Z(a?;ySZ;yp+6d zmxyn(;qIiD^0M4qo}~r*zoPaT9CqpyR?b5dJ29y(Sd1hR(3f*s<*#ixtlpfDrjx*b zX|nDX_s%^c8L2F}KUm);vLRQ$bHcAi83ZMv%U<+9aU!;0JGJH<{^1Aa6Ojuy)Z-_A zG?335GfV7az!yAS@Be+?M~p;ehrythh|hR<0SB81PyVjJiXLxHpNQC4gOA&J@cP^nuavSN ze0LC$(idMP35L4VL4$8j^`4}}8)3Z4eVPCj6i<7{cb7l>gf~i3%;6tDe*AlJew)*q zIx=u|HrT5icH*>n>NUiC_sM$1p!N_^+~6yLY_07FDSl|CF@$=iS-H5Haq{QXe zt9S4JMCpjc2Lx#j5RZRINGIW=b$H&9&WBvoJxNJhbq0j6R7`FWz77v8Iwa{8eYFRj zqTmM+66(c&{~SpzPGM@i*+_d(3exotKp0P-KmQaQ8>{qx+Mpjz?j)M71{;uGVaAgG zH|-Amj6b!9OOm?fENWHFGd(oVOcwyhV=H8+E*lI&e#itC$t2rK58${NVFp6iN{34D?vgdZ^F8bMOED z$0Tifs;Bw+J1*?dFdcSG92Eafi~sqL{LgDAZ)@}a{&)P5()oR}M*RQ(Iq}yfP5b}e zzkDUVLh^qfiNDKy2Zu2r6m*_PXxULR51Tb>DC7)_W&P)pfI%D_9T>hiLi0HbF@g$y zU9mnO4^?)uN9Pc(kkzE2tSjy$o^jS|-90K9gKqZx|2@a*qewjOynny4M2r#;-DLgB zVT;zoJ0pq?aNW%TNr4u;>=$j71UcFM28vi?OUt-mkAE*Nb^hA57XSC-_EfKLN?w0|=}SF&aZSHwR8!C2E8hPxTfRL)kjkl<3jJvW+7a{8~+CjR;+@qKHJq3O1|E&XEdc%*L0iuJ22^CEyR}0bQIy9e93O+Qa zs71PL{Pufjcv@VXQOu|WdZDMOZd<9|3v^<9iMDJIb}A@5@pm}>9^e#xa60yVl6?=V zX>lBNRCf4ezI174xg!@Qp28l?_FvXRQQ?rvo7=mG3Z2@fP2)*uU1e|IiETmrtZ;ux zwjdtB#oQY(XEu!gpyYzX0}5+0yfQz9W3!+08d!&eV(w!_h3cCe2oaPJl6UXrLOGK9 z4<4jW1CMFOzFlzic2q=1I&|$XG2VQ{$b^zuq^dJ0>eWu0zhDLfr*0Y6K%%hv=^1Vj zTf{t9vI6^Xf|)O8rY0}BG+cvf$h)V6K2HqG<5cfqd%A{8S{hN057q1ooiDL$$JJbQ z20=ZdyW0U-3&RtaN6CNEu^?0TMTRVZ07;?JEDQDQiWU8tPs(XS{WG|C6}5Iv;gXfB z!T88S{kZoyt3(HAtTN^NVO)_X4bs{`n&Zjw!~MPna$NmgH8%^+K5tGcC}|-wj&roC zK7qk{HBAc5OmIQH2rdTcp#R!~k4VhW038-7a8)ViH+PEtbXW(8U`G<`&9p3nLE{vZ zm5mNZ@<4A^rZr4{^yEqZ=ILX{Ui31EkgKl=UAJys$(|mX|DIjluDUvLsIf~Xsh9P5 zx4pJ>p76g?v>NXW{rB9?hlktp+)^7j*gkyx=tY|~Ms`H*lP7buv?Nr{Rmt00N1^ok zQrpIpf|;I61xXo)Eq;)MIn5#;QNS0J&+=Ga8EzD9qFEim`V`33Kvf&x0!m0TGc%DY zK~pL!nB<1{86OKOds}xyi)-d^l6q9Qvk3|DynTE3;hjr7Y90^5Bp0Ar&!)5^xD`dAl=tnVeJrw*Rp!l?pqLdhn^{!Jtyq zWqe&JYwJ&gWPxR*L^uGAtQZ@Ci0+b!ru0T0;8Kz#Ju5pFh#`lNj-Q#aMaAvUtUAKG zR`b$D3qbobIQhZhp_~loA|n3V`K_!>q`Z%PL&n7i#&PQce0x^Pg?jfa6f@9R77u_5 zL?Ev_o;2wd=NkyDe7uE7bjkt|dkws_WZf-t8>fwz`FGq89?1WzJze$o)|7U4Bv;US zk1;wE82Es9mb{UIq$)hH1fkbJ2{{oXro82gz7(Blq8~A^WgdVnM;z9zQvXhH_0YtE%QTFeO|xI%ZrbCXm?2EI`Qb^ z!fZynM+Bvg~1FgC%ttqb)ZBdlH^G(2&yG$;UO%EFxCpN zm#a>F{6fIphToi%>Q63&!w2;I=iz+2d>o=_dWuEQ*I|L+ex)hZ_vl}fCWZhZ!`+e= z5m|4%cmy^uPElcwCW2s{`DvGMKQToZ&PL*iS{JlsN5>Cx|7ny#~Di>|(j zag<9HaDVd7^u2pK!Y4`(AAWAy*r60li@|lk^K5kn>=Ac&wTzUF=!D`$RnFlm@f5%~ zd7UxeATl%4HhtYXXVAcbs}M84dC#t0qR|7oK+F?F7;0kw?Aj&L=R=`WFR{!w1=UA@xGBf|33t52VHS}Agybe+vI3o~)v^Gd0k?-LAE z7KK=23`lbu3821uWv}LRah+ha1AY-`BS`Yu@PlTfScrR}j3_sFs)NvJJE!Ntvs1X- zefm_)M~to+azm>=HHFWJCD$`5YUKaSvz8QYy$gPNphI&cF~KL`QWyh+!eL|XW;4KHptUgnAh&BHcchcx zB&Ibm#X6z&+P}+gv;a;@(?(94w1_yuz;_E?eyFpP({gV2jH8h7sqPuaU*6<*uR^5{ zYOK-lj^!oNL*6j?1qf7x=0IuwN0T;ZqjVugx)Q6L^#cVQPd4V0`pIH(b--l9r~{>I zd0>nHT3Q4ZKpq9yMkT@JbDxtfZp%qPC~H7ApvS=E&5(%# z;1uPqt!?DXn^4NDNd6QPuphiTLLZ7GUoc<^4M?)Y%pQ=H{hkiO_{~6WMEUSG5zMqX zq#}@a3S==rj5m7jisRMs@uyy$opxChEP;#K?D%*dgcwHRS-G>3MNE9VanZw_7sVh@ zF*q9AGQ0j`X=!_Gn{=s+A`~SfMN*K4atmKm#1NHMRNzS!^ci8znIi3q%p{2xp^?Oz zALjFL*M`Hgi7}yo-PBKEJGzX3p|_^26mccQA<%7lQK!nowV;qZ&O}9^k=O#4TZvRU z37g(d`}+R&P%4H0Fl+!!u~z+nk_M8_dk2g;@JTgE3ysWL1(lHk1!1ncS6;<%hS5@h z3+qe`6$@8yTOkMB(Om>Yiyz3@pbN;c%Fb>tyH%v-b6N{pk4&B|9Po^5@O-_UqDD+4 zXwc{y0@85j*)x;X#f6T4*2PsE)^NH{sfrZgb5GN`bH}2A))3TzrOWiui>Awa1 zxAWoPNh*?Vl9RJ`r{}*$O6>Hyo)F9pD-aysSn#SAZ?Hym%+D~B z?{ScdrlwWoMiCH4`cWQ=x;u^T>ABlb<}Rg!X|Y*HTO?*Bxx-dF&AJ80>*Qd)W=(0-H^S(2|B4#q#gTz3+DwgP{igh+ zZdH9QtKp=(I*o$FBzaai!nnd%KkRLp2GtieTiBJBGC)Py6#s#*zC)YiM?Vx49DE>+ z_%yea3Sk0T^92X;a~Swr^DQmI9;7pIweRVzoJ8fHKHW!NZ!4$2!fLvs&JPzisfFIAPZK8z<6@x@7{-7@Lv0akcM9iu!jkXPEg)R5~nkwYw7GSz5&F<^g#oklxvj6YU z@Z7Z9QDo~4G;X=o3ZJ}z3ObI@_Z5iHvPBS*$V%RGV#}zhs;*(NC*}U3sJ8%7Olj>= zDyzeAl{(_x<>chzNI0<+-k0wl&&t>ZK{xYQOA{d*fAP(dIGYXreGj^<54F3&0;Kc$ zi^}<(-alNa*6KA-Ktqo@7Eb)n?JV#&+qwIDEf4Ycza!kIu#V>^f2FHFb84!ic7#eM z!gLft6Y&&%PovA8_x5(8S1wN5Uz|ctO(F}{?iFp|3qo{!+IXXmS911aG?@hj)cS(P zOW3%@h@paAm8L>vu?tPEZO2~g&!wh@F-XAjt2?w(5;#vHFJ6tpJHeT`y8(mxVyTPO zy+2VBMW8W}V)t4ug@@mzmQbvelT0QRDJHX#?|ZOJ{=^avnTLad7_D$TEp6uWf`Y)g zn^!?~&ya9e5iX(WhSq;E=IB44(Nn!jLy9ejpr{QTAT!xFi1MmWljy){rqCV}y^ zv%hd{5u%48DkX86hDHKZ(x8eEE>cMO5tSiVy2CUYZcy9y**NqI%B7{?7E5;!O_i`s z%ut~FvFD_>=9XN|iQ9KMw{RY3@~oJ$OF8THeQ8~%&{Kb3Dx}A*GpyJ-CdGs(y5vnD zA1QP^qWf!WpZ!OE(-p)8S&z3i)t0@{SV@waP*H(d2cKxAp-HaV#FceTQ_h0o_JK!r z*P*({gwZ;Vb1V*aS#{{WMU(wQj~=}Ti=M$G$$L;Gkx}yu4A#KJc9RUIN_*2hANdK& zXPGpJAr9mf)$ zlbwC^=FB6RpVAw^IPT+%D+@M^PHz{AXgm%8Xag)9!mmZ^UeRQWtty!)a;d!5haWf~ zHJPq9@(7|3AH%ATAH%mbam|Es=?$K`EdmPjd6DzPd`X`mEQl$N1TNYQ{~tRz!JDs92_u7lT!}HwFeP7pSx^$Gp($zH*kSZk6h01&mpTM$&bLR}t>@?|`zeh}(7TULu zpTJ9!0iK-fDR=IkU2=Yv|D&H?I}KP-L0GUZQlU2Moj9U=$CpuRTCTI*qZP4m?ub6O zk3>gLUEXIOhfu;#UqxF7y%HG}+13QLEj*JHM;rTrfgWlnG_a-YuJ2Iox5jYQ%j>&s z7H0Ltf6Bh;6BS_AZnyBTc)qii_2sN{o<4M|?k=rxkA_&?emhXEQpwt~i&rR4O1W^M z1c6?Upy>*rHbUSsQ3R^D=6cwTO-^mcp2?>aJw49Lj3S6*7?S&Nj6~ z^PQT$^4tBx70ku5dhwZ^#Q331^~o`x8=|?S=u?!6ZWu0>%#K}7-Aq%tPGp4rc@3gU zh_7g`XP3h(a7}ih!Moje@{C9HBR&JyO|_$45OD+ro>k6=;bVVB+-URNfj zKh9my?<3n}n=j1J9Xj?ISXWlUFW|n|sw16Njqh^SwQHl%+xG6QTXSM{qA%ZXf-_EYL1ktOK4SdU zhiImPdq>r0{@(d}$G3jBd;ETW;_dXylvp483zI~e{T39Nl{*by?uz{4=F>q4CR>6k zz#R_MPLgeg2)c$Q&YyHTTtoNaB2&|t3wex!JV9Xu82E#|R!%`-kC4q&gVXGTY7lh( z(TVHBO4ET!SJ0hYWJI-?CvU+lIuH`zP;bCh8}^!U#Rengd-T|lIPJ%aRwQUor~(BO5oHKv>O25EsO;J@ z7!IPLm2?i^08;kO-L(vkl{~Qvy+*sC@vx?TJ7s=L31vzACQAUB5k|M5Hvyz3kz~^w z`U``ch#pn9FBls2b=VgsR`lU06hu&+HMIpRz?-W5IwB&DY9ZF(*%?;RAt?L$^*@hK z)1YvvN)|YkglwV>=Si%+(1lEzH0cC9qUbYkx*^vQJc;NiDpIDx{Bza?j%s(J>_593 z2>qYb=3tqKBZLMc;CZlW$l>j(oRJXE%BPap_C` zdb2(`C8dotCi`Z^N0VSwu_s_!b-qoV9W?RNYNTl?Pu4TlsIGwzZu9kk1*)HP6P zYkcL{>F@dOll`ny_tJ)!T8A`V#OYp|*1Ltu)Jv(C?`OWPr!G0H*`zFqoTtW&VV|~7 zxWHcE^n7fx5cwWo?Ezd&#ART}qQ`lW6C9Sb6Cm@9e;dgsN0k)SjCIGIJ=1pbEHTuI zE2)>hp0QW-C^zU7H1%}{yZx&L(9|5Cv*ZYc4M>!O)q*cO#3Ar8WsTg-r9z;a0p1y& zHhZx>mggjgLe-C-c##nq;Ygfp9-Nr2QM?c=lBgspuGKeTAP@OYQSS{%BQ0mOYCH^` zx=n%NRx<6lQk8zO71a$DcU$wXO+kGc5?yf;y=Ia zfXr0{i@f_z5iZhe(*|a$fwhao&Xoz~J-k{y+V&fkGWS$=9^sK^hl4>obj}3dn_$QZC#JQPq0F3Q3DRaWwj;B>9wZw#Olriv3S{0v&u_{+! zO;zf&?a60Ju6X&$9=S%T@EJ7jiKAe`UUM4t(rV+(AJYKMO~HqI#l>twm( zseEB%D^-w~wI|Po$^uaQ%o-Qd(LvfA9yc}49w(!gn14=*@;ont`Fn}RoyC^MQKtadB3E?luE%8^QqC?pb1P_PA8RyvCafV-A zwS+#@^Ie9JS(g_H_=k%m2F#XRbnGJ}N-^GE+m7Q3YFk!TM$Bbf!+z<0`}b#)1)3T* zmcvz-J7D+Sru+9e1N1I1Q9VDe^m|FYrZQrLz!=m19)PS-F|hpG?d>Me3}j!6shFH~ zgUAOEc!2<->cD%VzMk2)w%rNMG7AzuY!Eq?KBvXG={>-s#B-Q~7<`x2e}-J=^$D{1 z7f}0+cGU_iwa$*y-W2uGNLj=Ye@tN}&-GgB9-A)n9tEvQG%!LTDF$QmMMf2MG%34b zMxAr*rE5V0|$e(hWHn3FFW!kw#&vkbN`KkXkWlLw2*`17o(9l9m z4?v-ZRF8)E_&Txv(1ds*U?Rn2K~toFv2|4y7YB)o_iXgSuf?0z%|GF`_YBx`%!T=m zf^Gvd7%L5AO`=+~&G^u`bcp7sfXm?ulp@3H7KenbE+|kP`#hXD(1L|u_qBD@tvu=$ z0C`MAfHZf2^>+dkT)(}Omo`ivt0aAH_FZjFxv@e_f86p|}et!fL(NQm!C$_b6i``g7RGbD7W)*ENQ zu%yD!h)t3_kZv@6lU&{%d89>%R}$6}AM0eAU!l!il^5nuHvKiIn<8hgqVoDgfGZ#e z1e(ho9sNP;RS{l8AO_-L`GftGR)ZIVq89aj#vJ3E`qH zZD+W2wcv5IYJXmNf3IB+(~wKw?uB{y*KYyQ^|8>=f3l&<j6=@d)YX z=w(-L(qMG$+t&~NPc<|g+@JkG%y4E|U8A!YJRcV$D)OCxAtny}VTZ;GYLnU@!Jqz_ z#JD&S_)YeA_SAIK?k+CBY3bSnh|2cXXbrJ*i-d{K2nPp^LVPu7kU&hA+uO$mxsO+f z$W$(@Kc1ol&meN1h3bKOrLz`bU;qOn`|WAA>kZnb(-qx zMpatfyLC$~&XLVhmXkShe@X2z!y|P)muHiMO`i;o1;GHZaYT^$P$NRqPTF5YwsPC&T8MXaJ+^F<@FrauV+)om281I z+t<8dB?;HV#78F~HUwzPA^4K+G1aNO19DXHJpBB8qf2Rqp_z-z2bF#AT%QSu8xdD( zW-$i8)m^O8Kj>zjmI@PmVDZzoj#mO`kUzdUDJCYyx{gu?ip1>&a8#QEw{9R|*$Ao_ zGBY#I2BZQ-nHZ%@19t2X~5MH+Bv&r}AHyD{7 znV^Xqdl$O@j*p8I39E?NUa?jDco&~27)_RCT3dVqp09UzR&kROpb_?pAi!>CmJU0&KS-HvzyfgaTeol@pxkUYS&q_b{E_#F@$v6 zh?N*;K>EpjgT+1u$=|h4Hwz)VwK`|C$>Q&c?Y;NPx77gFmrN%nGh+-nPQ~5cQj>XR zd8ZK^@r&14lyf}1pokT{tq8RZ+;%tD#JqUFYRvxl=j``bVB1MTt0e616Mu=YVa9yd zIlZ;a56kv+$nfXtr54j1+hopD9FlK)Hm@ua#h?&MvWvHnsE~wc{ymAgaN4nR_K^oakI>HpxHW6^C|XHM=Lt(DS#<%Ayjp226&I<^YZO`;MOT366H`?nEu zdrkPGSIxT%Tdn=uDz=AW$R6 z%%@=z4$DBeJ+qe+&_lH_?6+6p{(1TS{X0uS>khhp+O*z5uh)+vhgk}n_kT@RabU8e#Fq=kgAwktrf6r*rkiz&->ns`=( zMP$kSCwDWGjzpuOHNWIBfJX;SyYssiP2Fgl2t z5=iAH@Ep~`x@_{F0voTwEOc!QwR|qRXIh@z`H=*nf)j|*W|Aib`c)I>AfeAWwfUc} zn~aRC@r#v|mG^z?b#Tt6HARY29K6nTVOLcN7&4sb^13S&E=dJABz_ zJCh(NXMtOM{FHdLLC>aajQzT@bRTM)7SfZ8jvYB7lDsrJurhXmE z7Xt28agp^^{DS&M-L@@aa7p59(7V@jHS8lqKZmUXjkI6K+Wn;e$0iq=(uN5V`h;6a z@{`V)<|a9hYH-RYoVK<7bXI9?!Z>@cYjY&4JUx4_od=oHLaeQGM$f5QS}#6+>@49y z&lb9db_Q?SXw34yZ?dXa@sq#4UcS8f$aEL03<}*EFmC4^V)kO}i*s+!U3(W6{KIkJ zlPQK5Dw75$B_)-vUGeExw!sBI&b-Qs4`y$;)j&IEYCHfw(~5ofTvI6PQg*ZQYubx` zhVILl&6s-KeJy^LsfTBMif>j2-RY}gWs0RK)qA38Z?_-w-)S~c-dT-FgrDdzK>LWx zf*Ut(FcLA|wD-GX$z5I(M|(&JdxlLo?Ka=X;X)6w5j?-%U)SG^fS2vtx2IY!0`PFKzZ=s& z-&wwAPv!CVSoLXp)`JSC-PpmDSdp|Wh>AvocTdE;5=wMQ$IVR>ZhiO`nftIJK5f2; zG@6v+JVv3W*1?kbbEEIvb*48HvS&$W$&x-`aORhP;()nEkjJTncuGCEm12qM?qk(R zovupf@$YcLtydCgekAQ8?NzU-ZWju+#t=)e*&?-ZKMl^4&X&E84&wDYO`r{Jk`YE^u_e+cvzL6#kh4JTu0!HG4K&m)QEd|l|< zpKI5@L(^2Z_(F~KG3XS!u^BIGZW{*|@7F@Ev0ijR8;+v~xWSiyba*|R2-DmIQpbbs zlQ!u2W)wV2@2_gr&&o!$!amsYY@f=V@n5M{9SOjPK^wdSRukp=CZmbSCA7HRb3FZuQYEP z&Md3NOndO_El~B+2I9;sDl3(PDnJR0EUfdLhgpe)l|{zJ*L&Ie;dn+fOm{wQT?TTe zeSUtXRp}Th&jSOGmCkT&WhLh=Tg>enDU>$a_0n=Z_ee7g2^^-~9FaqdWGAf_tXj~i z8ebD*Vh$b)C%R~he|lO%db(BB7v*8Ye4Y&uNla(SqM`M5H((^R{*bfxWdK=y+^xa? zoes=j3QeVEWG-O5%~V^lRe40dZ5}Cxk+1trcXbAaNLDg8$55Bm@A$dS9X>5ZxN!LR zb8yw8G}7j)K?HK)EN&LOdGqERMcFwZM4x`eAhwTbr7RGW@&3kN&FfNTy8LV!XWFml zuLV>+tC%)qoELH-i;?6{Cr~jD{={AI?Pr2&BXqz*cN`IRG%m8z60v>PUjHQK2_~_{ z-!Z7eh@9k>FqdaK*aNIywcjoc@f2=5PTMZ{s^e@kVMKi8{tRVsx=BJhS)axag?rQ{ z^U%uJn3&}tlQ`ZjUulz&X8WDc6sH|aEG^ZgKM;*M<>vLWg`{6D-Tb(WzCu=dSX^xW zV~YMjIT2|<6w2VS^I<-=__6z-Dd<h>%cR5c^V2F6Q zLz0p<`hQsmO%Hd!=-qZkSy{c;QtZ>`Jllfv^wBRh$O1_7?*~^ApmK{>2~^#68Mw!% z&8ik-IEO1fe7MImaf3jXp%?F?HhH;KglMqEDm-04d< z{~yIP^)$`-^xbq!-71?$2Yw%DK`ThmM8*A`XP(PWpFaH$jyjvl_uL~C7$ha!p-H(N zC12JGZ*>WUrCrcyWo2(35&hPdyLTE$XW;FerUgTf??ghD4EC(QH1BoI(SU&N!Qm0o zCda%T&}D0xT)X9`@P%LgMIjr)#V=`Ujf`lepL!4(9~iEq)+slPd4mwKyuZGq%r0;0 z3p?6nJ95fH?_S`diA|rkP?fi0;iHgON#CzqU3$D8jc9;Bau=IED+YFt@i<{pv}-2l z_8IV5!FQiwSdPQ7=BJ_m70`;^x8{l_@6v$()F6v~9k>+dpUXQ1K9O-jtgkqJ?~|ub zb4Lni$lB5pO^nzxF;fh4087L(h7i-Xx?`uL#|3I)a&pAs?}{ zt;-#xA|NDAdH%F{OOkAMUqAg|)`#br;X>cCDvZfdq}|%;RVvG73vmI)(qlW8 zvlY&dJ5|g5eCp!xdLMqW@8x`U>btjZ$INzF$hxOEUbrH!0z$he)uXz)`aINb)c$2` zF#sq@)|(>qkybp$i6UPS5FCs?m$)?&AE<%W7BkxAmIM8l*`bb$hSml#r( zeMisFFId7YJSA*WtaDa%Uk>%%7F!8aVLrq;>@4RlIyMa;uBiXRZ%r+JhPrpLd_R1K z?k>4M3!bPxGQMK0A0Olp|D+%zCMY7VFrs5hV4Uw#)r%!rqxOy;yl-UJuJeW-x;-J_ zYvYaeAGc(yg%~J}J(RvIZ|p*iy0FQ0W49dNcE56zwGB1RU`@@%x67Rl9XqDVfv<|} zV4y=`T$EGb#TgXwUYVJh+3w3(X1Fa!UQn8=KelPNtJAPEHklvZzgHura5Q=;F9W6S ztU`J81;UkZ_@l?kNg+t$r>ECf9H&P%hb_{N`$Ul_k66|CPt*GHmoEoVZ{8H!-Bvpd zLk6aPnqoff_r68x7Uquo-E+wOqcYK!3Ck1>s(r zD)e)4)tV9J^RyT#sHE9(SnhXV&3cw z8LvHiY^cYC6R9>Gg19jP@Homt!4%$GL{n_~RJJs6_23qN1F#8fAtNlUt=3irVRyyX z)OzB?OE$U6N=i0-M%N#oPg;K)QS$gP1WISV<4hmzp7^KuBFy`F4QUBKG#g8ZI@wtG zRNtA2A)DN;w%mP=KSicL-9*Z#*JIASU+__4uAK+&FsS)1ED5HE4HS_ioDVOlc|{Ne zlhKGL?k9kL@U5V*iDwS5ql!!%a5_FftFmpMrUupkh0P#2nbbnjH`BJxOmw3v@q6&V z5I>0+3cy3oC`xZ`I4OL40p;f9m7)RAE(?+aa?7FU11fGHSU`xq@=<-_z<@g&kQ4k-n%b3(U5720 zYxLmUikU*H&esVF%ahgGI{Pa%>&y4={dl_wj_ra}po1aEP#1^sS$TDwj!@0~@7cZ1U&;(xbL2a(IprZ%i?=e~QvdhGv*T+`Uu_ru(-I~ZAk zgyjIBn8R5?i3&>?n}atFu?v4Z?gmU>uEvzlV{tB!esp0AHwk-Hr0T6?Oly_i&-&Z03@Bpm@O*h1rP5W zO%}+(q#_aB+1ohwsMFKf_o}Zn%T7#hC4L#;s-p95UUu)^ zw;`t*$FUg>j##Zra-vUyOl0zTgxZoPf;+zMnu;~5ofBT0=9^t``ALBz6!|>&_xg3< z%G zTYavpE8coV{31UE{>?ApR*{vR{fZqzG5mwBo$$P&!Z5v3SV2D_Vzs2d`>ao2vHyYU zDXJi`eUjO)zC}gXE@E)PYcNh%AcK4T+Wzyg{PS)P6-W|SKjkg{9-T60z z62-z1d;yC&h6H9wn9fT;JQXMWu@^M~h)wjPhjH(@Ir*s@ZP^_oz>+IEpDuVgRwLJX zmesAu$VhgDF0Ay8)8@jG>*|_zNFN*^?vp)eC6j?#vmHBrG*tCRVfupoLGlEg;dIO=ZR*5h}p4OdQj`f5d4nvz1c7%g`-l*AUg;`!%rn`xp(kJU&GP z)D52b4BZ7-(i~!N(ed2vw;;`lcyM7?<$RGm0T3h|;h^!Tx07_>iN+u+t#Z(F-|FVZ z3D&_Wt*;~u3u>0ht+~FfC1I{aQaY~4Job^$A|W<=!DCj@IjTS<*U|ftxMTZ9U)5n} z8$;Bkvo~pA{M6pH{m&O>+q5h}sS1n77tRT#hqU3`aJW(KG#MO0Eu)K!%-^fS-4{h% z1{kR!a&5)6Kif!QLp9_n|MpXD_Es1di%|YLcL~yNmAGojrJLt2ntu-Es~?)z{5Ajmuk!s-X{`n} ze~5qo%T2L+$iIKw{J*9j$NWEktMmWg|BA(bmYuWy!iCJoJDD?vhnfMSF|q(AGl(h4 z8G~&B9pI6ze#c}6;XLuBd1b4W{wn?^ zi%a@Tt|cdk%D&H=^b8EpQSK?K5gX6e0eIp<45E|H$hBkym%79D|Gu7XlpO#{Mdv^F z?!9fbAWVzUdl~+4Im=#>_#oohB4+AOK8o}LL5M(hIUw3fB!u0>(C5wP7ZM~YH;t|D ziEa`mDE{6?!QB1L!RJq3DW-UXsT|DF_W0S0dM67IS=gOf)2$>xt=$an6B}2I$?5%f zGF$z#a#_+7noo)rL|TayaWQ^L(xLJ}j1z6VijqNCfm%q^9!I)`S4`lMCJ3mdBnHng zD|6=Rt#p!A9qv-@_~$(o&&Gd#G$xiU4&r-a9&QDaI4GluGtG2e7V!N}$n<_f8M>SE z?YO4yzrQj#LT|U&*&~`JuDaW6+`7_U5&_8jc;e^1ZszIi>{>|h_=5ro1^wrT`8m2u z94k!>Vz>_Dd#X;1Dg&ky0V(t?^Xy#5^XLEk7(G5eVT;72FTcYco6le>{#lsk0c7_W zD9wZekY4ytEYsma-0eH;-(Tx$ly$55T}%WUMCI5#ys@KxuJXh&Xsas8S;iDeOe~>MmOR;5PNGPtko9jqNX37}6ugiZdxD}UKOsN8V3?fnZjGRHd+Op|y2F^rcIeLLybmkPEE) zDEHs@*z5P_rJ!M)ny=t<3YtIz$J!44-{%eNk|=hx0$SQuBI~a9Hw-V~7S}vmw7T2N ztVVFL&;p@$;to`$h5zq2%jKIlE5+^jO(Y3fx`lK@N8P41 z2~H=^-(|suG;f~Gw=TlzK=a3P%b|Y|c1cMG*|ezgrG@K8U!iJo-ov^0&yT5n^Hy2g zBdhSJG=>~X;fdtZ2W6L6RvsTQ?%(CW657>V91J73M#Sk!165RH0AqGDFH(FJi2$X) z;gwh1m*Xk?=SQ`Tk_P|p2+G5m4LcC%6f_Yg=1oB(y#OwNk`9WU`M)(6XWD%I8+LGX zXTty)gc@kkB>upbj<}@wL=BZ^h3aHIgUw;@z;RS4!M4!=We>nT}-c z-AtX{{lDwPY`J){jiS)3d$E)P$agt3rE0avdiq019GR8V0E@8HG1F!GB{we~6n9na8s zz4sz7il$z~_wD#yKS%NRleLNVeygdt3$`#q{Mfj399J7QZMun8)V~`k!~gsoO8V!s z(1?t;&QS3Z^B~z5&Mva9e>bQ63kF+nxfyn@#N|JTHBqk0;D)1t_U|T+jSJe5CNeuw zV#Uc`!N>@IIzA})&Ps057(J_hm!+<5wvFRQiGO+5j%5Q}+yZ5h*`B9Qo^pk zZDQmuI6hreuBtE5$jqTb8(+46Gj=R=t+P4HP)b8)Xhz;Fi_-5YdN7>&4(9t+Ul|dK zIh4B7!N5a^DX_E7_SyH}RdU-x?dHSa0~97kAwu;+i{?Y8aCAzK|2+){4s z_shKvS@G|Q8540Cs19Xu{#EyF|5lUY&1wx+G*^`W{iVG*{j`UOqWXV7IsbW*{`W6p zO8?)#)ckS(zxr3ymkj=j^h*q9y*GaAe{Ze$2i03@UUJv_cK`nM>r8-oAq%1zz1DZo z(cPS7R#tskivo$DlR$sMxBwXxChA*Ubyv=Y`2@iV{@&5|mltAAZM2`x-gCrN4TMqZ zkNxW9ix)`g`!w$s%3hwlAWZ@Y+zZ<2S95(-6Hp)kLB-W7NAcRA9BUp%`={L);!63p7M&8 zYdJ%vhrIkeJFv+EBvU_nlhn=3RHPU4LWO%Ku6f|;V-V4;*Obj_*vTR%XpI^3Ib`8V zVWAK@ut$3k{)KRSxUC8)FG{9GENB9sHMM_x^dSN_#F;X%Bk5o7PqFJ}&UP%~EW{QK z1E%iw>(ue#LF$K2@?|%Ym?K2M2zAuAOcEDW_b^`!k#0A3^J{=@qR(any}eRH{HNSW zq()HIi6jQVPT_KP_MX2|Lj)w@YZgr<9DamBw209G7`0`t2FeVz0Q-ZRqb;&mDpD|v z5Ly@!d_jswMdw>F^ppN{^&+{5$Y`Im8-oUGbO?C9c#+IbunG9a>57}tifzK&dt}9$ zM~LV9PT6eW)`XX{y703mpM-gCequt&8aGx8y)%4I3xT=NV+BpB$WbLc6@nFbZd87y z?9y!A=pZmc@@b@n3Aafo8Rx7U$n4V|BL9|{hj9#BUw^fJRfvHy1(E0~h2Vf1{_Lf- zBjVjeK0{d8s0`W#&Rzea%Qy!Q1qMcGkSdgLGjq481}+VO<{|AA^RD?0*AQTFEX)KN zX`z+o{|lL>A;2DZ&fS$s6d#~L=5C)VD%vht^3=F^gxA4!H@Zjw#G30(RDyE>z2h|Q z=H&Q>y3an9ZomQ(GMcq(f32&HNKaJ%=5*-J%DMXb4>hl*{_0=#UG3g;PFy56tz4bV zPM$t}`u_80oPux4%VTAo|LIk->(xHj)QF+Rp31jc5UVeC#wrX(Dx0Wc-Vhznl?(y$H&&ohj6}`&$DUy zz;%hNb1JsKoJJ7u4DE?nP7&TD-F$c+J?WJz+kB?YS$Kbj)%jKPeWtB`tD&Tk!fgl7 zE-PJO>Lv2KW^sxtZIxx5+w0e_MU)o(lK!{L zsi`M`@Q9u?9YNl9^umNJm15d z6)B1pB310w#ApqQAhQpRlL&mIol@F=^{3ItUK>e~+}5qT1p8omxRY-5=S|D-oE)~^ z;`t=W*8AF}WeGfb)5GK6|9kJ_Z$CBO+OTfV_weqAR;WIiu=r!%geBF+7>-9b6& zI&fF_rY`i0qs?s`EfM~zUd%u`CJG>p z15pzJJR0jx(8K!;$s%>v0J_RwFrSui?b5(yo%LbXRPUG9-^}Bj)UKo zdA)X>bet7YAQlxc?!b(uw~+^y+golAUSeNlez9jK+qYU1H}y8DH$QYK>dTjBdQW#O z&>d#d_0r^kkN4gL2<@ z#Vn5sK!oza?Uy{hnVl_6YQuj2H7NJ!Ue(j!a@FI{jI-WeGfT{p2TB*oSA?vddV2oO zN{xWRM#SdV*(hirk3v@J9TrJiYo1@t(5n|sG{*MpJfNrIjl_13r769(K)*bC$oau^ z^H~Q6%|zVaN?KEzsxI<7g;$OSMTD^5|7-Ft^pdaHj3~nY27@!`FDP7*w2dEMoH5)_ zN$*nsRyv5-n&t0^sJUzA^Za-g7Z0=VC?P}{1?(@fiYcr`Y7DH}OhHbvn#%vku-^D&&0&_A=$E8kMo#yIe_o$@ESA_ zhv;TW<(Foko;|(E=Q_!@kEnFN(YnMlYSX4Ii)uAt*swP2w5xVp42Z2rR6nygr30Ox zX!2NUQ7<_(gy#s*;H2?y$fbYs(`$fATl}A(h?0M3ZRC%8Lp7qrQ%=2w!(SOLbT_gp z%f!5m?&GJ%M&HCh1Zv`1iHUasjVtp~J$yQF>A?a5&vm3!T=jTOXZrM9-cOt%CKYG?8s2 zLXw74cw4M`2-&=E+&x&w^N*@uzaAp(W%bEO5qg2DgE`!69|PXTmJxIsnWf(}7E!x> z|IC`~J`6Y0S^Jo~v!J{rr=wzBnT6G&{x+Czri@H!N<-q(GkMEa}! z#|;?SYCk?(ax^u5*X@Cv1lRA~o4={5AnQb4B5~7CenWOTzIm%U>f?~N_Bppy<ttDVCFJ~4(kg$Ub)>jzJPR%@%{6-o3^l~k|*|qqvIx+m|UIzk!Le! zrJ@L7rU?>Es2DM55N-50{aeuz$&>vn_+8P*l^*{IYzj}iF|a@%_Kuss=HnPu`Hw^P z-reP%rWYyqa6r5Yb8yuU`S9LeyFSGQgYm9bdWZsRII)}v-xVdk)%}8m#>ws&M+tFq0&dtMERjNQ%$ zQ~UMlj61v9(`*DS4P;zFcBo}X!6L=wq0}Oas(uV z5F((m!R}->DlBVB-!!ZJY;OG!P*-#=4_Wzkv!z1g-otvBC@@F}S`2vo_;`hx!i~a` z5ffSvweuv#$Rb^Vv1m!p-nOZ&;+3Yqs>3%^yyBI+$tBrHG#*dLu_;64#lIvjp0^dQ zOH?r-Q-(&WtiNR|KY6vCV_f?-?b;0icH=M(-c#Su5CMW~yvLQjO)$5pxyruXKQ_K2 zAo+AsZF2OJ3WPF2IEuy435t6TGI09Q5XXV+D53GcDOL z_XA`=1=b@2@nR*5!xjCq5?8(*jR?JwJYn4zpWMhHX0e9y?gaxGz}{yfG-ur4KA!X! z0SmRSIpePl@(YZvEhYwE$fc)4z1k#%ZOI z5gHDIMWIu}h9`!s$;ilfLM4bdr}2{QuhmO@T`J$xDf!8Tb7I`E5;@PtPdK!5lJ!X@5D6X(V_42aDZ}+^N^5-Mi&l3ghkX zpI;aLHEl4#^8#Jil2d4*YMK1rRjWGe0(GGw}6pMr+^oII|bym!a{l4 zrfiB7K|gmZY{UNN3L4AXPZK15VE6LdTB7Qu+gi?rM&Pgu;VP|Wif{Zl!c)y1_np=uwR^n?O{_6(0fd%Aaba_-1&krBBZkKB*XF!4au9?Dh0<(0aY-j{P_XV zu*{!J(5PrCg(j=0fib}6gyAZ62{_hI4@TFo#l}J>6)8d&!b%s72gDN> z^v<1~XziFW;LEq*n@5(|_j)RV1K^MY>pN;qo-QITD13t#XdKQhw@7mu#zIZld_4q7 zhX^_dwsxCWSu56Up`0 z@faXdGWuf*4QFo}?rXR`BR6|1&%ZU2uw)U9?2_Gp3|s6h0xty|1JT(_wac)J7EDt7 z+pB%|&-bT%dh247&1NtL+_taw_FfE;g_fa_6qAg^eMN<2LoFqQ8`!hj!QX8s8%>P* z!KZvCX~E2=g`68Vfw~GC7W8mTWXHNoA=2y4^yuqcUOGWJ620b4MbojEwE^* z)lvJ{Kd-;Qt+7SC>F~k1ynZ7|-P_5U6Xy_l931KSF-AjJK5~F+e-ewL$5sD$Q|QZZ zb0OMj2l^ybJjd5x^~#V22b z>`JH@rUN9@9_v|Q$d)Xm0VF&M>opG~Pj5%DLjd83u}F;F8XKs+Y`(1JEygt?)NUm- zUwkgrjg9yk<1H8q4$8L+EB+1gMM*q<`}n*vs!T8Hn%-K=?tTDm5DP)f52CS&WCjy| zNo3rV?Pzjm^G~_yQUL=@IQvboB}vR(&7z{)z(FV~Ly8-1=n=6uo^|PUrK!}SI{akL z*Q;G!ozB#d2snr*f^{^TT|cU$2H$o!Q6Vp37Y*Z?xYtZMGPZ<#FeZd`;@HNr3Y;{E zq6*;9Xv&^4hJdm;2&S5?O7-TCzT4H*Xw&WFc)17xMrg>>83kaUmasS!dtbbnwlpV^@QCMzlGK2AunYtp>j0M$Qp2l#7r}H6-ey5o#kDC0b8CM37b?V!)x?SjJ1Moyyzh<`y@zK>lz&iyJI zSHVxzW=XZ7fToEX!vyK&;PUp0U-)-+A=0R~2Q6dJpWfiU7 z3n%T%a+M*KAPLVx4ZjswLo?nD9j!pu7zns*?bImCiPBzp^gh3?h< zNT6jA>Li$xB=nt!LPCZ^jo+lw_X5I{2Ey?xjXVH3By_Yj6i558%MS{;qf2zANYj)C za%;q3r&x2V>|>S3K(&_=htiSup$25am!qFOfyq5EcD~?fK2Xg2c+A_=4B0ms{{^MJ zkEN*hmBiUuism@JggL2&4pU)#SbhF3YDE5_{q*7FX^(bd!f({oLNqMN@%W9%uk$Dp zh(=3Kgb+PwBe8VWutU$Se#H5a1*UjOmf(WOfX9&4&-6N0@8`CX{>$*wv?8h zN10H>a1~TR?Ij*#1qVAYx+u4qGiKI!-jLx zKt>_YqS_U4p0$(9pC6+>Gke`29-9>V9jMk6a~+;6tg_`0GVaGP`A3b;EbhX~*41C# zNWph0VhCiAP4$|Rb0@8n9FAv#oA#uL@4?VZE&#qo} zZ@fsNa_AyWdcE6E9u;Qp@ThpVW_(Q5bPNhbedA+^3C@viJqvMkRXGSq}d%s1SL0QON^`LK_u6S*hWzgY5;3{_i7)sc3z zsomM$)9EO^9|ai;3-1Oer*3>ao3iw+n$?rRaEL)Z`{eg_pw1big7>kH?&~^awwQ6~ zOMzjcm{^*Ctww;bWb-PmGORo3quaeMCionL)}TAsq8LXKm)*D$4dnw~(*g?ertt5n?ur|ZIe0hShUYx7Q~lL+vSz z`&}0Jy(Ax?s;}mzxpC{sV2=Rc5Nh_pY;!PrLYFnX_yHLZH567hmD}tO+|qm6Goflr zx|-9X@T&%{$~KW8i7=bR5vLv67=^#p1&d>p1^aCG3+AFn$4R|h-I zDL}=g>*SP77b}O7`jJHw(fO?*7FObJAsBqLBKi)y<1mK1jvCh0 zSAV5y=L!3!yfE72C+;G2UA!MgpJcAIJZ)aVXSRmq;X+KMEM@K>AQ+GnWzsYcPiJdcvv05sU%qPO+O=D%@VDb zzD^2BKHWWpxo7#}Nl5u(urlau^S`J;;nH3b<%)3{Q=VgG9|qml+W5+AaiynCKes2e zU1t03dN5yX^scM>PWoH~i4nsYQzq4JWwiA^)W=n4rcIcz2+fC~-GJY<@j%&bS#gfP z7cW_&AFAa0d>`eNy_QjJMqOEVPC&Q30c~bhej*hsrrU8RKh90nej)UyujrbBJra*B zL!R-9;@l{HnaN<2L#~O7&K_Ib4(jGu)$!Y=o5AR+#tK6{rB`>-YRBnKv8b<$Iwj=1 z{g#YedfC)Ag!41jzXT`pSr>N*_kxXe4@0lb`1#38mZvaq|6>Y|e02YT-Dh}>S$Acz zQoy_qL!?)9!x40`1>Zy1gi=CU?1koB^DC_49CJxn5u?GwPq~C&pgkV`TZHZ=x&ip9 zxvyfk7CX2o-HanlC)bo<@lVOiU8zyEMNUQg4ygdAll%3Wk>;LEW}-T3!;B{nL;zNj zOWt3TP3$}vyCl$^y`V!W$?&rWJ;t&Zje6shCi-8|OpY(gpf8U7$d3Ka@5a%mQF2jF z=N#G8TMY2fJhYv*WpOSNp!wsdRYg_zVd%Rr%bAh}o3o@cseuy*pr5Gv^NBMRa~dOw?s)tDc$ZF{ z_nIp<#3dR8PQUtb0G~VmO4n6)bytDFWOW>!e!^*0%|oHS zw0EQFRk`?)N>jfa`ZntP`8Ql&6kU;v#fanM><^p%2C7+{>yA!PwbRh0fPbwe z;b>Yj(&UM5v|Phz+w$^lbSG!a8N4wh@L^@nWcOi1ht6HS%dcRWu^aYE-DaIYfVGdx6bW#l_G?THBT4dTA|XBqXB*+_8JX%Kk_( zj@4n#2-vgi@}_x;+VEu=@9@z7r8j2-4xm}CuBneEs|MV;$yPAln&_677K^@hI2m@k z$Bez;bscqnsZCbGd%%H!Hz+1YI8z>_iDIAm4TcLQDQt16rxZDrJZ#=d zRcrdk?f@r7X%2(6w5-Z~AHGt&ajaX2a6?PF%a@;6yp@*>ie@V_Uq)j**GGHS>GX^I z-?&9*Ri%4AcTW$0H`ZmaN%yQfj?zt0_nQTe^4;uzRs2asqEnyuf|Z?IGmd6Q2**^* zYv;?TjLrT@tsgIiZ7PvpEq1)hKS%Md2L?D0A8)C@)YJ?unwK*oUWpLdEH zgdo0xAB>WUDR~`DL#l6Q5PG{Wv#MOHqJnE3W;WK>%P-jiRApL6s)jDa@2L@2$5lN( ze_C(ZJ+`rwp!xdx0SmOY(%q#5jjh-mYj~`A9loaBop(zIXsCGcM~*ht%=6`E=aY#r zY?v*W;e{|MJSa%1A8WcmH}P_(rMGCw#)S=x5R}4jpT`#+moR(o#Mu3(P7Muw9r5L& zY}j|s;Ev5Kp|Bll=Bg^!?_1k*_%g{9b-aJii!wEDRBdNXc5jsF^kLfQ+;4e?N|JKx1yrcIW*JA(8J-}|UGU1d!!OVq4>6dPG{Jq5~2|9MpE?`>J3weT97 z!p^OFoAesSVI=bMp*U?X1ey1(6VT_+@6+y;+_K&CeRt2gDfe}wcarbB`|R1X_n)2| zzU6bP2aVqkEHqh=z%d*#FG=t z+wSD72Kbj^7F=5|E1l&1we&??0we%&1=a z+Z8r7C2YlUWKhq3Th$Z@op8 z7KEzQu87lJ#p#=}c_0I>V#Xb1OOHyip6_!Pd~R-N7F>(b@I2jBj|-06M)Y)eK{D{E z=cf0JK309!cE69o>oKbaKO~NA^&DXjjQVhwK}S}Z9vQk1HL`y$ID~s!O7s9fnxa&-xzEc#rn?|I6(cO4_!HYYg0T)6*{Y@7X&r9rp zAlNiSnT^YAg!8ML?FEN*)YJ^9{Bg##h{@gp(^*|F9Q>-E za4AC_Z3;5~V@oO8c>Fjeho{ye0EF|Ddpq?bmhZlm( zJl^A?-cZQm!Do|dm0~PiK3=Qe1cc}4BFvw z)=SyOPk9VuMcFJ&zv@)(J8tRH=eHi%&XF9pTy{P7N}*i3Q0A1PwqKm63DsNDBa}4u z?a*`|?#L)|=tu_DgcoU`K{VPr*BZn{@RX7_Y54Ak1b;ZgP0k&9;+sdw2L5UbiOyd@NkvY3 z68bcp*|NuYKZSo6(ggA?ttTfSE$bc>^kmEGhV9-Qm)zyRi@Paj- zi{}~AE@q(@Y(Ot4{Y~Zux|YcEopGK#B2h5$N7$^KuTks{1x>W>sF38P7t{w(qs5lA z_dkc+%dHIC)>(|iW0YNXGS`HMG1j^!&@AJ!K(m3A=faS3nCdSb5a@@XROF8_My9>E zU{Ag%%y>aBC?I~(qM}b|11`AAcaa(8iWszm!)Z<5Wk?8qGDM|d;|mb?eQ*G8mo`BS zdZQufEs3O{f_4T`uNY&-xz$R{Nlc=*l5~Vu0=(@0gSp-e2RB~4?wC*q2#8zK!P!Sq zKE`a#VZ=Gt3F4K6P3>$sb8iUqk(K@yW{(FKc-mp=HE~ML-1Y9ntKs{9F~P#Gtn;W? zYBn)=P?CV`HdPnRU%i#?>pv9V+XsWRJbqf({e+H)YLdTIa_mvOITRNfx5c@EJfCSF z$_YSZfP7#Lw6#Fb)6>&^L&IW+--=snIi9TLhH1lx$CkJSR?cIRO1AbPI1l{~J72vU zlY-(YIHpr*P*C*wGheoF$8XWa)h09snp;oD8Ca_t&g85#tAq(&EvqMii&0!{d5214M^KwvGs0Os+$ za^=eX66T8hNte~)L1>pTwIw1mS)4Ov|)8v9Ymd zA6tsRs0E{(H~+1K279Q6SeBvXWa;|>cMT!|9K>XTo~&=H%~IB=j&?a;xAF^aXO)Lp zPSm?x);liss8s0kpx4s{miHJ*yGh`>ZqHB7Y?o0z>OLKfT)%#2)fF6%R0e+8T!b}3 z(qYbC%T}$LNg8M{#Xg=GP;Y^y>2-HYi!S;7;lqc*3VRsWsHOw`rbM6bU+&@nM7m+~ z<|50hd?W|u7e|w=m(oXw*0#m+|D2R4k!bKeN?2XKA=g9bzb(8vmQ{fAG?cv z^xP(8lmu|g4=kghPh3G(TS%yfxdE#A<9f{V=F_5VzkN>U&YC^4y<18$9XsBDd6cy5 zdzjRlS+$duSkH4b7d$8D7zQamIobmA(}{yuG4<2(^odepBCdabc;u-iOSjk}yT^xj$fVwB z4Zn~s5?kfSqh&{0fmC~OuITm~GEarNv(c=16m#gB`mvewo<11%IEcJDLbcaK?l<+A2}R&Ol5R6 zOCU1)eLYrPBTz|H(ElM>$ilxEQ|gv+&@Qt`;4x z)Wd5v#`!GT3o1wzRKP!22DNpl$-_7QD! zq^YkKoH-qMYizrHUpLJ;HR{RzoH4VXaaIr03@|iN1CdnqPePH$+}`sg!8YyI+}EvO zBQz~*Y-mtu458$VIddaQK!?AU9sa)f~YbAzdpDVZ`QWk?#RR8&Yb zm=#JB3Kkv-*BGmT}(tnRqP z0&2ZO_xd++InwYHkDe3g>DNU)E4D3v#n9ckmeb7xMm}bjf#dEWo9p3yZ2vljf7UbM z#A;uUp#m*v;fnmJ>%Ih(@D@(mX?;>~fCqG@3KHYimb;@?{xc;;4vM3P{wwj)99t_|PqIu`VizM}X8W!|;N7I*b!Fa`fD`XmEw%2nU#o4xa ze|@{fRJO2jdiAdbav81n?2t3jRbB8^Zn63mU4Q>}i#7Y6y)txY-ve*&-?xbHziqe9 z;%T+XpuO!fc1f$v0VUVg4oI$UYJPXU_U*DxDR&msxrJT(eCL~JQ@?Ti^?1rP1tiXT zcol3uIs9V%@U*wNr(FITAH6Rofjd)gFLb#6%M@}>R%`IojVGXTdjher~H9Ny=1c2Fuqt(#T2NJidGYlINYCirdK|H8$Rhqs1 zJOhJg4vJPMlhqHpkMge_V?8i)x@_#aZtCq>3T%KauJHU0zj$T9JW3PVnj@ZngSzkZdu@fd><8gD=0JY>A#OF%a_3U}1 z$Mh3}l^Im-)Z*Opy|VYqkM!8`&VJ2txR#o@W{Y3snttkEG|I0&M*Y_}jl~`N^XmB{ z-jk0^HM8vg>Wn!RpYL}zKX^tbpvAnovw1bZGCO&AOHo#hS$uuuco4-;I>oZ`4R_}@ z%$R3ia=u@d2l_>$%U=U`CzhTpJ1?DfzS3hHLLy?&q?F_W;pBkowgZOu6K#G_U_tR0 zWI^6K6F$xYGX728G%tQh$iSIphZ=dr1x^D|{(FGoIE=0XyuH{if!Quko;{O=r*xm- zB>Cvqw(Rm%`(VI~2NOnXO`IsEVYQ1lTNyt){2oI&A*zpkl5mhsUwW1^V3qIo@Q7*c zrYyhTfv#f*K`fz3baR`=g?wbLH0lP31Kco5P=0Xn!KR7JQM_h{>L<1J3L9?c(hX zAKEj#)ah^C;qhArUw;3q`R}&87Q)0Rm#xunLl4H5`=RGXQOCz z9Vp2*K9$wY5YLOQpn~21j`aQq7Qs5n+);%dhuRmNs}A!PH8|-g2i`%nR4{R&pKn#X zwm%j|pzwPK>}SS$8M&hHfJ@ZM8`VX~IH7HRZh>R?DP^n>2cycgfo7s18dWnvJLpA0G1QseX=&5Nqa_vFb81e2UzQU*zrfR`ocb~}?{*7P z8J#SgpiBa5?CeiAO>$+q?`x9wL!?g73k5qykbDhJXy}#B%7*XSam(j*#PG5d&3W&W zlc&^&(J@*IfnTTu2=`VNw3r%&d7~4;Ae|i$nO{!Ylo#2%qi$T!J$x8-uf87}jEfeq z#$YIQrfR|+uoOitIQN&z{lC!~zgtq0_ACddQnfFIs^6M}^P_T8hqzHhrh~20dh&;e zu#`|B$hj)MU%P!e807Ax4}o!6ynqa*GUx>tE-iGpTC&)8w$`}Mhsd> zD1=OVXT3>qJdzVVMgTp3R|-cGj_E|TRhFiwGAB(Ntkr2mKUAN%TgSS`awmYN_cR9| z8g4rfn(7x#^R1T0T0AWpCTz7vazQ=+?Tnf&CK->%dY^<&^Y`$-<7R17x zS(lATrPnajC{C7rzxDi6TiaKY=gw2Mou8eaYm@5HuyaX^{Uf*m6l+3|;R8ip!B#B} zw$ki_w3Sd@U$RI~Js_$P+dxyL&Rdp!8~yD?d_U@$1GEuDkG8VH@(0u|K?8$&W-;(Ra7l1%<*0$04&7;5wo+Vo=Nn-*eH|KW z0)Nw4A=^j1CsL{_0|KZaw!aDUkT9ubZlk_|enIUv~#QB2LLoncJFEc6|)?J0F#+ z73}SsEhr`K#bdtQ3f;*`y6N=IfB0G(YnwUbfO)HGew*ShS&dA5>pK~q#l+BwCd zW<{(}=n=YG`uaU?_tfhNG$PY{tlK&>3%{!Sg>_p!Ncc*>r|W*eV0$OrN{Q^BicSyo z^SMHy`(#ocnGb3D{EtUn_1+rp+X*r;`pym5mZcN7!arg1m*6KmDK73Iz7VbOd>}#C zm;UWq%_HWDh*Wr_}eZ=>?v_bE!k~7xA6P@zEQ>?F+l~vFPawzPfMu1 zQlqspvS9l|s=~eI8)vAQ#wfZ^xX;s*>Cq!%-}^BGNTp_TZ2PtB>sxbm@J~cdo~1D$2Wt8QDNecC^#=r=wgD9bjnY0FAO|>Dy&^2=(ovLsbxer~A<4oJIYv zMr&+Ae%dIe{CLx&jzw!rGXAbTm0lb#-@W@8lgVu7ebrl-Q;{Aw%JMaeY|H(3X)TYu zFr|2|zOE3h1DVOujTvHDuHp)?w9xfR+eDnkES&$q@vi39i*kx;ZKS23WRq{ z`7EfZmfPKeK36(f|Axup+qFr|9IY8Z-mCVvnLD?DQe~Kvxz}jJy5J#mo0lX_u^qe0 z-oBI^Q2udQ%kK}}62E_3nD~e@wk_*NOV!S+#?>~|bCmt|k-;NyD`;t|?dEf9npDHI zZuX|}l_g${@h_Dp1ZCDQ>Ve6O>aFnz`p>>lY17c0%hz3)KiR8k>zu(oByLL8%nvIC z=?hX-5N%enapFg((}#k(X!XhRKvWdBoiPl;#z&7ZDzz`0*-Pd1vZ&~2=K+`g%+w&W zDP1>TYt9Ph3f`5LhSy!+@uk0t`|ZW(-$Cq@Yo1Og?m+<^F7pd@u?S-6Ph6T+^4BJS zRI&6s>+IOew+j_oTR*?a@XhGz;OV!uVvDZdV%%b1dbH!UFpyh47paLdrJVQe45Key zIwZD+PyI6W9Ib}!4{2)07<_*BPVtsEX0CH&*P0hYBk@ZU_DM>sqtrM(pT~rSEUHU=vr5t###r-Fw6(oX%=%ymXbE z%reoz{;`t8*y?SZ)f*r+znJNi2f9{PA?xjonw_&F4!>30z=~Ynso=58yk>WkR|hn6 zF3N#p_-;9r=G|g*Vf$`OAl{RaM|>B>1wl0L=0;F~Jb)%N38f4Bhva9ty1E^udboe;ftt7**XNx`|2imP$iDuPk73acePioc0)XMRfuF2H z1>N~gf1FA8&;h$J|B};5q4&z5i{;m{g|nu;iH!0b<+GCWE1o()$DxHSTS`*XcYbvC z)dBd)y&MP!uhT6V^XJLa;F&MCvy)35Wzgd0w%U7$lK1Jvs6sK2lkW8lrQJK5K2aS@ zXTG9a-t^tOMLcF9+DUbMA#Ag#AqHPzVFVTG=H$GDXPH;2o^!ayWmLa#X%+gBAQEte574)`?u*lMoADcS(0JMOu2Cv}6eW>0@8^RZ6Qhtea zY%LEEA%^s#qU7#Fnx|8d^wM&`@;f$fn<^G%2MKiYxw&3%-@Nf{6$_B=H3X7VPs7l}j;=`eNWr)g=o^fa46CR^GcbQa&_6bBeDaFy9?PC?VpcL;PuHvF zyQRtIyQ7(H6%cjK=oXl|8E}?O4`-+aG)*otT{Gcobca@FU=L`GS~x>2NcuWze@6@( zCMDFvbtsdqL``Kkx0jKs<;&?%r29|z>JOus-@mxG))_kysd2 zu2vz^{JjSb$c5E{LRzeGHyco>d+z7bt0S}0*3C0>*?#Dz(Rs1{50_^W=6V);qUr4q z1JOzIEhCR3qz_mXeH?U4v_{Ie7)PqF-UQ;_qy0{y6eKHqF3%;TKJ91}Bw_!xvr4Y5 zIy9@m@#^ZD%H%Vi&djowXHRpBec`$+DW&FRvwjW}@V?O+<2=g_Q7m-N6BL$+?uoG? z(@8H8a}IDW^h(YzU$tsj=ReSVg-K)IAXt5WpTgtqmz1O#6kU6zo9n~amr@!OwxX8X zxkoy&76XRvI=>~_5Jn$t$;&!aEnh!Z$#P)3sim#8U8KY~hpZPm0|#@CL^sv8snJp$ zH~+%iw>i&g2u9tW(+}kok`T$9Gyi zI=kbpYNc)aH4=zEqJFOK{1=QhJo4)r1}8Q~{m?DuibXLr6Ba@zgA4wo^^42j{Gsn6 z-TzDx?x)Npc2fNAIN7yKW%cW)WgWxD+vktJ9rgO)#V_pH0hC-)0flaTIH$*#@ajb# z^V`;1$^tk=(3B)@Tjb^IP7P4}p1qGXq2f{>$vLBWd-XfR=D7tm1{5E_X=og^mzc&` zm{iTR-n=;}=IkG?W1;)CorL$z--}0tF2xC_6%5{9VP8f4N0O~y`Ikb1zLmMd?&O@{ zJ-Q`ux-YEWb~R=HxTD!aPP zt=`(j)<>_V1qF8Na+9u9sjA@#itl%{u4KAswsvcbVT|p-_qhFg_wK-fto(fq`NMA# zi>DCfNGRK6ZR=r`bm`$J>igri+(6Fuc+SD}r%$`Xlkb~$N?hWEs#d-FSi845$>>i@Tt|JjB&yVcH`Rw;yh=4%FnNoH9^y=xsErVK`onGB> zY(5nASz8dEnr)cz5G1pvQ9=45GpD|={B1b?_eJI%4;Iy^EFL<4?Va3p>}o;T^7EXB z=mHe&?O*`QnQ+QAO7aE0?TpOK z3t=NM+GHpDIU;E>8<5TF(PTBXy-3(}kifyqqeglj^&~4xky5|4Hpnak>yt~bQ;Fj+ z9Z8KD8`{iSH#l&PuZHc7^)srPgioZ>8qz8Oci9)wA6f_>$hVGAvFPM4q`ilo3z{>y z-N;7rKfgLOS0nhaAjeTlZfLWuhDnIr6ZDOY7KMyNR35j33a}EV&r{*qEgL{P-QTOW zrX~UdnwU`Y*RE6OUWOZzY(#5fmDY7W5=Qh3hdQ;%P?|C&6pgtKk^=)KA7jY$Xw+mB z@u=_pfsMqJqEoH9{%gW?G}vGI$b(i_e@go>z#Or;@xY-&!$9Jc{_;qkf4a@=h!SIw zW*l^j)C#^tJoev1T^HrSKr{6q*Sft=nK_X=%dwah_&$`ZT@gv$4CO@fZ>CncLNC$TnI?-5*(X1zfi7 z)1!WVw?MgL=>6+|#^GBZiq690QQj@h5iT@j7cQ0pjg6>-n5TNVc-l%z_h&HE^CqcF zVyVm;8XGT!KE`K&|4|E>r5tF?Dk`V(DqV5OHf?0lD8^|`_?T?`PLvevPs6jxXZXms z>7c@NLzaj7dM&fl^y=~%IvE!`=vBknuM1(_Z`{1O*W=yxr=iluJX*z6Lb}_9@e2OB zI`rL~YA^D|t=vBMuK8@rM+|0K)Gt{>Q}Z0@MeM^%gDV%Ur2h~xg%;(dJQs$VP2JUl z=M4UcXLvv}WreikbL$UYBnJ@*bf%Be|9^fpNS@}4iN$w_kn6S=RMcqwhJKgsX53u+ z9PPPSx=%T^jqHFw5c~Z+A5(T7jY2Lq;!;|3NYV9mMr7Lh1!7XI@Abb--{f5yXn+5ywIR{Jn0K2MUB zk>Ll1cwW<*wlf0Ad9;d6KbiGq7oDe^ORsqhtHv>zc`B!umzDH%b&ZJ%9VA_PkM`M9 z^T%n;>eVV58Vi;sMn^oYQHYo&p=ZO zH1U|k7(`eV$iz|0vcw$d+|S6z{M&KGHJg-^Ft4vcv-6x#DlrXTCx-EC7kF%<}C znHP;_{pjHaEjKT|wp|t!m^QQbg!vk=s_?+`4jQl(C`2DR+kH ztxJe;Bd zZW|K2z|D1HW+Y~f>Qx>|+*h6(kr~rGv?h53=WH0g8r; zal48;MhqrpVX9^S`2-q)qdUCj@oP~?VIp&!d2>e^ejiIqXV4DOm#Xfk>7Y#fmHn%$5RHgr1 zZxcRTlO|4#2~FZ~I~ow6%@))5R-n!`tPMlvwa6XafknrEu|M=2O$V&9|2V2^7u1ag zj(XWL$@5Qw@hayRapBC3$xgh{;p5w-=e{T_rBN#o8%`EAk^BjCe!-u`oM*B%M-_aS zic=J06BSJImHEJ#jn}kfDMw=fcntJ%PZYe)TK3tobA$gIILv zVf3duJjlUX&VsH3OPQrDk}`$F>g#Mie>y>$F^K4-)p|EC5_u=FA3KCK)`;`) zFp|{VK&L`q`{x|mem`-!T9u5_1p+9>1WhJqkArMgP^S-7j-Zp*A?yIlNo>w9bWX`7 z5S+&KR>Zx3l9QbWSr6;qGCyPyRAy3Ww0zmJ8R*%n6*{AtDR7&Y3g3$o_u+WpK;~dd zd)U4D-S%|N47V=U40Yy>t7A`O^J!vIIN-(0m&Z}+N5O0U#8hF?PHa=}zp!Rh3fq13 zZ)4*$woDgxQtU0&*ojH=`mFgSqi30k54P;Z3>=&sh$}8A0WlRHK~_~jnUV8RG0MQ* zT??|cOu&RYP4( zu~Y*5p!0Q>5fzi=%asvUH(s$~@Cch*$Hnmo>0#lGN#-xoPPKfBM@~xm^G>?|QRE*_ zxq-QAL85gzKXhUsMl|I_b=^Ae3HK?M14T3>pu5oL2(o{X)UqTgG~-pX^ab_r{ft5< z&VcB(V(C(C2E@j(OHWaIR&X~6nW)7Qi^!hxsNDSexhMSi`fBVl?-MP{l;_jreF{Nl zX8ZQ-SFBxY*r}KL8M=}t@ZZSN{7K~WfSD3Nr~DlE)xOEQf8RGWG*tKVLGEk_^-b)O zn^$%IKp+%HQ_k+ly&I=R<$kzvD}D7Q`!L@ahbzh$c3-BkW*TGM3OCOf zPwm~OPsdSekETE3!?6xIJGz95J-D(Q74|`oMopf)IOZDH7Jf_kroekq5xd>^IvtGBnwt0N z1GJI=lIc+NtF$nIs%`pDhEM&DpFH`2iUv6&xv~*~ zb95^nJ$zVA^Zi2H1$Yg@)13z6UEch%)vG&GbP4$!qy}YfUz!&N*!i_2O@XbZP5+4} zhg01aF=(oEZ1aY=55hEqzXnd+%K9!&_1wp+KpLzSyiQR`KDN6!9eI4A#Q`xzs8G;p zwXn3j`{+>@m?gStUVnXmxvQPcO){|{In-lh)}fJFEu!9<%z6L7seN^Q1wOcXGIe6a z8WG&^0Gdrw=i%w8=SbD#>$yYyFZA;>HSIF>;y0Pm?-8T-0y9Kib_V-KG=%AJF;&!Y z{rdGn`ICCBJx~YF;`;LFQ? z>7TXja}EMeayHX!t}NF}SXVNTt-NT`C0?e`+kge2gUE<@*1|3aeTV^CE|LIwjWP(b zf|3zMr6`=a^~QYLH(4w@7>Dvu7G%oeFJ0;ewb{>IQlm4G3`v$pust!+b$h7{ar!ds zdK9H17DVd5Oxbctr$g_dz0mn%-JAi_75XmJ;6g}|rdo$(6@o5AMFrPT04PLUG1>GY z^Bfhpm=i=2>@EPR3FVhi=b)Hj6m|qdCjuCv>L)cke*BEU*Nt-$z%LGuwZ7A#iq~uLZ#UTa#UnvHER`FoHhgs zVI)ol7qPj4silK3gdw)c@Q|KPT>UNc3)d#vC=Ow)vt{@9$i!G&iO6?^P%JDI@|w+U zZH4%`U!-jr}dlPr(eIb?ELgG z+9x;#2SFMp=+4sDm)_HXGtU>=1Vy?Dr@puZ@*bKxGq*P$&5yB_Tuw@wg*rI8{@Yvr ze)sM>zb9r*)E@rna&6o)Yluv$w`TUwnrzG9l-S5ZfI>{k-B_Tn_AWmL`>v}H)j4jfi`!U4v|h%HsEBwVkHUGV zys~oV9>pO2K)#D0BRsyQOz96umPub|hOP*8>_5HIk|5QGu0NrZ38M@@tw)a^_xc%@ zb+KdaRf@O%=ml|pJ)mkfb|Hw<>*s!+)^v=7=eGIQ_ll3PV4%c=re_zcoWfON)7}&UT9MkrbD^eJ%tV5(u zOq4lJm9tNIXmrw3m*~k(S`K_Ki1l=ix^iYS5ztMDj4~r)_Nl~d^XJC{$PqdqzqGZX zW(bNd95p++nq>@85^RzK>Vd5V#VP=?CLmB@7bbtOXYy*h*d?hReMH=4kyU?rJ{+!5 zItBzRzzjfUe`z^2fw`jaeCFwA?0$HE+tq8lXx zJb?5o0PMuF=TR+7Y&IlJr{+**g}xWML2_iHJqKL3ck%pogCTL~W&U5Lfh!!n4)9o1=p^^a z!yq{GN0W5QqaZWAfmzs^KImQWfT#AZvT`5C(9z8%y?eUVf9+$HwEFz|O>OKHLYmr~ zC^He-8f$AAuwIH&xCBq&fAz@#-{vD#f&`oyv@~k6D<0fvk%eeu_$5TU=#6ka$Z4$WPKQm|-As!0Zeih0YSOcp&zM*5_&yXaJgP}OgKAee2SKE@ta)p(ypfkjng;(fR&O9RxFZ*d3v6&Bh@UjK{ z3SlScSACr=lSyQiNXP~vO*9XPC;@d!rE2-*9?PAaq$P83Eh3M3Q9vd)h{Hj2$My2vTk%C98~N zsk3t@BcmtzYNxE=XQz`tjD~@bKT>+Q5~UC`5+dk|ayLG@1s;V&!tyTt_twTd_*kty zR9u1nePRynJ6~dYuvj1PAn)=vnZUlqN7;RCp%c+Z7;;IpJv^oeyV344LNE_#NFr&5 zYXL3n*vc_MhxH?SPxqR_Uo9S*o9Qx>#FDP?F3bYOZ{xT}C-VB83bJ(}`?8v@6B#yi zG3Sm)kNvY)uGGxb(KRjdTgp|v++9T@7D3{v3^Jgiw=aKWSG(4{0iZyk1uF!d=cP>C zUvZz1SWPexD8IyqBVndmkPaswr*K;dS`Gbx()1w8%)1t|gHSKDlsY87y1vd9exc&T ziM=JGafX2`drfm+Og`OJabA~BJ@xfNkAIbcmw`NUDm`F4dpFvE;Yj+V-`Pwi${7Y7 zK}ifjiTntjn$WZ3^COQ2`}})9SN)_k#9NNq!~zlO$Oxq_F49|O0MDfzxh@_Ca~$RU z#)L7sH!jNPw9V3F8p3U8wR(0uI%lj9uHwG_2p2zi@5|9Ji{Zi?5i+C;s<;`p>Ot?Eary`_EnNm%9XZ`G##(ak@47yMsO>*efE z>;^nx7X2=!^&zE^E95PN;jVPa$&ip5?V$@Di6mk)N;dU0hC$s{T;1qDGxtAF{Ois! z+v-=FUNG+hJa(5g#a8P}`Zz$?PSUmrr*hp&ufy=Oe2*R?$>Gpl&Rhu4!t;uz-gfqf z*!7Hc3B4L5xq>!tINpPVRY@#Eu1dafSJ=F3tha(owsv?wmdQ#TRR1Q4q&_}2mlAD!!Q!fyVVhtdT z9E4QppE^9gUYXP@AV4A+J$kecrR9U4fWZ+Hlo?Oo#W!zMt=*pcOO3Ngd@>9Yn$>W5H!+; z2h!Wci#zlTm&I8U%|9%l10cPIP*tNrSd<_ABGW}WX0#Jph)j6JA3rv0i;HzJneAZ! z2%RvBq~qj%dp*5ksn&fs3H9trkk4^64WB<9p{>Jn2J62Tu+F@=H@dnc;)BWRP5Q(x zx@0KyS=L*Tefrh>LQ1x+e*6ipRPEU{ywBIXO*T7QK`N^!=Iw8;sigagqGbh5K`ooZ z>GKQ?qmbSYK+q)L-k~T#HEilOEatf64iZmPjUtzPxf(rX-G`hvx7?0U_L?PCQ6c5C zT2$!pg6MUWcp_#QY5i5hSpZe8h>zMA-Pmw8U-V!XSbgu|?+enpFgQzf zjvhI(uqY!xiz8p!b;>}d0fY`nWy7nNFZX=9j(b*o?b5h7hH(dfYkszb23-dUb6{j} z$9s?<%GAGN>R6@f{pF29%f(>=?YiMr??;=fkS}n2&K^E-qQ!><4hS*XfdRLV$cgH7 z4<)U99O}<%e9yfLznX#Qpq1a!-*GXwv8iEG>0BK*5>Ik)`zw#L=<}K>Y2Ykp88{ba(K(vTz6d)(G1K4)Gi++)t%$P(68L7?yEzxVGYaqwzJX#0ZlrE;N`kNp2 z43JLo^oZl{^;0?+bg@k6@*v^v>v4_U*AHL0e@uOzFt!n5s?^a!L|5WNqS8reg3qnH z0UXU@;+rZ=;zLg^oO*&s+4te2M~SD_nVKH0o*+|7vcnjjdQp0Lz{T9xD2X8yCJYCJ z-2!il0BJfUP7KX?uO`0D;-S85bl9C@3?9V+ofL z>|pVR-FueQMJxtbpo2Zo8El7ZY&fu-espbpeXqak_*eo+I1F;F5tqh`I8AG45Sa>J zE=ppb9k2f}Y#~y#mUQmYMOf-#qtJ^^Gvd4=(HFK`R6jzHne7a*ZxSI~V3J{@f`^K~ zWDU0E0F(I8nXqF=2(Jv@yk95tH z{)EtH?q0$^iEfY#g4-g7hO-&?5M!aVjz1-F1Ne zjr&DE(3U&)BsX`Sy%x_#$vRR$sGPF*bWQ>rS76pA4!5a5DfB+E% z|31=@s(l{8z2}IT3`X;5W%JzLJ^(pBkMfAl>#ow$3r>vJ(h3oVCrxc{OEGN2m9kF!(#6Cp3-klPyGU*~ z$X~Yzx?a;O8nQ0IvagU`fG?|`GSMnI4UCf)kY$0An0$kC(DR*hQJ-;6vOc%wbRN>@OX!$20LWxtU1b@eA`T6+?k24Wb=1uJK_n*6=m(i-6#cuod(XxifDy=vw z)XptG&D&dYhtu1y)fhM4cI$u%0d@`!77_LZLzF4upmdcVblhzU@c(JXV zGpwvY7rYG6r;UWs!VJN5MCN332!DtmLJcvw)lJ{+^#l9Toj>d9NMtORf_=T-l%leO zr+x3$t3IS)>Ep94EPM3tuP&|nq<7DgsH&uI`zWd%^X7l^?5Idavcr*#llZ^~V1FkZ zop;}5ZoTe7Mqq7V+vY^(g`PawPgs9}2n(06x|2;?YQFpa?T(iKi)`la67+=6Rt)aZ zkrPa@NuhuLC133eo^km4rqO5aG<^8*15u4cJ6E%F-K^Y-9@tNKOuynTX#H8okFWhs z4YX}`BuDH}b#_W;murV|MHRy|QK@QGw+t{{p@0edO9-|rD#u4XdH7J*!9j(yO4twN zJzByBK_FE9oAU4g{YadG(ur>Ckv=T7E;QH#sYa;S!zUE{+?XlQ-Ts*94OKa)Wv4!! zN|hl)@lfrm-qj ztw&QUlwr~KVKj|n$sLhWmX$?nz9n-LquR7|RGXr}!C^WF6?`K2>;im5qG4|71n@z; zEoOAs)=5H8L-3I9Oq5DIL_=~K-{=4rGaEC|QeRH>QgSP>cH}4rp>=o=X>=X?a)bGN zx(J>VH-GI-Q~w9kw6jMBOaC_)04@aHcaMW!e&0iQj%| zuRfR7k{GNda~3Wo;-Y>(V(g2=QZ%Tb2-^FgC*ZfO&8ggKp%P=Ov` zAFk6qGb2OjHwbqP0U;8lm>@gDVx>5Gs?v>?u;?$)-)SW|5Zy)`FrB=EU-+0)b$9JQ zQ6dpvC%lRdL=RvhOklIhI?zp|4O$@G3A_eW4hJZ0ejgsvPWHJ#z#&*TMdP$Jj5JAd z-c(w9g95`nJGiBH>;&9^w9z&b$E;ZD^cK`=4}hKkxOG=hxKzEEzx*K#QPDs8eQ|W7 zmRp%)KavVn;h+E(4CQ=)kRx6n0&!fHz$5%0L@50;UoA+8YHqFh*b$goHx2fO=oSip zxAJWOb1W=NmwS?cMJ1fRpwIi$eH=LloBvdfYTLfObfcH@4nMzk;zlrUTt)+1SoIaz z&qaU%TJ;Z+>7{^-p5X)(QO)Pp=*yzDRaY)koaTK9om25`V&ZA(+O;-IJDzz47#`tTW+#6+*AiO`QWV7)8M5Cj4bMzfR|CJxHG z=$8z9?oadl zqvC6ETFX@p4uEP%u&%O6UmZ7&iP7W7&w~24%)z09vJNm2LkVyPw~H}XCN?4*m6eq* zGhs~2=+6E7ZK=%!H25zxG~72WSV{O+|IivA%M7&FZkmaZKJ?}nXkx)2Bnq3N>noum&ieqSF zG^7G*bK1fxVa-es2~lXBlc5}TKoH#|BHBUG?~aoJV~K+pB7j1p3m7(r`90;ZdBY(b z^b@q>gh!c~nfFkM=hvhHwoJQ1MiDyAvoGgAzH>c9Q}VxX{Jyg@MK2BZLs#CE=ts~; zhu<=rCLsHj=Jf9w;Z+}h0pc&gXo#S>OUw~Zu+Q8wb?Ve6$OIAJMOq5mbr8@KOGB>S zjTAus#ZCiC3?U_~Kdf=e)@li#8&QV_0?puIvPrIj?}_;c#k|Fh^-7|(Lk4(;oq;ZM zN5F{4Yg)rqlbuSgdX!Z*^V~sBdlkjpf@QUE;)EdEb#$S{h^C%nr-EhzjR|IubyctB zSwyo~%erp7#rLq!?m!+v;HC=~`|{PRWuR^>)CJ)e!w(-has|SE=)?`JIW+Kj*?IHk zB(xrVL?eSNyV$lqm1Fq^xd^9f)M==PV-o1d&}fSStSq33TxTI z8?e}%f}Io`B=IFzLcN0{Ke&4_1xaG^fQ=+n-9>~XPunUw*0;Awkz|TJOsFk%zxm<) z`^)h0#Wm4eoW<%P!P-Hl`;P9B@SIM3+%qd>JO4Z={bo=~%4B%HqBBML-W~bi`!I~3 z7pquuT77M^AY@dzfX;JTD<~+GW_;$syl@Di5aHh_OIA2I%mKZSb|g~xdOY{!AdAYI zLc2I-{AtcpX-8z!v#9_sH1yiyR-3{+1!5$I_Nj36&hRqm{)PE|KQ+ZI!lal#Dx)`* zSeA78@)1f@|=iD;&7uig6h&p06>>r|P{>acq5XQ~znaE;(ukm;vM z>)&Y?-P{yiorX$vP7{IBh$VK8fME1Nqr1#sc%(YbWcAOTir&9R{rM=dZee8w9b!Yq z>6B1T4L$ zj0pumN6Gv!EiQ$Mdb+I_X75q3Z!&Gg`S`XOEl@L zDIMZCG1=E^L>4fZ=`^#-+jNT|Ezv^vuX*fGu04Z}W)!T0g+yA&clngc)KZ6_6zG1o z7Vr=(4=ZLlAij2&F`-0tb9a}n62p)7Z=2~8e?+EGJ@{)a>{P!5QthFLdk9)D;ktt( z96v>mQ7x}f5Y!n6csfW*O3K8VSxuD@ikMW0ZaWHDRAe*pp>rQR`fYO ztfM%pdW>ejB{2M8|?zF=2Wh?u^gI$uR41b5$zuZDRGHIN^oJi25 zmS}c?v>S6$0RSj75i8O!+&SgEsXlLh2+t7eM9;`Yn+IG&ac<+5EsG|O{L|RDkhZ^| zwz4kufe6IwZ(Vb7-1oOB(bu$cpU|$WnihW9<#{U6%8;-S&8r^1=4^vtZy}bOjUL@m zFP?(5YfH8KjFC#Ns==N=d?V+n1<1DW1fMmnt z3&AjFKA%4{;+E$Eo{3;d``mKA1)2Q7i=HOM$&hE1Ku7&P)Dt?mO6qQoK)I-&YzVRb zX=2L0*hCW7Wq{UEDso)5OcKC9N`G;9IxLxHmXp81+6GdOxF$98xH+&lO=tWey<5LARC_^lxP)^T!+C>}%SAfl-Ss%Y!lhtsn}78<@u z8JzNHl6seo9~H75W@jsr*tgb(g{2sAt7|YiTzgUrToj4l3u5{;Bo$Kdl3K!AXp`rD zG_AMk5aMISyO{(cxlcpVPCf6kqSvw2ms?8!ADN!Wt6}e8_2Wg zxwB^!f#J8aropnV<1+lF0AFUq{dLUT+`NWK1*>Ot?_=Q|ls5vGJtfA;)sShMmrptB z33GJDFvHO9k%gOWXPbIm|3O~K12+U3W}?-H__~zsH&EQu)i-D zeE;}ya9>}=oJ!NfMuis^jp|EpuS*||k1bcWlq@qDP*rj#?P$9hSC-C{k!fdgMN+?X zM&6#cF;{+_iusXevAnSN{I5f2oxSp4$8!0_rppi9K66DWqjiV9F6Y#9HNGp{nw&Ou z_2hYr?=)_*wi%g%!1Af7uHRJS2q6;uCfTPu!HC%ox~~1cFWC;Wv0idt7SEBt}fkqX4!0bP|hG) zli>>$)zLnLHUy+bdtF+Oh-;80+pfujL~!W=w@0U@o^18%Zgps@6PyRo z+{Qvo)QB%bf_WK{slmoF_Ewtk8@2NOz#<(3<5A#&iQ84}sT$;(l1NmRvYccz4Ho|X z{bSJdLIBbcPfF$eBwM?rT+*u9eb%6QLGi3J6$C9ca4Jg|eI8&LL= z7PhAO9;tTiemHxI?CMlz(DN9Roxzs2pm`7P-J4lArWat!jb4u14x$&cf|Q}u5$f$j zz>Wvp+nwIIslSXx$Q&9zR`>1vrLb@ z{+mXp38}ll3FA%WO}(JiJlO_!!74Yr>DK4c(z~lyuhtx2vvmIz5WCuqv^Ewx7w;dF zgmhy271J+BwQU=&6e{J=0xyZ^t zoZ=S9Nm$YWH|^V~I?u@H^8xo%I4xl%W5$gO!n=B3t5;qAunVHcTXSCbgEU3_>(g>D zx%CM?y3}<7=Z4wISwoNfs6898AwgrN?a8^>y4wwOIw+mK{ieM}=Kel|{@fiF4d_~J zzo}<$(<#5lGsv;3h<^82#gyy&qWUedu31n_TGm1Bu=SE9n2Hx}wO`Mdr7$I~e__70 zoFu1Y{*QH80ZO;zB81ZB$#Krd&ZIYTxLVad>hqDuLGnCSJF(2sM0(@L&MP#ciW+Ok z9X%$isCByER)di2R=HU6ki)-h*;h`<)l}I#N^}=~@7GSx*)U^TGG5=kOmK?IMp2&5fLkU`FQT>P1YNxKIoI%^;22rUXv$I zyv&BY#>sz;4#*E_O*Mny!uv%N69AmdjF)T^4KUsSvg=xtrLU)gIElb**U|a226YHUVeo&CUCAapw zIik{H!TzgHVd1@?R-K{u12oC)-Z5TKjI|f3->ucl-QTOZ$4i!SG}}?Q6&|l=D^ICn zBI-DKzkZtz_TU~LDl#;uz`9g1vVAJ}Dfq{i6;880x-*M(=IM#zCr=JRD!fJ*zTh!5 zIMv9)UtU1dBM1- zg~eFyz0tI}2ajdA+H`xjjw?PjbzOe&3aQ&(uY<3!Q!|?E{6ak_aH8yI0}jKWZQt0S zell6=F@F~~G{p^vq0qDKw2UcFK5uTZMeG+5-35L6%slb_S5iWP>FW+gGaB43QR#o> z4Ql0L?YO1=iV0cy0jR5?m@*^yqRh3UI}iHQ|1$v9tu=$; zHqNQ6y3cOKm@rnK2*32`+=>Y8p-R31Pi)qtf5UC5jj8RIy-OAe%bO< zgVZ*xxY8tRjhns3iKQy1_AE1{s5Z>#HKW~wIjlBRjgxcFqnOa|S0 z2fR%&xLIb;wuM?bFMd^s26U8aYosHT1Z4RK$d~k{2*!;zv}fw|;essOJTrxn-S0?L?8>TQ-WzFnw^a4`ITLovON=^XUI)INMroshQ{IO67Km4^Ra4G&b^F% zeLfj(2)oD->(UZtWLEjyP%1^cGUQTFBtTQy>koiMvWW&1OKBGmC``ApONQi@>Zu<* z@{wSB#W$#xd=^uAm%fL0(|ZRJmA@KSPpbkpz3H>t&*5vg%RCxYxfXk!pmTw^us6h8aVLc)zvfBUQ6$=qSv$L_&3)~3=|h` zP-wHK(~3`ui}2tvma}WJ@&TI=F0x-*RL08!s}>ien|WtP-gqmeagEfF{nYy}~Kcrppy6QPb)ek*vy;$0A1 zBzGWh$Yj@tEOYQeJ| z4Hk#%v=iVi@RP)cgh+`g&}Z&+NZY2ZF(li}fJFAN1=fE%^2ujW*k0&SF}ISC*grkK z3L4?`!Y)wYO($(qGt9h!Eicfe@c1Gxw=Jus^C%ERcsR2ua#8KF3Ugzqv$v!gU?Hz; zYyH;~OD$amBS%1!D8pB}MWeIA9EL(mBl$%{ZYv47?+jW*wfnSqR=xXGUbGU;=(Mhx$XU@@e}4Q0qb=I?lQuv$R69+^)(>=V z7rEMtvWx|WC4}gsYG(R&MWLTpx|S6jZRTR#gCa+lUzx7f{jgn;B0UbZ*st@ zcL*1nG~TRnJwuwKRajL~(NVF{!<$x4vlobQD+vkZ$6ui#3>obCzOz9vd6w>PC4u;- zH-a($E}(f5iI9$k3wnNjbW_Tl$OXdT&N=nZw^cVIRTe?^#4YB;D0^(N-e0PGenCoL zWfiioyJQu&Nbfwp>7<6|!C_?y%o**dl1OOHK)hlJ?#j8U=XTQH#JF+GjAomhil1*= zhMUFS|Gp~Yocy-V`#jCp)7k+klDq@D?G-vxj=}barw=i}+>u68yxVw(rxJj?_L2jI zt;?z|RJbE!;d~<{W#6BHe@5523S2|D(Mrxx|EpLhCtOr+^E=IX?yOnuNg<mBfkr6i?uW<6pb^(7MmLS~}Ujc9acWoooB}4^trjPxYc;e_1*{s37-E}rH z!&OrlqLwec7f6*ezl#KO@8`$A0oP*M3>e?bw7Yz-j02-3f^f=q$_q)QX*5Oq!U4Rk z85eK0V*2ISl z8X(`6_^eB9*fqU_^EK4^oBu#6QafF8W5dox#mv!t>8#tYPoHpr>WEzR7qF2=gQZAb zHRkg~Oh}VGY!6xRGMW;VjZfRkrtQ>KzDv39616V>Tu1K!6a|DWn_m1XkYuglhi4rc z_-J?`{k4Sl@#q3eB%*0Zy7xTFB(&1Nz+j{2#o=o+xAM7ysy%Qp)prJCXeiA;X!BGe zrWLq?j(bAz$S4Ck)%`X9H)v{W3y>#a|ibTBsO+- zFZ(bC{Aiuu@YcX-_ide>eK!AiuQ&R^)^`hEfxy#R$ZF}esjEq|H9gdZN|tsj2|^`L znW{Dj(d-BhqlamXTEg15R+XODrV-+*2~)Lcu2oVwvLzExgnHI+pMf19wdWxZx;LJ< zXs5UO1nQ8TfLew8Ek%p0dUPD9Lz64*?NgDD!qS~A-T|5}>V8pW-B{1E&&}4yyUeJ2 z)naXJ?b@7rbJDJ#4XK2j_m`eqdsD_fw%vF85@1Xl#VNy_7epEKflThN>XbV6zN_`k zfrBR$N-0jh5jwU7#fNts_7We+EaBWoMD2?*9(~rshiwDiuAggAz3|GKK6X2Hz2B8Q z{>b42txvFY=Zw7VR=X?h#q;G?6jj_UQn&ulvCFvje%ED=N%(rI30GUansJ=>A+KHk zDE0V@dh`e**49B{^TUxx@~VXEbPC8V(`r%u)i?k8;r_qV22KK((1svboZD}2g#6)% z#5fY9bwgBlMMU?j_U<+$ne!+dbVG7=r|6RHcoMYjmh1OoYtym=NjA1O;i~Ku1J=_o z(~CA-m0PeQs=w}|C(_YaHTdq{-6m`8%}Wk5;^&drH#nF5)$TWDh7|QOGZjZ#{u1#W z3@WRtx-b$V3E5_^rnZAP0lfeW#98LG{E=TFO zPvH|&Y3+{euvO#1`k!CSgo1GQ-?>>?@8lN!>3@>eBb!=^oM$JHj4-qos>mla>@QPr zof-)s<#GzD)()FtA$iGl(D8m(-noM|ly3QwS=Q^$ z?Ko#-cMKxm7qdY1;M`3M&nZVzJ>B|M2z#RKuX{PdJ$^q)P}R@Bw5XaAN#@uTfya-> z{5%~Y(^@f3^E4eZWTxvXdZLXc%>>uc5sQ04zZY~gLF&BScjTT8tb4DEnnaF?@Aqis z9H>9KGd!gH^_|$u^B0^%IcdScJh)H=Ob_E*iWrF$xqYsU8~ zFkWn3#Oz$qtkAtSrzCB=NNRW1Ofv@KFlqGJc=?*j5{hi|8*gXh2pP~r_vZVk%R7A~ z)$qoJP#ab!nG}zvR)$_pzXN}1Y2Lql^?PyZ=qvC3n+tIJ!-Oc5P_1@vG8q~;$0f?7 zxSp2BW3xjq>1o{#{s9yZ*eU}(f!AOM0O9_5SqFyf;J|*^9*5XTMPd_WSA+AI5iUUm zYF-y8Od@!@O=HVSE(;Bonx5Cz?MWm90n9qtt>bly0F)y~l+-*KQMRV8rfeRf^`GXY zx;1o>(=;>x%;4WpwXluvRMpiD?6j!H1V@cpM#%LFfP2RGZ(Nul|XS zAtZxC{{Y}~UmoV2riR*95~%oth_h#sly<(qZa8n=OlE}{D()l^O+4iR@qPQ^3#)GQ)Pxw7ij@&zvK5LSAV4lAh6DzF3dqOz(Ii0 z#aQRAdoS5lIok~s8{eFZZ;fomp0!&8ZR>7E|1av^!=LNFegA(|G^9;wt5jBsrUnWP zExSmANP8$1DN+7l@$DIp}{dw;yI>-zluhTrXWea6+$>-Bs- z9_KjD<2cU84K4ax9;xIL+=Z*XSRjDd_7z)0bZ052xwj6Yz`0LOPMFZma8pm|B>!kR z|MzlTVmvA%{PEq`$7rIHs%@E*HjEa*W1~>J$F!Kl-Q)S?1+ryBY@Pil1s$#V*^KSW zi_qJ#KO9fGwz)9u8bkTr>9o>9;2@ZBj1`GCGw7eY)TCJ~rmHyn&7t$wQ}5GUdWkJ= zAuou-jG>-{CdB?IzVRicwU1X-?0}zLJ9lok(yw?5itbY0ese8B@;*j`=C{Ga_cN8q z{~maJ_tZq0rW^SRy{1k)G|;lQN6xQNe4Nkv@oFuWSyd+cgA*SSif5923`V^~C^R>V z8+UCrjapS*SEI63Ez?O)vi&E>idW85(r13a{a3FPSU;||D(^%adTA5=F{)-~yDfP6 zcwtWPlHkv$%@PzFx@};Gk&qh~r3l}6iaGgdcVVenc16@5UuZAE6alI*bGU})jGEPH34Z<+~@#P%T=h2Zy!)20oCj&TA` zmC+5x2i6>$I`o(S*hM28_rnKZ_~FDEmfeDY@KRO%*@hsD>wt68~@odTt6 zJHT#3z(~R1xwJLnbBEpaH%|i`u-tgLps*k@8@&g%fSbnB?BiPpO)OitcQR4bOUF^E z5YL1yV)m?fJXZuF;W7C5)oRY1Sc)9J<*-)9<~qIl*b#qZ*IYUbMLuEKEgzU3c2om` z-x}7-S|}YM*4^dw*Or}3eAhHP^?IyA&Rf-qUA`F!Zz_=w#1Nhd`G>MHFQzK@b8~$+ zjb@$U+R2AXXNL{CCFA{S6+zAI!N8?XgZ4eR99-4vpw$=t#e;pTm_&Jcyz`XqJT8CJ z=_RSJGkxQUboT--|FIe7G~wMN7k}g1^`9Dk&CGfEna=8y%Rh_sMYx;!FQ%x}2i~Zk zpbKYhe7`z&Szp0a65JgqTKsA!*G(!Lac-MdJMNj?MwRP-%ztz_=X=AYmy>CW4!VfK zDLX|GXHyV0Q8=Y9PHM|2cr+y2;R@%@D>t#H)oI`-lOMO_f&TtX(RFV*eJB65-MI3W zh;=`D>b<)iF(3F5IQ0N^za(o+}yXDVh_C<;>k4KpnQX);{iUgFyQ4x9Voe}lJ6`CQ@3Snmj)lHreyvITtA)r zAf-R|s}_!4gA`e@74c>qbth7T36ztfsS6f7Uv>$OmL>VZ=fv7MeTN>p(gC6cpJsu z|L8Wp!&N2W*~4=H@M@5wir)tGj{X3NP%3|#er zB{+OyQ1tHBu0EudhfJw<8vbRk&xfyHL(5$qe5S5%#hqv$Ec`j2)n5vS zK~b}%YjZpN!*c`*kifu*C!H_Ej(s*EB`N7c?V)dx?=~M)I9uZa>%r7>cTrA`3=7BH zet&45I@+BLnimxVXaAn?vbj?tJuqXkQYmjEZAa_`Kh5bS21gl` zRKJ9G$nLM{w=Ey9`G}l{c1SE%6n7GqzLoN~@k%t4MSuQK3Lu5MmG3||z4LA!%)%Hg z{l+Rx0uIR}a}~_pBDR7z%s>VB``thYI`^2>qb~hxQ*I?_OroR~ycmp#JV6wZDyy%3 z4a^`&*LwAC2XpR;uC>LwheuC+?MtsZ|Ncfu2Q65H9r+`dUTS1Key+FOVGU3= zR;pVq4hs$#1H)eCKTg7`12+&W6lfcKA*={{Rep#8EvfLYAb6Io-7S;Tpa~G^Y1_}) zfmw{_4($-oqwO?gvt4XlZ%ui-VJ?d2e`U=d<#jng#^#QpeZQ z?AZ?ZB)V18zyA17YrOe~^NwcdFvKbkr2T zztOe&7A*?d^`@+{%pBVUo#t{RKrUq|69DR7-P$#=b;iS*9`!S2fXOZ9xLl*i)y85XdR(W`0+1|g99RRT;=|zvVRX%5%OKHiMzW_M+ z>8(YVG*NO;#$I)B3gf!ReIMlIUhADwJk7mj0AIarz;3^PQd7U)I*ap36zB<+ShvW* z8TB1J$be=?^6V2wYIb6bt>=sIWqfTZ{qJQCt6x*Gh&3A4PsO4G z!dLU;dZ135#D#)gnAYQrjmFD$zj~Bu=R-O?S)MHCNYE{97){;uq+h_(ZMs<2S+1x( z?R%zS$@H+lir0PqOc)y-`FoeVyia&P3HxdF%eIy^)J%Riaqo)!S!LQG&L+2Y&|}_X zHuy8OX6#deU>nb{$Z5LE9c)a|->6XW{{3Wd^I!J^{;{fa=U+V?hv8523Yf@{f6hH42dfIA= zdWjwbL+N{t8>k&P**dG|rvO~G7#Cx74HEVx?PMinj07;L|l1b}igz{|jh- zZ?$$#@R1(Q<*G|F4>&EfU0QyFn?$@^J^$!n8P`+tj(?h$Np=p)EHw&q?47ZCK6Y) z_>X3KUxuEuy~vYuZ$E#|oI|&`(8=(r$ec0 zSM~if&I1^i6n&iD8EA zzIKt?RziK`F+!5;oj!j*pW39;>=nZx#6BjMOpj7rOo|`_IX`4Je5|Sf-nza&T!czj{(g{TfYCU^+rDhHRXlHQEQe@L^T6v|3NF$x1+IX?10?IkH0W(V_xFATIPyK0=nW)Gyrj> zdFbr_aTvz4Or)a$m5tJf5jF12j07_mFl#?Oo{Xvr_>t;`p-Lz?0vrMH!mnC6IVG2j z)zpty9jmGNp|&T^KOLzsSNK8N{t^*t<~?vqbJbkLE1(mQ@xI1Zy$sT@)WlEP zxseG@xp{fAkjB!^m(ZIDmb>uB*@?Y#N&COF_+K!d6YHuZLKOvtIyPwJ%6XS>GoJF_ zt7=#^At~e)q11E_DC8m%R z2o!`vepa~k3-M;yluSMd%#3FWPT8$-lSu#O%iicZVjs-*#drE*u< z+hZwZ^1Z6|>(i0ABKJpa*Dm0F?MIRqhDG5yw=XqUQB<-lxE&Hhq1L(TfHOsL(yoS$ zEa~b^t{i>YHkIy8h*Bl5<*&nrOy|a#4{DDq>lmcOP@#SAG(dKa`+jD%gM;WjYnQF2 zj+rTPez$9Y`$FCzBm@i=C3+nBXYHe|YVWF7M+~L5+D5dAV!Z}^+Q&Q9{A`1QHZl^J zeV>~0=*I#>LpwocyQ*&=XZG&M76&ea0&+01g0kP9+aP?I|{A*)L)Z@m4GoY&t3KDvA`rbVE0j(0LCVb}2Two=+J1 z3@8K6Q5(fQt;*S8?b{|);%i;nMM19Ie!jnvM{B%C{)TUEWySOJTB1%bTU2(vX1vk7 zBl2bA>{N5=R9ICzrT8!{q-vNhwDf-g!6oJwM^D_EAv`yW*Ug+YYbB(>wN;7FAmH^D zSgGPJ^B&F(d$pOZ_hxb948#S}Rp&9av0i2psJ=aR8tnDDPEhg4D4 z(0EeBo-s~`u6h5%c`c1nrJVY*-abp=J{MY8x`)(!&b+EUc5E*Woj#&SZp#=u#I9c( z7x*a8q&;vu$0~pa7$)?U+-hMG1HN+SYhEh?eh0Y8uI1f41nUf@^MYSHQW23XzlJxC ztmGSr&a$^rin%xGEP!#Pa*=2FY7_s95>2Ao!^1mf)B;_uk_ik>;}HB80|r_gLp3kE z4rAeXB&{X8Iqv^*3*AspJ!I?>Q{NVM%oX1YIU~hssGuxi;T3b6U9);n&gx zDXZ};`F!#n$Bopjb1&}F4T*&?t+bX&k;l?Ccl}x z8)s@sD4^~*SMQeiBg|l^Eoa#@n-w%QZpAE~?LA;5RkPXau;D#By#)_?PzH4wF9gXK zsrjY~d+jTqA1SOP#MnwsBqeDQXwR0UPzEFsF<0Bv(+V`Z3KeSY&Df~4X>hX)&Nv1$ zhdNw*q<~ws@&@RWCIjtybVv7^d}9$w3Qt z$$g(TV&&`1=}c4lO2kvE)oCS=e0qBoW~6mhIgNwvL&;@6;Mc!X4zf8f3-6BKu5cbM zj{gf`bLSf_Q|zrUfrX77KfbKk?CJJU>i1KqxmVnzgFvGBmI|=Hwo~+*va>q7bHc_u zwbT=Z#UWH@B=xO9cr3KL3(Ay^q}N=hAScI;`LhE6p99jB(y}J@fm|sncWZdR!}D8Q z&8>?Qq*EUS7j%-m;*uGJ%vmm->Q1Y4{QT~JVLSS0M_NidCMM-;rfmBXUNF-s>iRuBJ86q&n-y@ID}e~|ii*xkcjyq0;vy)$s*rjykHYxMF}#3qHFmMW zKyEQ>sNZa>D!$_gdG)dN3p7Wa&UWK>ofC9*D*T zW|f^?I=qb7+9~uG$rR3GC4%Gw=hWoeADr^<<=Vtsj$*sH1FC3mvQxxGS0E*uf>+1qA-D!QuAiaIJK^Mp0 zTFfnbvUuYLc_BuPdE{)H`}R5#ZcJzjcygK%C+ThVK23p4QvsCAdA92NTs%3d)# z6Yp_cf|*H@N{Eq#=eE?w^KnV(Br54Hib_4_B&hDG6E>V7;T!Ya8RnOVnAw4KE*icf zrkS(i^Ot^DwOhh;@gC!^{W2aIuC-z+YsIdS6 z#3i&4!XJ9Wuwl+^))^|MuyjU!(xelNYS!f4p{?oHPS#KJ1$$4bpR8Jt1mR4x_RS9GEZyl zLxr1L%eyk6Uny*no6gfxgH{aMx?@NA%b^<_RF+&*7k{Uu`7w097g(iRGQ#;2!M%FjM?TV5g5+VEpeMk}9V=ep3m#+0%zgmJd2|Il&gEq{)~#Qk#{eciY5LI- zR5-GdCAVC!F3VNH%=GM{UohE12TpShhF}%Mg-gLJVhobI&un3@cU{6oU|f++v3n1~ z@O>^)F1y6iakR672-8_c#*Py-CEhefhWyr@1s*FCa$jtr*bBL%5ZX zU;Wra_xL57)FAQML{a>GrLFBfs>H?2oElSS9c_NM>P>#95hF(Ay?!0acQ0?;bA3$1 zCd2#s{ORquIUl2h1YIHf4C31l;&Al9V#l8UZrRx7^qDg*n>BPB+$m(lVY%0m`28Ke zDB^@z^ovq%8!E!DpF`L#V$y5)dOMAqXkrB052s+)dDJSDB)(mP;U@mH!#om>Ot1xZ z(n6mIzUk|A;6MtMUJ`*P1(W~FVSE0}aj>En;B7rbDLd*PNAvY#@d*6<<3~P6MD4~@ zL9M@$OwT=mZd(Lg^x<~}53`=KDG8i@dwr$V1f+?pcz?n)e5_sq<%|Dr5{mfe*>-%K z#d998A;pIAQJp(PcK% zdjYU9xDYm)+z{*Ib=B3=w{5#pvKxxPILL*lV@$0^fT)0=h*3W!=3$KWSC3lG-U0$cV%dC)!a9OXy1FPW^@THQ zD+GEBJ~aX`Vugc)G*45Es>!%n&l`5)tp?Y;nmtUI*Mt+`g`F7Dem~rlwvxjGv^`Oo zDDvs_>boD|^Wy~2zo4AQz)xJ2aNq$2Mo(d}%_ofi+YD49Ca?rqO?c_+@xC9^XT@}3 z^8g6~_MRVdTVX{;m9m;XQ`j&-#Hb#!GQ-aA1DLpQH^T@6D`8{29jH+5y@jvPc>hmuQn z(>5TXkIT#MAYnw!f?6pw7x-tjA?};JjZ~UFZ{DZ!gVg+`#09uouW*uRZf+LLw*nP< zi~9t)#}_Qr{2STlY0EF5BRT-2)2hpx26pju=esOwTJoo{QTV9yyXCD4D-rhdAK@E7 z;Au4WWY&0K-iVLiST}pXMq?JiclkN)D@?z3ltW$6WKSNWyI*>r8IVm~tb%JN zVAB*$)9|@gchkFndWczi)#&57SY_ouZDrl$Ql$0D*Xcri-U9 z%ohYILv!@J>#TQZ5ye8-qM{;U-NPF{L}(qRq$EW&7v>$Hh(2IRwGqE%e4uVJ2;NLD z*)mW-fAnIQ`L4w0!tKXSXQ2N_;q43FMOTa-V19O_nw z1d#LKxdF7nynYMmnRU0Si^`rvD=&Td+y%87G1r4~5Z^7a6jQ*H#4};15lIcE@w*=>}7b*5WEwu?k_R}mmr||yQietluM-7dp4sj>(a5DGDH z@xZ~HOzzFm5=$i39?vaUx0Ne|?QFoYW8Q?f3uk6{xefXc)u_9jMC|1Q0m4yv-IvIK zse(j7u!veT>_E`$rHUzvsHA%l0)*|@iXWws`wv%p9!G2|bL57Q)(92BemSYX_nZIy zf0YV&Qgs!>4SmiMz!<7W;gRC4k>glK2uDeSqM+Znth+IVeuuY+zbXE@Qq})`7N#LD zC&_hI8AK`RN%&tgpyG&}tYNoI;q5}3*<^fM)X)!Xscl&N zA-RjtUcOB0GpfgERv8f^JsT*Hc&;5J3S(AC!pxFlBUYaN_jB{VvIqZ%c->LO9!}jo zP*1GY?RXG2GO&@6+l^tFiGH6L101INf|YdRYVt17F~N_gN9XRk~ zbo9||`(|g%iQ3Hl?}t?R`rmJ7DmLsMfCp|1jmcX>COZbc5C%eRkc4>{4AtDW#VDG_ zt4&tX3s7Y#i6AHd*0+_oHGLNj9upQfUg3kgb;UX&efcb$uZ9e{=MnSYR}gGJ(@%5N zml^+lFSoAD#5%+G5^fj(LSwgWnXSS8t9Hb(k6Xv@Im`n=8tzZr9|{g6#^y+TCE@f# z!Z6NDM*b&TNj|UL`5b;HxJIj?Qe`d3d9}N9|Hx$|<0~!kze)@MuvUf=$ z%4#S1tY$!n$4Ct&cZs=;O<+N&Sw<&M?>YHl=NClU-vi=u082!}(z@N*IfKzr=Op{E z4sZ{|igrHlW@l$F82FG6I6-?EQ8MM=KMMVy-d*_L&(^FzO*Hi4iMs|G#RvyyVIEEt zyt)SX?*LCz-0W2AOh^*~w*S}9_=1H4Kr58t=k0|BHmJv{~v$xM86vn#tvg9oZG3I-9L1mH*@JyCIQNzwqiRw$`}1UzW@8u zUtWiGpCQwEr7SR>w?=y&O3)@hg_RdCTlVhNs~t)2cVpuacBgYG^wDPH>i(gm#Dl}R zl6)m>h15qL&n-+^IZF(fpa`zBl|TLk`j#-v;svyfCf^ds!CSUOgbY(ult9ASMA51&WSz$}*6C_xes1ASo^FG>o&4}Plm)h=VF zDToj4jtA4X+QRD75nq)S5?08uJIhf&OHY`!3PUSlA}2nrWDH=(dKSNzr+I-`{o_<7 z1D;6|=@zWEs4FFpw8gxAH$bOA6-*G6>h~GGh$UKLErdi5W|zB-&v!2#MQxcB9sCWq!N=NT3k5rgLg%321oJ&R`PSx$^nz^^auFGaW zcJ5?w3m8}weP}4WHH;D%LwrOEE0GApFiPKvn-9rY0{O#1?IIET5(ck*O92mpGBscg zD8gl}pyowA4_lb-#CmNDIubgxzBiPk0|5PGC0Hm*gSSAxdv$ks&Z)MY>}f9|Vd@ET zwPXcxM)1>^pBauC9XMM!WYHwHBQ1?OIJ9>sM&E)cF7)oa&H{M(#-O}2cKnzq(; z1(243xw&~n$bs1FkS*|OSyGj{fKW8@H#3x>y1s@TB`e_82~xy^t_z@;lEg)cX-D%w z_RoIq3KFA5(L6 zc;i=|kMOUi${lx3Q%ftIAmPJYx!=^~`ZAq6?*r_k`<1R@$-%ghai8>4b-9yhW&(GpA9#za?3+xBk>7_a9sB9%g3NDvk)4R&37~PJ($i z)?jH{lPbYOMgqYEW&M}PPrd~oY=o;LfuWtpimt|#D?&u){g9VxFBWW}UfoXNQxDUq(Mo-W zL;_au^4qEf|Cx>pmse&HwB{$`>%`PdY#2iFDQxogJW@A8)g=w3o*Wq0#jfpLo?anZ z1YDKQT(92^9%9@3s9XT+LN48#sW{~~fBNdsz{DZ=PQ^-T?ydBeP!>%-zR<|X6J8aU zB&O#BspRXKz*W+mSrD2Y647q3BrdJb+3quH?iv@gc>R56^-SC@`jRqtqQuFDjp_+H z4aHYtv%aV7GO5$9TtrNiNHD^W|8)a7qbPkkJo#iiyjysy`r#XhDXqr`FRbS zettZnTXQU!NzHFSysht7#!$E-WwAX}`MR2!T9&<*exIntX0p<88=t&kxbg0Wb7#S$ zsI&_lK$lW@ZNrjV$Hgd}8{kdCjRLV>4W!m4_^{g#fk;9Q6w5)t0x=jBJw?n4a!sc*1or=$Of*oW*G^s5fLUP@s9(>Cd08ae zE=%{@Ei7EJaB0B{5G-MvDX(g-Txr*1IMYmhc9kU@r#eu+rmqxO8UdMH0cQb832Spp z_vQh+Ec>WMX+smLAQlC{Y(`OesGwZ+1*USFF|Yx8i(s7z-pYA(J47whtz{fCUMNEO z&dVf%P(wZq?4U`a@+H=EQq2;6h0rWlFt1k7cCtVFV$rj*hWb$p*wqzL|Cie0=LXZ@ zn(@)pmr-!frczqYR-A@zc9aqW`B5Kh@3vu+MF&w3&^opUm&^XsnkDQOGTd@=- zr#1hG_8oM2g$ReHmYY2TR(br`P`O^Nb|AHeK&S37=-CI{-icA3mU&@T>#Qbil|uqQ zWUg|beNmFlY=WQa-eQwD6@1H^i2niHRul`B!|rxNwm9?*9|v?QIwQs2n^XybX8tfQ!jn_M{)n- z6x|`ib16X@ZG86!MEV}Kh!pRrX!EgvQjOxaq5L}!2n`vn8u;Seo<9P@3?&BN?t)^SvDu-Ff#;+9-Xt;qVvsW73iR0#gy)*HtNgLPF#-+8^5kM#=r@h zm(YFGxhn0K>-(#6;q2@n^u!o;-g}&(xc`eD@8l&bvR1F1Vruv4?c-#YL?OE>cc=R= zf2$PvMs@o*yv6l7@?gqhZPAn|H-~C2Yo;mv`DkJ>-I*%Lsc^Z6YbZpjAmH8_K?|q> zh{J6p!YLQj8^CcGg$xFzn@XO@rvV5cOC1J|DbgX0y9u;L{XU%~!rN6uBV=q^+e~Cj zDHH#3Yt+JI;NPHK@htnX;ZW(jOvdl@p5kY3atwt&sk8PD;Z&#w&g3#RjpR9vv*|R% z6*Ji~eN!s*W#$3NGy`L_v`X*m^qO%nLhh=gdlGZ~?*01tFtT9Z#i#G;=UzB$qmfB7&|O|$TA-&C0>$R?LvBvYMfqFE^R!B+5Tu8S+JZPY3{tG+!1M%%?+fbne<=AaWI&nkYDq0?ZjmTMDOB(>ct zzo|n({>|g>Z{6&C(<6J&S;xWKQwbDPcISs`o5jcoOKMvDw#p}mwG-Q0tUucHB)14P zn?#TPQO&^plA*tM9&yWQ4;j*W>Gb=+(9lL^^1Ci&GBPrkS7vstWN)OJ#X+;}8%`9=pRC9|h4`7Q$Syo;2?-h8y=oriSsVe%mL<6f7&^b+v#MK!H|Ws_*4 z_`abH{S*|0!Nr&NH?QY?;lI8L{Z;o89-NqX z5r6q(2Pw?cnWOT~(*uU+8*MvQPhb?iszBpjzka=W+qV5Is)x%HyDiKK=E{o^!q6=4 z&>9-k4?HD4r9!`cHATaE9uh|I%#DT+pkdo}m+=CxXwR6t3o3c`9?p%cbs7KqN7f9p z#&ayutTXBHxh2PxGXrpM2Uk=~SLk`eqoVdPyoe$aikrZN$dEng!?xmdFec%HEVjJi zTZ2?Zl#S4qCdBg50et-^!5^(jZYd+S(2gQv>EAB|KlyE;TIWhmO}( z%ZJ)n4TDMSrJ#E0#HaQ`QKmR$N`Kfe4v6h}l~5hki!w?=U_Z0vylKN-PBvD-tN}#WGA@eX99CVw6eICb;9=td!O}F10gP-PyQq zU9MH|a+A7&@@Jk@j1rr0q2t$2(a`9s7g!jz^R|3JO7aMPtQa{FBfEo=a33%fYbVxa zLaq*d$AuT$cma>M_&vAVeI$C2DxryRaj|l)5I9VA`)zFW@+##G>Xwre6Dn4}R9(AN z+GpE)aH#2W&i}U~;P{ho((T))<3KyCKN*HhZ7nEdK=+V z67zXH5%MmPA9vf%Vo*R|F5oK&r$-n;E;{iijQ)sXOKh4vc=)ilv9bZIE}@zEtn!mz z6QJG2OP7Ray87bF!nGuDO=nVf1~)>Ce8emmR>MO&7qOn1N4Em550R|HCPoK;_LCP^ zfL@6O1LY?#)Uier1aT$VXSW&pyo0BoYp{uw@Zp9`O6bq%A`Q zsKG|7qRkIn8%mvLtiRvJXM#QUuk9&~#ITCS7mki54KdR)qcUkZBHcYP3dKc82rvmY zhP0ldi(ztIR-DrP;4=g6az{xMUy|&omcix9qVR#~xSACCi*J`-M>&Fl>u^GZHH@Zr zo0(B(L7>4wM!QPiAUG&!1~dgla1*w94Js=yHv|14PT)Ljn8n&>}{5aE1a%#G{tqK8-*4YKFE_V$;`G=Brx8 zwY(7iDVG}A+4?%B-|axz~*i^SG+VoVgW8nuuPT<4Jzekmc?Z4F*L=Q+o{BwFLf z3CCyG)|Ol8ysx*j2n(mT$+>gKv5@u@Nwng3%=z<2u|*-41s*=!b=OQj^`V2Sd2;|v zYBF8A2m=uASC2N~oV#4vg-Sg+Q?(RnM$dqdE?%ST-g0uBls?)RGiqtH@FQj#-KH_RC_54J-)w6ut8Ddh`s?E|D>;Yk zI(Ya*zuBdwIW@SFClNiNO^^_#z9e5$Hqf}dA z28_WZ+l&WNKl)3xZNqnbN&rHhZX^~0F_!Nl7(IX~2M?|Wg_H6S1_oXQk4;++zCFqf zQ4OBIV8IB8bZzyxspl}C4|O7`YrQ>L8V0*YSw2&^^T+-Cw3}oY{b!aYP5MeF?u@yr zjvX0n4L9LaRn_Q;qaLuw_u$iRIcpC9M(;A3JNKwdD`~c@s0j@Fq?UsW?q%6&8}XfO z+IZ5an8;dFB+#;MHTK5Nam-60=Hy6S1%&)`V|=6mmIX?9r)pt$J< z3vZwDdP2I6ojUb2^tWLX(|8w!{Pj3OS=#R5JqkrQ%OjtM9LDpm&l(nf(V>h;)gl#r z5+OL0t#IRk4r+AFj(%UTWnADUo}-Cw*|dgM#`UjL93J&}(9vr~#rvBR@yIztUeSIj zzA1%-l*if^7w3QlnErkTw=wzZ)#0!#T>t*L`pkK+p5C42n$DY=Ze#q+fs7U&_S2{D zeO5t6LBc8@+IF}&POUA|1lL>=z={bXwvpEqga#8vV>C3r^L6?~ zt@0mu^nQ9L@=6dvW=@Q20>`L}dkj8;Qc7hXM{#~Wf1U|EHJ}mLt>)pP zrQfX$FU1=eKs|~83kqUq@W_n}?M;(8kkN=T0+D=V~jRGQ#t~fPYDH5zm zgtMi$-9ibc%A-dg5o6kIei(?Dmg$Q~Hm_BX({8X>fzaKnhY97RAS6O+R8dv+;SFb$ znx@_QYi;a1#7wCt?1_*`p<7w?;4F1X4i1zOQ{D^QNT98S2{y}?4Z6Ci_^jkHaFxq_ z5b#gRZ3!E36f8VtMYBCD@|-uF3NWYtwVlT5iBC(S!oxkHn(^+OT=%7L-;2cM3k?i= zY0Z)TLE#;pE=)|me)(d|Kuj45>yH!~tvFt8H0@PzdhFB@gHdHyF10wLK5geukFqUb zacgkK>ldHJdNkXI)wEboI4@%DgE(&n27+B*#k$b(aZRvlW8GU@q&&p-sI5=bJ_9~R z$H&iQ=n=RsYlLb)MW}6-YXgQHq5s|5et%7HiXG#WxNWbJnQWEJd(s#zXV9wqTVA({ zYx#)<=qY|9hYvTQOX?)y%jnzM2*-FyEUlC2z%g+fXW$`|=N@9(%T-?;PS`W;Gz2DjG~MjHMNZg>|q+eQB~z+@H- z^c_7O(8!hVJ@zzxpIFp{?oyv8W$Ha| zjPj|`kLQzSNu^{ui_K`eYalCch`E3G;x zI#NOFd5ERK$-q)S@teL`<#DHvWHtAVB1qv5m^0J`iOB#LZh`T4X zx1M|AFmB|?12LWNZpwOQe$&$A+ggNUjz1!2kKB#((g?MJ0F^m&>YUI4fE$B)_Dr9!Z?=ZsBVrnpTONmI|>BavrVUCekmRfmZEz)utUaY@KuXd$nggfGw) z+zC>Xaa^3Yo#c@A;n+h~7F+@I*xm{<8;6$Z^fxfo^;(v09&!o_vnNlU9L@M_GYhZ_ zxpkpKeKuV-G}k$LgwfCCD=ZieeO94jNLlQ~^2)iv-7XBZ9N@ZZml*+CyWI)q*XPpk z%sl?=R_We5&@taFm>{i@xY9-izlA+(>f%Go#%psJY!>R zd*_lGLZB!bF#vHYL#8rQFEHKe*cQ`yXlHUyk?pdARg{%i%p3#n_u3!B+?QUHx}jQ{ z!4`?r3t5141`PpYryYl$O2gX_3Clx~$*~8i>V{fFxA6Oe$?4KbfbFvS^>( zDV*XJbNeN0V?NNzO;X#qrjR%{l4RO)-BwnI>P;lUBCgKQy!`!-d6Q znI|esO7zGF_VG#t)-NE0&uA3ml9l5V*v zWbvnOMM9sGSrZ9KtG#PZH~E@86m)}ZSvB67Qy-=C(a~dK5*U)aV{qJhR$|PILH^;w zsiRdkW({C5ZkuqhAZ6K)Xc^1K+uz>v_hii8q3!&mTlOvtRMwv0?CczJLnF1<7eKe5 z{)b=fnobJ))UU0tnTc#DRnYv3r4Ob|WtPq)bV1snD@x@}l=wsg>yI5xGM?=)m(xEt zqVAY{c7O|6Z^9}l%o7sZELZ9oNSji}{?xJ_VRlPR%P$}u8Ru5hS8M$11dC@kR9|?t z@o|0v!DgOisLNdLsokv)lmult*jkVI7><8u`ai3EV2dUFc}DHh=Ct@+pAK`B z`t15AH8uNr=4{u(Qnism!OsFh5kgF8g~nQ&gMX^;w2#bQKiFV`ZFymL&yG^GI?FV? z^KfG9-3q3V{l3~A1C|lzv+9Sfg0fM076Gs+^OR5hBBa~4S&}BSiv54^lC5;bK-sIh zdsTbObGI&K#byNb1t}UIYGS|5xDT&fNn($z;O159AOO0g=|jV&$jlk$14}j0bJmmH zD`2F#ge|w$|IE{S^_Tb)Tp`Q9!19qfsSUaL`K$Z`lH)%z+70!6Ov_QLTAAxw6L|Xc zJQO+W>-MU4(Kac(iG1WS1C5w_i(7Q<+HIvvisNLOz661uOCfyhjm{oss1v>{XK#mT zfsenx!_5$(e^|62O>5@V)yDgQP7|Fhdpav0cGT8&O)wqHgYS& zgwvnysr8a*^v`JxM#b`m3MlUEqCnYD!g*eRCEiFqGYtoY>AHWu z*bFZu+U7MUUhG*tYH?*<#6Lq)XlS)Mc=LAGkB?BTTHM=vUUepkhuT(sI8wS9qR1D* z3aPexpE=Jzm#D6KVaQk_T1tFK!C%!L*9Qko)aWVWHK4&5l5^0v5g@!4Iq$%hlFHonSPUbc}!SDzH7uGx2I?jKPwlc-cfLn4F$h0 zeZUgMK&SghxAoU3cz^BHV{yS^N>|e)J7jI!v16p<7jTJMnmg|-%{vbp<=&1u+!Ln- zflrn=C7IFV#w5&jy?y!GwPXGB$s3`kled2NS&?PF$a;-+)zG3_mQZI!y4v&)Qf~FL zZk=nN+YX33_~)>XUDmVcqGVEKZB5Ojk1JemRw#)Q{`{HGW*6sP`--tHP1aZ!9j?;b zt3K9?4#@V64EkZD9`83KWt?j&Ev6~*yF@p{iyf6~Y|NLdCw?COE@fts1d z#EHlIJ_Y^0Wd4fz*oqIhIvKN?Ju&U*(OyT7U;kpG*!^;bKGnX=G_Qk!zhvsJ_S13* zOTRFbk~QSdav+4so}bHTCM!$cfEnaY8*pn9H>#b4)GhLmQ<+k?Za-e9j8t8epuPx2 zZbjuTOs-6;l~sbOS>Po60w%qztE*#&`ozW7)=n+0VtciwW{a=?SeV{l^tT;jd~VX(W* z_u1atVu-zKq(kkaCr^4pvzB;Jk$>cWw8}mWe4u_LS;u%uNco(c&*kM?yB<02mF!$k z^IUn8NNbY{IXI~brC<5(YsV4?Lm9!sV<5z?w5Z75paRCm#uASu6Q2oqJn+mJT$CFc zW^p;oa?nAw={BL|S3^T4CEw06?wLP{w5^1&>rHx@oehy;Frpoa z2l|&441<`r1@&DEIEcaA#Y;!Ml53-(pPkt~Sj)a+VkO-laCAGe=)AL2ttxIr7e!q8YSqK!KldlU ziIrV`3Ywl1-_<-evryVS%TVvBYpzc^?JMYfJBg5z;I=r+s{tO#J!IK&KgY-1d}1$3 zzY7=E#L2`I<~k!#f^uV&eg53JW2ZD`_L@8++vydkrtn5TXJb{DD5k^ok8LEPNpNnb zoU?-tTXGkrYiL3SBOrQci3b>x+OsJl$?V=S{|SVpbB=K|aY*RZ%o6^q`;n9oc;+2= zc)qTCxp zn>fi`u?UT?e)?4d<+Z+IcjdH9G?NWC>}Q3~+gXwR=+XSI3uX`e>dX@6vSH_kU{79B zUVcDKt%*qYnNC|d3W6ghK*JczF^U!sY}}hexggW}DybkWP%;AlYRtJUFDF+5!(YoG z=gk-^%W-R-NYR(1Y1s|exx3tP_>^;{M>Xas3LrnG|GN&==bunvk+( zeU4ZhMDftc$ji!7=*TF@RSR!9gxr>=bUrw2)?tbA+9M$*zZDn-(RWsg?RzoyN||zC z&VoeZa=((BJmX{ZPOT1d^M8)_iqz2=J-Qq4US$Ii+4$alTvn?VUx5UoowM#oqUxVN zfAAyAppD$Z%BE!wYq@`~ceofu!5F<pgYj;{TiP+ug3Clv9 zGz4(-KbNX9aKY;@xOKSvPo`$VW2`6pxm1qnCabf|RgeFBGaS>@x^XFDo*J0lh)-Vo zQq^?nD79(f7hJUs*C?qhG%)HLIBxHVZTms{W>OH-*LtA=-TcHbD7j)emPDCFPuX6l z((c5h)`JH}jeE`nlLo5uQ*33KM9y5i_(Wc_kZ$LBnV)=!g)O6UjzI@O?e_~w4#?X_ z@(wv0Wz@IBr|Z)6H>--@UR`(IbinQHpI%OqUjrr1(QEI{;fF^Any1AjM=mv;fWS(y zjRAjMsy>+c^**n@$V;x+S>*^%V=A)czZz>?z4q@{)YTo#de59$rv6}oOu8flybPws z61htU1#|dqh8FBv;fuDzArE${m_1=gd~8mdZ`AtROPTXha7cV6&vv<~XFnu#6EeOB zco1B)R=Q(n9+xO_KXWxDjBxS#e-PHfsb!iCqdU0TEdPV-A7^?M!uwX5-W&rj@UH)IAEl(5Tf~MtNg~H zjs=Yp!>vakAca#ieJQ#%1@`ICv3?Y#rJMxlWPQPA#bj5kr2sQU0pbmrSS*QPV4D5w zZn!F$rmXqe)vFde7b0W(wCw52mzh}j#bD}U?7>*~*jZ3RyO*k^8<$$es$I&luBy5E zEv}{WpTo(|mK^JY!Vg7`>U2@dOTGYgt5^p(_^dGQ(GN5cM# z`8YDu4!~NLaqk~XVPU4VWA2ENBgICJvb~=?cUsiy4Rn|a0fTo}c|A?D{Eqz9zFNX@ zAvBL?e?e`v4a&DNL?t_kk!m~sQ6bR-<(Z@=r{sd7 z4-oELz19VF0+x~5$>Fv03pD~tXMbLTzSgK=&-Yl<FR4YXDEIh>Df zdWDA*>HTAWxs6&rn8B2HLV^YY&;7u0!o~w^aJS2>cyripif9+%rV2r&g?(H)bCcIQ zvO_X_0)j0pr(anA*19kj-9Jijqivh4&TTTBSu>C&+X+s(61}xMoIzE_*3-K9H5_a+ zM@}V-Er74n_j2mMCiOPDf!4b0=u2zA@W)^({d_`1}c*6wj(;Rl6ElKy6h$#D6+pMG|4tdZu;Wpc2qG1R;Z zXHg7IA?`kh)T^h|bI7Dg3Uu;f(|z~;{e|F)DZR?AFP4KUls{%PO|kHgT0Uj%+mk|y zl)q_CL-z_r)*l_+%jGyd>e_|M?&=9E{+yIo%t=_RcKiP4b@LKwK}r}6k}{Y%*m2M3^V^p;4|7jZZ>Q9% zhh=E#>1&Jm9hiH(i)9%0UPULzg_H_Wl;1=oq9{^5EevXT{Wy^8(lPoul-2 zwc*Vd4}u?bH0`1MNaIKHykZ}}$?y90)*Wp5#6mV~S7?y12_W~+`g&n?723m$?*Xud3v)LV1xM(s{&mjUJ=)^Gm}zZr z-Mc&Ez`DgwZ?p&EJmMzhOAIqGG!&vQoXh-;Hm1T!@Pw*m2j^Vy2A&DrQB>FPRLT^l zWC+Hm5LF=i5dIjU4^IJ4K+NdOQ#AeV;47rSx8swa`X9mShb;($z;YkZlRn0SQ}B3+ z*OPG9!vf}@pq!2>P@VfM#Im*ht+{IoD@Oj1Y5bor07tUbrzm-6YU`VP+otQ+)>)6+ z2f#4JOq)4MO6TSCR;{9I)ON^`OT9U2I5^o|<{~CIa{O*;8b$`@&v+hWN?%FUY>wbA0C;SpUL zj!uJ_E*qfir;9lN2(kjcN!e}VsGYl-u2$SN@_AGA;?bin&>r$`nL!dEXg*KgdgS0w zh-dk>4K$OGtQ^(Kd~ar!M*TA+GP3VL`1L%m1j~tD8O7D><|fjS+LEg!iVZ8oI9zZN zL<1)gYv6_0VAj2>ETTl3<~Dv`_v|Z{!wV!EZ(Cf^(ikynR2QmR)k_Q1)-kxg%<&bB zWY*W-qblQWcAaqV7IS#WAnn){jV-$rZeVKV3hPvGz^@ZRToI*bM05vw%7DFMR#d2} zNltg1@|vvxQBU$qsd0puYvRN{T+olFeTThnp+PnMI%fEe9nEhSF(7zx@j=7dr`J1X zr>GKC#r!Db2Rkm0ue~$8z~ktJ%Q41H-BROJFC zI@C8An$SV;aEWroeV}6@^r3FHs7Q;X_sKgoabaqor;`5ygJ+Y^HXRQpGzfyeva+&Z z%i((vdF;K=b}VL<6n1TUIf#_%-Qgr=5LiQJ)N*4^FweNQsaRtyj1<>!pgrOmPUa67 zs*2|DG*Vz_dWu8EQW@^`et-Y@hd!#z9N2l5c=?>4p*Zv7hfe4d-f%_(HyY|KT~l}U z+tS}z`S~*e6NBrGBV=2*@6NnqwMk{pmiG>1$#Mk`pS(LsOP?AneV*>X)N3(&riGdb z9=m8)T;}<)I|J>apm>0lt2pnUM}@@0@`OA>i?9MBx9ay&^)8K#jomv+onBfJRFrDJ z;j?ll(&&kCYkG=I$VgZb@}=N>BLdS|5X(|#!602OxFf*4xxT>%!mR-W(517Yk-Br z#ObJJ%Xhf^Gp9_rL(^=0{Jm6TROwQEJEN1!Xf};*rdW)$8#dyudr>+>CSh?q6|+B_ z83g-$Yj(Y$9dtg6-M+>DYHxBl&v3Lg+Aw1YO&kw8(V@i ziN&Ek;Ij6cgky5*jUi^{qyJOYs`Srs`mwyHAbcL`H4@h0r%(H7uH!3jm`~4cv=VLu7 z1m^SLc_m%~dhnQlc6&4N!1%{Q9`F57^&)=Q7EmBqw9;3Iu1D&7$zBIw`xI^}hHkXcH zAqXkUAwLc%mev*cOt7x zmi8QkA5&GOwf}ic#PjVy8*IC;LVw)VDMADz284_}ymu6+nfr%r!O5B>;LA66&faLs zjX!nz^yCVZ=f>a7ZE_rr-#7d9?AavOIRB%q8iP+Oqb=&h1D^*$)Qbw0f`=}o180Sh z<_#g(FtFD@lC2Fd?lsAyc}dsQb*&~er61Uc@h^?n!v-{Sc=jHcLJ7_;bMvs@gJepW zQEDbds#NtcKESOZELo@5{vMZlM7!_j&nw}GZIbs#a)6)w`jvGmy>qq3oDV;oXda5n z9Z?up0zAqYyU>9%3bH5a)R9~4anP;5bX57w!>k2EvQ@3``YBf^DAm0)U-H*o=&%+y ziH%?RQS;&^Y23=wBcoLOv-7FE%u8wYE2-YrtIuFkhcF(J_N$$$^o;thVfQ_o17gPA z*Y~+Q6i;kKlQQWiXL7+*gF(4w>fV7NoC$c0BMpl>N(FCL-)v(RD!eb~L8>}{2zDSm zSRJ@6$b3RVbwv(Z5|MYfBY$(Zc-s+08e~5P%g>$X^6_PxT@e#^jVM}o#2Pv`aS_go znYFvNxgyS~-#v%&uTPTSbHWelA9-Gu{D(CjpYBV&)wR(3G%5DnbS86k z{-I`DJmOAPmVEkX;9>Tc7nnT3sB&A(9BU6L+bSw{b%pKR>n>a-4Rg*?gEP3zXw@-) z_aNo5dwETL^6t(F{hu|e#2OXL@cgt$9?e5jy(}$lZU2^5zRtvrYV-DC9d+!xF*gz! z975`LH|>KDEQtRLi|{tol@SkrB^bJm9WZE6V$*eysMVjTk>EMrFJrN~Gz0~oLbRlP zeW&Z`q?EQ93$N?A-g`djY(rcpx3k-Hm=AUlpx?0Uqs%+E*`{$3*V=k-ebD&n(q+51 zac2^uq9dGsj+5q*3Xaamfs(_jMt+6CVPf!t-4WM=N&oPJR0 zb@eS2Kabv;2K30S`n>pp#m|9#C1;-d*%Dz4GIAkP6NO2>K~nJ#L}r*ND;Q={Dwjp`X7pg^sC3T+lT;JYg_lFUG$r(oUKsplYA^fhruf0_m!zXxuZANAlAalqq(JMQSzAfV2XYEwm6=Aj= zQH;x{N{{k2KJ#Rmi`gD#UE;mOIKM0e`N?A89+rH3`$&;-U`vt=h69XcwUJvUzxcb% z6UAk8l`3KQw8@}U&u8xV>5>}YLnp6b zB1UXL!zCJ5H42Awo&CF5ko$M~d{}^U(|)BX!N`{l6uMVBguhO3Jsmf6p_Z2Xr(X%5 zVZbkhdJ1T7{wD=rR(mDgFW7xM{S+(n4$MIsdDtt74c?fo z13J-_OCzfAE~B5~44co`y^rji5VccV+q-;tbYAip;rPyf0^Fl~eT2w}KRNB|lVv2Q zIwkuH(X&cJo^ibkoPlV`PqU={({FGd$6I<4TB+ug( zs?O7%{Ki|_S<53l;`V*2qpvd=0rz&>(xv?yZawvPFt7>QgN9IKsiB}8PR)<So3xOq`?X!m9U()BJt;IN94*Dt7pM`{wduJ4c=eSI^}= zOG5XTXgmrU2^%M>|6LImYr%!`6vKjpbIOO%bbPA02=uz#K4QV_G`7UyO2Z@XX5g8R zdFW?c2)prsPTJh#hPA0-N*B$b@5@$ro-0HX5kd7P49OxH0@DG3p#A6oG7)czp|bpG za`IB=47hno&iC7(K@QV;4plb)`41ow+GsJ$7g%?u(F>C^OZ38j96+)Z|8c~#J&ZIi zoMf}Y$os5jx5xbP_o8!+!kwUetaBm*G z+-wc)aptUwI0Qi7&KgJI$!<4 zzSX$u4cF|H{H)fUKVQs*n*&VOMoJ#ysa`eyLLQ&^6H4to_l;U)@0q%G>)u@xmObkG z%lGfsi_#9r?T-IQov95Xmybto8vc37pUY^};V0a8pD6iIjNL3MYB&>m-u8jv5&3+$ zdX1_bxfjD`xqZ8N=4G!dqb)}~yMgdeNB)wC%Dum3DJB!5f;)o=$Or#mjVS-{soZ~P z@aOUyimHno9UNAv+RWPdyTG=&dcvB*K|-%|sS!eOkk$AK*(z#am`O)g` zqf9{;MV$Wnf^;#2p&1E}Lg=fwbLWcE@5&XMLDPF1EwQnh%>VwC+C9TqX0gb zUo3weQ=aZ!{Du*yIVB@lu4^A9^brL#ol+$fi0*tB#2k<)U8&=cv+gnMVmTs5$-D0n zE{>z6T>{5=jl48lgoRPcwby^G-He_qy_*X4#ozZlP!ehs$wki^Hf zIB2%1a1G|=<{G$EfWqHJ6v>@14`#e`H99gq7FYXScrWyLV#?L5>G_CDWElNchT(MM zF%-lPqqP2Mt1ej!=a&AN8`dhBUn&b79#ePNQ^?&|{{INXS=OCPF9EeSR0Ard2`JXNpPkX6{O%ovoE4RoyGo(N6b6rJukYqr1;UJXn?s*N!^C3oy6chruhYkF|4X(5!vG% z8!m#$6j~!ilw&w}QsROUvS{Q-H8eCV;ukws)8(!imETNCg)C6rG7|fvqoO`$o9JY% zL^2@czl(q8edpTtxuS*=;RM%;w$x>Wd4^k#?SF$|6R}@r{Un|yq3c*7UhgaANI)so zIWs>uH=It~v7X5SlfTqIKS4LW5M-%l#yRS9C$4ReS0XQ<#6)r$5MB5t;1(QyR{#y> z<>mQz=5p}B2kTO@5Wy{6v?ibU^{ZF66giUA;Z2Lzey63{hoCmx@b|m7Z;O$vO2x#d zm6#O3Oyu6a9dTz%B;E_QLL&YQxr1KZBHEg!_kQ^l^|HSA4y9HurmS26zpY*h zc4KX2HJ6QQWB-H;PG{acIt$iw9q{zLc`0M_=1gJ+q}Y*_Cl{9rA;od6yFIAK?D;+XdYay2K;g)*s4K19HEA`*!!?iFL_lXX3UP zA6!~7W@9?GO)ZqT;V4B5-ComWBT3a9M|C>>#d)9RKEy$Gt}rsf?Zny@gIRoah_vk~Jw{P!{ldE7By-Z_JjnDe!j8ldkJ&ak_Wa{lQhR8t_uQF$pbS_>AO z20OpF!@@ij1VI+4Y#T<>GtaP^43CKT`W%|Q#=Uau-15E{@KPP{qs8zPm0ReTK4rVJ z(b##5#Mvgq{4rdwN5`6J1N@)?8Q%9RSElQimwoyiLjLOALFDaOhT3sgpsqD_LOi)p z1021J8Stm(!Tz%e5>tU32Ol!|K8+fm$@X%r;NheKlqK7AnTe}M=#v=-1rsrh^JFB? z>_zt|FqGG?U*8$fb^k1oo6+2q-?^vv?}zr?E=(dscZ(zRaAHP=+9dn3Kyo4FM~%{a zJB_A%G%>@E{fIy~hDA7@V^xLWh4L+IC4bbMq#>IqnDe<_qh-aErnCVPZ~sc|bru#D z(@9lg9eGm_zhTGG#A!(4@a9R8UptYsL>EUCc8o-l_Xt4@CD=s%ZXKt-c9vEzt`cmh zs$azn$6`v`r(aMcOeb#&IZsg6u3gt+@zizLicN1F<1+G3kRVx1eRUx2?s+%zwANwh z#no|Uas4-9xkghVCSSP{9Ivwe{^>T92nIZ8De3lECueRyN|v841DhfMJ&XC{VxKlq zo`?ff*oMU4B4AuwzWbd|LeuoeZ3H(l9055?UTV-FT`Ip=;5mQwVK4hDx6wyfbr(b6 z!jn^FCcZ~&Bb@j-7s>2!15a1Jfoc~1 zHQR$(L!nX~H*Ffm7dV=MJyVu&n*{UgX@TiL7l=UbE_Py8g~xTTC zF0w297s0&C$;j-U@)N)+aH^Zci8C&`!iKWm@lcHTx(ERb(K-~rV)-vaB|0ZkOtN$B zcT}ntZ1o|jTB)y?z;Pc&ZCbmPT7nf?T!t9h3t2$voW2>pH*Va}ENKS97@5~f51|;E zgdlnX*z7pt(!bOZ1SnkGo|=d&;g~-p5=FYM$9(;>;=4uH7$2@@PUc~qxm_KKwHXSAz4?(z>vl;!NDH35%pW= zhqinLxSRaA?~QR`vZlP;==lMgcWP{I&vrfR0Adv^jzRS!mYCffAmkJkvP(wolSoTC5oTv(cXkrLZ`A(32Vf65c7&(iI z!g}MzMUVpIG+z~JEd zxC)&J?iDNEo|O6h-d!J7YOJ8QSHacFG_uu=jmeKk#%bG@Xdj&3G*-Bu>gyN6qyGT55*$;;+@d&^2}&)6uf>t@5PH3+FA3T$IaasFZX=Rm@&o+owp31wz?i|3#Din zC#l@Ti2+3EFd!u*oUO;^8OCAN*IC0;S2luS-bW<*h(_yZpv0Ht4yC|Q=jdj;jP~~R ztyNO%RqKw5e=W7w$&U~JRgn7#AUZ1=N;sUi`%kY2pre0wQ)T5GG-IP>{g*|VB7zV_ zRoaFv@2c@^nYQLXF?sX$tv~KJaWpVa;kNUVDS#riq35Jp-_+GTpv5|SM#736A51Y?~hCfVl%_jEG5z;iMJI9dX5RLW(&RCteSB z*&Bi**PU1{Ydbp~E(|67v^7GXpKp}Ah_)^l`O=tW_(lz0Z>=_^CQ~@BY|L_RQadBa%yf1`i$T zi$nbt4s`*I?(f7B+ru~7H%Eq_SxLkdHXBQksc_}WxCfgBFaUT|1-^jxNn^u?u>@7U ztgk=JzakgjH`P2K3)dTP!>W}lC49vG($aHA^d^Nt=*(yx$YT-_h|tYq^!lhZYu9#y z;ys)QmIut-iMuU+jr;GP1Asj4(B6m$3?bxYu;Wb#xu_KfMBD<7*qKPxCEVg`^WQ|#n|xD z8GbJR)dJYB@u;q;v1EBDncdk*H9F08RL@SfR;L`y?X?nA(} z3iIas8RKkv9hf)O@pUKMHXfWdM3RUU4;H7O#)aI8jUmGHh<(_Hx9tbXXd+Z&ZE13J z!FiPHn_l1TMYGuvwEq61M;h#d3lN7j3m5rg?@Z2&$*LRG`v9)(oV$WGvSF` zi?#<4GC7vx-;7{*;TUhh4u+)!vw}aL{}>MK<|shb3XPQusGzlV(g#b z*?^R1Q=u>J9%BQkJcUvh>4$aw z>FU(RcrrZjQ{F6edKDQ}w;bu5P$seJwXfa8Z{8UwWm=L>V022IVs|ko7X)Im!d}p0?%J%W<-m>>@m)gN0%1N6H3?UokhB~eIHfy>8-m!|AchYB z1-T1OO-Y)!kD1dVnj90fI-obrrHHsedfOIWAyLVC&6+C8=xRTI@h6?#JlSF z+KA@{CK*}T*&<<%t6JRm;`v6en7-~oM6}ad%ldJrhD(LT>Ktylfyw@Gmr1AZ+LWXF*@IvJuu3dx=y zhCG`4SArk~pVt8a@G5nNB z$L8o2u`E>aLY^a@7tO6FuJ!WDqG;f{G30Cwzlomc>au7jsbJ%0RHOlF{Bk9L}0xy?T;tOvV8H%!f}rcp$j!=t={ z^*|}G8{>bV>de!XZ&hDE`X|>hns69_1@{@Mr!RdyI;Pm{`TlvbBHo?kwVM>;B2|$- z>1Ju^06551HZS1Qf#W(#@C@XySM}LUNiJALp|IcPo?Op<1EuWgN8( z8O-8C(9<%yN7AlcI}xnH3lb?VeNGv~Yl+SHp=^>Ek-$yA-`Cd*)LkTyv$iuUD#8Yb zb&v{;9xNp#vWmo%oI#;ir}h~6%oYe^;qxRc5{&ZEQZ$onJ;5f@?Pnc6ypGvm!bBRMLtl0WIKh=oIwG$C|19!b+D0!n9=AmV zuZz$vkzf?7zxKiH9L^XKI3uhM{N%o%pgyR0S27Rn0V`NJMB z%NPZ)b(sAeNz#OXL-+opA((&KDn`Q$6%o6Tre>KF9wC(jdrA2yR2!(!dJ|(Q*ATb% z!RN3!s?AR#s#~94Yq%K#w6YEbK!H1Us#r%h4e&kq|tx+7Q7Z945OQX^%Cj;*#z>^zh`4&Z= z2rxtP_)d1-95t7Rep;PmIwKTgTt_=%x9+e%MJ)dQEXzwJbip`~2Cx(7QL%jzkgs}* zcn}8GKq_MN3qeIqgFF9uI4!LtLx@3J?mIrd+&v^xX5Mvzlun~iM8-4%#?3DvAk!`l zd14n(ED=h_!(c{Hbk%~tTgLz0-%7V)Ht*O5C{-1@UI@U2lPP9lsIaKvOB%|hB-usB z1=s%yDQGr^E{g6$Xg_)b=3o#zbSiikpRQ#pz-0SbzrPI^Ixc*f?p|}n0ofs0K zkKslTbQfhwbq3~FP0&_-s5$XxS*}m4qV~y=2PBfbm}WTyTvkj<5yC>OPPZ_|Nrv_H z5plLBRh_#-Myt|>NdR|*Oa!2#xUqLn!z~7LN6GB_C_*ApNW20@*iSa)zmfL0`p?Cl zH)!x+LH3GaD`D)3NHWn_+=Cl7;3nP$Z$BT`Zr`o`4hw(L3beou3P39|y)aZ&{9w(aXV=CoL2 z@{w#5mVN|=!|&Za{;ctT|5rpu2nlg}Bca88nvp5N~Z?p>HmK|Xx^%y-#$@!duC*cxfg0v|JM&G^vOP! zF?ZO$D+twIp&Pja`}6Ov_1w-R&8mMSgzcAeW8G)qx02)ryeB^qgVqJU6G2S?lySSi{@UPW?2*TiN1wizuvbU`XF+l^t6eqH* zuBwUnN(}3ztPslF0qt%A_(wLJKhPK5xIegZeECqY!ym{(6g4uw3&?Wy#*O2y4C2hS zN!SeM|lcc&x+rZX8zaEXgIMT?q#Z z0>NB6<2g*C_2t2YAOQ_H^?c>ENKPu5y_$?X`;BU#wvYxY$;w9Du2p41W5@?0@?P{A z(oSaH1ZYjBD4UwvPO9LYn5VnkinC2z7e2O3oKwrtnyr-XstXoG>_Rs&`b^ALqhrZa zsc1!hDRT6A>tYbz47YFRbz9yPBWHd2;lm-ew4-xK&{j}Xghvsyi^%0A66uWEcD=x> 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 literal 0 HcmV?d00001 diff --git a/docs/notebooks/generators.png b/docs/notebooks/generators.png new file mode 100644 index 0000000000000000000000000000000000000000..4eac51297d447418246d6903a9897fe44744fe4e GIT binary patch literal 81669 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�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 literal 0 HcmV?d00001 diff --git a/docs/notebooks/graphix_workshop.ipynb b/docs/notebooks/graphix_workshop.ipynb index e9c850a5..912bdcde 100644 --- a/docs/notebooks/graphix_workshop.ipynb +++ b/docs/notebooks/graphix_workshop.ipynb @@ -1,65 +1,35 @@ { "cells": [ { - "cell_type": "code", - "execution_count": 1, - "id": "45687b1a", + "cell_type": "markdown", + "id": "0d360e60", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'\\n- diagrams + syntax (building blocks + types)\\n- qubit teleportation\\n- evaluation + backends\\n- interfaces + extensions\\n- distributed fusion\\n- distinguishability\\n'" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "'''\n", - "- diagrams + syntax (building blocks + types)\n", - "- qubit teleportation\n", - "- evaluation + backends\n", - "- interfaces + extensions\n", - "- distributed fusion\n", - "- distinguishability\n", - "'''" + "# Optyx: A ZX-based Python library for networked quantum architectures" ] }, { "cell_type": "code", - "execution_count": 2, - "id": "28076593", + "execution_count": null, + "id": "9ab492f0", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "22456298", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'\\nDiagrams + syntax (building blocks + types)\\n- diagrams are syntax\\n- function and normal syntax\\n- types of diagrams (qubit + mode, classical + quantum)\\n'" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "'''\n", - "Diagrams + syntax (building blocks + types)\n", - "- diagrams are syntax\n", - "- function and normal syntax\n", - "- types of diagrams (qubit + mode, classical + quantum)\n", - "'''" + "## Building blocks" ] }, { "cell_type": "markdown", - "id": "22456298", + "id": "b362a4dc", "metadata": {}, "source": [ - "# Building blocks" + " ![generators](./generators.png \"Optyx Generators\")" ] }, { @@ -67,12 +37,20 @@ "id": "36f0ed2d", "metadata": {}, "source": [ - "## Photonic generators and syntax" + "### Photonic generators and syntax" + ] + }, + { + "cell_type": "markdown", + "id": "a62bf012", + "metadata": {}, + "source": [ + " ![photonic_generators](./photonic_generators.png \"Photonic Generators\")" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "id": "66790776", "metadata": {}, "outputs": [], @@ -82,7 +60,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "id": "13dbbb3a", "metadata": {}, "outputs": [ @@ -97,7 +75,7 @@ " \n", " \n", " \n", - " 2025-09-16T12:01:49.627815\n", + " 2025-09-16T19:38:12.041220\n", " image/svg+xml\n", " \n", " \n", @@ -126,27 +104,27 @@ "L 151.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pccfdf2b943)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p1423168275)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p1423168275)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p1423168275)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p1423168275)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p1423168275)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p1423168275)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -452,7 +430,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -473,7 +451,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "id": "5623660f", "metadata": {}, "outputs": [], @@ -483,7 +461,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "id": "79ab4b08", "metadata": {}, "outputs": [], @@ -496,7 +474,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "id": "cc4724df", "metadata": {}, "outputs": [ @@ -511,7 +489,7 @@ " \n", " \n", " \n", - " 2025-09-16T12:01:49.762468\n", + " 2025-09-16T19:38:12.158722\n", " image/svg+xml\n", " \n", " \n", @@ -540,27 +518,27 @@ "L 151.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p6078395994)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p9153d3b25a)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9153d3b25a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9153d3b25a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9153d3b25a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9153d3b25a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9153d3b25a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9153d3b25a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9153d3b25a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -1033,7 +1011,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1051,9 +1029,17 @@ "hong_ou_mandel.draw()" ] }, + { + "cell_type": "markdown", + "id": "a869643c", + "metadata": {}, + "source": [ + " ![HOM](./hom.png \"Hong-Ou-Mandel Effect\")" + ] + }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "id": "801f0884", "metadata": {}, "outputs": [ @@ -1063,7 +1049,7 @@ "{(0, 2): 0.5, (1, 1): 4.9303806576313227e-32, (2, 0): 0.5}" ] }, - "execution_count": 8, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -1073,17 +1059,47 @@ "hong_ou_mandel.eval().prob_dist()" ] }, + { + "cell_type": "code", + "execution_count": 7, + "id": "f1478f68", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(-0.+0.j)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from optyx.classical import Select\n", + "(hong_ou_mandel >> Select(1, 1)).eval().tensor.array" + ] + }, { "cell_type": "markdown", "id": "aa602937", "metadata": {}, "source": [ - "## Qubit and classical generators" + "### Qubit and classical generators" + ] + }, + { + "cell_type": "markdown", + "id": "d1116b59", + "metadata": {}, + "source": [ + " ![qubit_generators](./qubit_generators.png \"Qubit Generators\")" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "8d45cf0f", "metadata": {}, "outputs": [], @@ -1094,7 +1110,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "c4999dab", "metadata": {}, "outputs": [], @@ -1104,7 +1120,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "83c7f83a", "metadata": {}, "outputs": [ @@ -1114,12 +1130,12 @@ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-16T12:01:50.909420\n", + " 2025-09-16T19:38:12.951413\n", " image/svg+xml\n", " \n", " \n", @@ -1134,81 +1150,81 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#pdedc3736d2)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#pdedc3736d2)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#pdedc3736d2)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1359,7 +1375,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1369,7 +1385,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1379,7 +1395,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1551,25 +1565,27 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1581,14 +1597,14 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "\n" ], "text/plain": [ - "
" + "
" ] }, "metadata": {}, @@ -1596,12 +1612,12 @@ } ], "source": [ - "diagram.draw()" + "diagram.draw(figsize=(2, 3))" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "f7f0cf81", "metadata": {}, "outputs": [ @@ -1612,7 +1628,7 @@ " (1,): (-0.7071067811865476+2.5978681687064796e-16j)}" ] }, - "execution_count": 12, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -1621,9 +1637,17 @@ "diagram.eval().amplitudes()" ] }, + { + "cell_type": "markdown", + "id": "06cf6718", + "metadata": {}, + "source": [ + " ![classical_generators](./classical_generators.png \"Classical Generators\")" + ] + }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "7c1af845", "metadata": {}, "outputs": [], @@ -1634,7 +1658,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "e43b8f77", "metadata": {}, "outputs": [], @@ -1644,7 +1668,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "4e217d96", "metadata": {}, "outputs": [ @@ -1654,12 +1678,12 @@ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-16T12:01:51.044675\n", + " 2025-09-16T19:38:13.051217\n", " image/svg+xml\n", " \n", " \n", @@ -1674,115 +1698,115 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p4ca8639a17)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p4ca8639a17)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p4ca8639a17)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p4ca8639a17)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p4ca8639a17)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1933,7 +1957,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1943,7 +1967,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1953,7 +1977,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1961,7 +1985,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2133,25 +2155,27 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2163,14 +2187,14 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "\n" ], "text/plain": [ - "
" + "
" ] }, "metadata": {}, @@ -2178,12 +2202,12 @@ } ], "source": [ - "measured_diagram.draw()" + "measured_diagram.draw(figsize=(2, 3))" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "id": "be987eb1", "metadata": {}, "outputs": [ @@ -2194,7 +2218,7 @@ "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mTypeError\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[16]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mmeasured_diagram\u001b[49m\u001b[43m.\u001b[49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mamplitudes\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[15]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mmeasured_diagram\u001b[49m\u001b[43m.\u001b[49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mamplitudes\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/optyx/optyx/core/backends.py:144\u001b[39m, in \u001b[36mEvalResult.amplitudes\u001b[39m\u001b[34m(self, normalise)\u001b[39m\n\u001b[32m 137\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 138\u001b[39m \u001b[33;03mGet the amplitudes from the result tensor.\u001b[39;00m\n\u001b[32m 139\u001b[39m \u001b[33;03mReturns:\u001b[39;00m\n\u001b[32m 140\u001b[39m \u001b[33;03m dict: A dictionary mapping occupation\u001b[39;00m\n\u001b[32m 141\u001b[39m \u001b[33;03mconfigurations to amplitudes.\u001b[39;00m\n\u001b[32m 142\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 143\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.state_type != StateType.AMP:\n\u001b[32m--> \u001b[39m\u001b[32m144\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[32m 145\u001b[39m (\u001b[33m\"\u001b[39m\u001b[33mCannot get amplitudes from density \u001b[39m\u001b[33m\"\u001b[39m +\n\u001b[32m 146\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mmatrix or probability distribution.\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 147\u001b[39m )\n\u001b[32m 148\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m.tensor.dom) != \u001b[32m0\u001b[39m:\n\u001b[32m 149\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 150\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mResult tensor must represent a state with inputs.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 151\u001b[39m )\n", "\u001b[31mTypeError\u001b[39m: Cannot get amplitudes from density matrix or probability distribution." ] @@ -2206,7 +2230,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "id": "f02f6b44", "metadata": {}, "outputs": [ @@ -2216,7 +2240,7 @@ "{(0,): (0.5+0j), (1,): (0.5+0j)}" ] }, - "execution_count": 17, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -2227,7 +2251,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "id": "14fff50d", "metadata": {}, "outputs": [], @@ -2242,7 +2266,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "6d735aae", "metadata": {}, "outputs": [ @@ -2252,12 +2276,12 @@ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-16T12:01:58.617450\n", + " 2025-09-16T19:38:24.176532\n", " image/svg+xml\n", " \n", " \n", @@ -2272,245 +2296,245 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p994ba9ada5)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p994ba9ada5)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p994ba9ada5)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p994ba9ada5)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p994ba9ada5)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p994ba9ada5)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p994ba9ada5)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p994ba9ada5)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p994ba9ada5)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p994ba9ada5)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2640,7 +2664,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2650,7 +2674,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2660,7 +2684,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2668,7 +2692,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2678,7 +2702,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2688,7 +2712,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2698,7 +2722,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2708,7 +2732,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2716,7 +2740,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2724,7 +2748,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2796,13 +2820,13 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3057,10 +3081,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3072,14 +3096,14 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "\n" ], "text/plain": [ - "
" + "
" ] }, "metadata": {}, @@ -3087,12 +3111,12 @@ } ], "source": [ - "circuit.draw()" + "circuit.foliation().draw(figsize=(4, 4))" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "d77483b2", "metadata": {}, "outputs": [ @@ -3103,7 +3127,7 @@ " (1,): (0.25+2.0526832973508108e-48j)}" ] }, - "execution_count": 20, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -3120,9 +3144,17 @@ "### Qubit teleportation - function syntax and backends" ] }, + { + "cell_type": "markdown", + "id": "668cadf7", + "metadata": {}, + "source": [ + "
\"Teleportation\n" + ] + }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "47e64a7d", "metadata": {}, "outputs": [], @@ -3135,7 +3167,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "id": "2049d62b", "metadata": {}, "outputs": [], @@ -3156,7 +3188,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "id": "cae3c5a8", "metadata": {}, "outputs": [ @@ -3166,12 +3198,12 @@ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-16T12:02:00.987603\n", + " 2025-09-16T19:38:27.093021\n", " image/svg+xml\n", " \n", " \n", @@ -3187,8 +3219,8 @@ " \n", " \n", " \n", @@ -3200,162 +3232,162 @@ "L 367.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pc9c50f2ca7)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf987ac8c38)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3747,8 +3779,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4190,31 +4124,48 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4223,9 +4174,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4234,9 +4185,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4245,9 +4196,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4258,7 +4209,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4278,7 +4229,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "id": "393f7c4a", "metadata": {}, "outputs": [ @@ -4289,7 +4240,7 @@ "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mValueError\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[24]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mteleportation\u001b[49m\u001b[43m.\u001b[49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mprob_dist\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[23]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mteleportation\u001b[49m\u001b[43m.\u001b[49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mprob_dist\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/optyx/optyx/core/backends.py:169\u001b[39m, in \u001b[36mEvalResult.prob_dist\u001b[39m\u001b[34m(self, round_digits)\u001b[39m\n\u001b[32m 161\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 162\u001b[39m \u001b[33;03mGet the probability distribution from the result tensor.\u001b[39;00m\n\u001b[32m 163\u001b[39m \n\u001b[32m (...)\u001b[39m\u001b[32m 166\u001b[39m \u001b[33;03m configurations to probabilities.\u001b[39;00m\n\u001b[32m 167\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 168\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m.tensor.dom) != \u001b[32m0\u001b[39m:\n\u001b[32m--> \u001b[39m\u001b[32m169\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 170\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mResult tensor must represent a state with inputs.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 171\u001b[39m )\n\u001b[32m 172\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.state_type \u001b[38;5;129;01mis\u001b[39;00m StateType.AMP:\n\u001b[32m 173\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._prob_dist_pure(round_digits)\n", "\u001b[31mValueError\u001b[39m: Result tensor must represent a state with inputs." ] @@ -4301,39 +4252,7 @@ }, { "cell_type": "code", - "execution_count": 25, - "id": "f7f2b98b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[[ 1.+0.j, -0.+0.j],\n", - " [-0.-0.j, 0.+0.j]],\n", - "\n", - " [[ 0.+0.j, 1.+0.j],\n", - " [ 0.-0.j, -0.-0.j]]],\n", - "\n", - "\n", - " [[[ 0.+0.j, 0.+0.j],\n", - " [ 1.-0.j, -0.+0.j]],\n", - "\n", - " [[ 0.+0.j, 0.+0.j],\n", - " [ 0.+0.j, 1.+0.j]]]])" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "teleportation.eval().tensor.array" - ] - }, - { - "cell_type": "code", - "execution_count": 26, + "execution_count": 24, "id": "c8dc0076", "metadata": {}, "outputs": [ @@ -4348,7 +4267,7 @@ " \n", " \n", " \n", - " 2025-09-16T12:02:04.440497\n", + " 2025-09-16T19:38:28.499960\n", " image/svg+xml\n", " \n", " \n", @@ -4377,12 +4296,12 @@ "L 43.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pa82ae975db)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pe9aae0f422)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe9aae0f422)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -4507,7 +4426,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4529,7 +4448,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 25, "id": "bb29783a", "metadata": {}, "outputs": [ @@ -4539,7 +4458,7 @@ "True" ] }, - "execution_count": 27, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -4555,7 +4474,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 26, "id": "8c0301af", "metadata": {}, "outputs": [], @@ -4569,11 +4488,17 @@ " b = (\n", " Z(1, 2) @ Z(0, 2)\n", " )(a)\n", + "\n", " d = X(2, 1)(b[1], b[2])\n", - " e = (Measure(1) @ Measure(1))(H()(b[0]), d)\n", + "\n", + " e = (\n", + " Measure(1) @ Measure(1)\n", + " )(H()(b[0]), d)\n", + "\n", " f = BitControlledGate(\n", " X(1, 1, 0.5)\n", " )(e[1], b[3])\n", + "\n", " return BitControlledGate(\n", " Z(1, 1, 0.5)\n", " )(e[0], f)" @@ -4581,7 +4506,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 27, "id": "7925be20", "metadata": {}, "outputs": [ @@ -4591,12 +4516,12 @@ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-16T12:02:06.752830\n", + " 2025-09-16T19:38:30.063428\n", " image/svg+xml\n", " \n", " \n", @@ -4612,8 +4537,8 @@ " \n", " \n", " \n", @@ -4625,162 +4550,162 @@ "L 367.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pe52c7721f9)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7f8fb09554)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -5172,8 +5097,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -5626,9 +5470,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5637,9 +5481,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5648,9 +5492,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5659,9 +5503,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5670,9 +5514,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5683,7 +5527,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5703,7 +5547,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 28, "id": "499fe3f9", "metadata": {}, "outputs": [], @@ -5716,7 +5560,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 29, "id": "936fd7d2", "metadata": {}, "outputs": [ @@ -5737,7 +5581,7 @@ " [ 0.+0.j, 1.+0.j]]]])" ] }, - "execution_count": 31, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -5748,7 +5592,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 30, "id": "a1feb431", "metadata": {}, "outputs": [], @@ -5761,28 +5605,50 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 31, "id": "5139ef70", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n" + ] + }, { "data": { "text/plain": [ - "array([[[[ 0.04264946+0.j, -0.04264946-0.j],\n", - " [-0.04264946+0.j, 0.04264946-0.j]],\n", + "array([[[[0.06248093+0.j, 0.06248093-0.j],\n", + " [0.06248093+0.j, 0.06248093+0.j]],\n", "\n", - " [[ 0.04264946+0.j, -0.04264946-0.j],\n", - " [-0.04264946+0.j, 0.04264946-0.j]]],\n", + " [[0.06248093+0.j, 0.06248093-0.j],\n", + " [0.06248093+0.j, 0.06248093+0.j]]],\n", "\n", "\n", - " [[[ 0.04264946+0.j, -0.04264946-0.j],\n", - " [-0.04264946+0.j, 0.04264946-0.j]],\n", + " [[[0.06248093+0.j, 0.06248093-0.j],\n", + " [0.06248093+0.j, 0.06248093+0.j]],\n", "\n", - " [[ 0.04264946+0.j, -0.04264946-0.j],\n", - " [-0.04264946+0.j, 0.04264946-0.j]]]])" + " [[0.06248093+0.j, 0.06248093-0.j],\n", + " [0.06248093+0.j, 0.06248093+0.j]]]])" ] }, - "execution_count": 40, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -5793,7 +5659,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 32, "id": "6113a332", "metadata": {}, "outputs": [], @@ -5805,7 +5671,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 33, "id": "f24413ca", "metadata": {}, "outputs": [ @@ -5826,7 +5692,7 @@ " [0.-0.j, 1.-0.j]]]])" ] }, - "execution_count": 42, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -5840,7 +5706,7 @@ "id": "a727d58e", "metadata": {}, "source": [ - "# Interfacing with external libraries" + "## Interfacing with external libraries" ] }, { @@ -5848,12 +5714,12 @@ "id": "5086ad32", "metadata": {}, "source": [ - "## Graphix graphs" + "### Graphix graphs" ] }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 34, "id": "eaaced50", "metadata": {}, "outputs": [], @@ -5876,7 +5742,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 35, "id": "d921eb1a", "metadata": {}, "outputs": [ @@ -5898,7 +5764,7 @@ " \n", " \n", " \n", - " 2025-09-16T12:34:35.690505\n", + " 2025-09-16T19:38:39.141344\n", " image/svg+xml\n", " \n", " \n", @@ -5932,115 +5798,115 @@ " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -6165,7 +6031,7 @@ "L 30.23132 261.137374 \n", "L 30.799739 258.914343 \n", "L 31.38 256.68 \n", - "\" clip-path=\"url(#p819aa14177)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd12fb79567)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -6954,7 +6820,7 @@ "\" style=\"fill: none; stroke: #d62728; stroke-linecap: round\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6985,7 +6851,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7009,7 +6875,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7043,7 +6909,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7085,7 +6951,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7114,7 +6980,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7149,7 +7015,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7189,7 +7055,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7209,7 +7075,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7258,7 +7124,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7298,7 +7164,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7307,7 +7173,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7713,7 +7579,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7733,7 +7599,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 36, "id": "3a8c5542", "metadata": {}, "outputs": [ @@ -7743,12 +7609,12 @@ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-16T12:34:36.370631\n", + " 2025-09-16T19:38:39.891436\n", " image/svg+xml\n", " \n", " \n", @@ -7763,393 +7629,393 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p71b54b3c1b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8279,7 +8145,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8289,7 +8155,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8299,7 +8165,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8309,7 +8175,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8319,7 +8185,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8329,7 +8195,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8339,7 +8205,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8349,7 +8215,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8359,7 +8225,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8369,7 +8235,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8379,7 +8245,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8389,7 +8255,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8399,7 +8265,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8409,7 +8275,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8419,7 +8285,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8429,7 +8295,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8439,7 +8305,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8449,7 +8315,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8459,7 +8325,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8469,7 +8335,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8479,7 +8345,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8489,7 +8355,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8499,7 +8365,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8509,7 +8375,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8519,7 +8385,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8529,7 +8395,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8539,7 +8405,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8549,7 +8415,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8559,7 +8425,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8569,7 +8435,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8579,7 +8445,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8873,7 +8739,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8908,13 +8774,13 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8962,13 +8828,13 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8980,13 +8846,13 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9131,13 +8997,13 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9149,13 +9015,13 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9167,13 +9033,13 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9185,13 +9051,13 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9210,13 +9076,13 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9228,13 +9094,13 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9247,14 +9113,14 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "\n" ], "text/plain": [ - "
" + "
" ] }, "metadata": {}, @@ -9262,7 +9128,7 @@ } ], "source": [ - "optyx_zx.foliation().draw()" + "optyx_zx.foliation().draw(figsize=(8, 8))" ] }, { @@ -9270,12 +9136,12 @@ "id": "4870dd44", "metadata": {}, "source": [ - "## Perceval circuits and processors" + "### Perceval circuits and processors" ] }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 37, "id": "3f1613ed", "metadata": {}, "outputs": [], @@ -9286,10 +9152,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "id": "1f07af00", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "p = pcvl.Processor(\"SLOS\", 6)\n", "p.add(0, pcvl.catalog[\"postprocessed cnot\"].build_processor())\n", @@ -9322,7 +9199,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 39, "id": "3b4867c9", "metadata": {}, "outputs": [ @@ -9531,10 +9408,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 56, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -9545,7 +9422,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 40, "id": "22342f65", "metadata": {}, "outputs": [], @@ -9556,7 +9433,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 42, "id": "8b7699cf", "metadata": {}, "outputs": [ @@ -9566,12 +9443,12 @@ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-16T12:45:41.985074\n", + " 2025-09-16T19:39:04.579249\n", " image/svg+xml\n", " \n", " \n", @@ -9586,9 +9463,9 @@ " \n", " \n", " \n", - " \n", @@ -9596,1582 +9473,1557 @@ " \n", " \n", " \n", + "\" clip-path=\"url(#p2293b2adcf)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p2293b2adcf)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p2293b2adcf)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p2293b2adcf)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p2293b2adcf)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p2293b2adcf)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p2293b2adcf)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p2293b2adcf)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p2293b2adcf)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p2293b2adcf)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p2293b2adcf)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p2293b2adcf)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p2293b2adcf)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11321,7 +11173,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11331,7 +11183,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11341,7 +11193,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11351,7 +11203,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11361,7 +11213,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11371,7 +11223,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11381,7 +11233,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11391,7 +11243,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11401,7 +11253,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11411,7 +11263,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11421,7 +11273,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11431,7 +11283,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11441,7 +11293,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11451,7 +11303,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11461,7 +11313,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11471,7 +11323,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11481,7 +11333,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11491,7 +11343,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11500,8 +11352,26 @@ " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11509,9 +11379,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11519,9 +11389,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11529,9 +11399,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11539,27 +11409,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11568,7 +11420,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11577,7 +11429,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11586,7 +11438,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11595,7 +11447,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11604,7 +11456,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11613,7 +11465,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11691,9 +11561,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11701,27 +11571,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11730,7 +11582,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11739,7 +11591,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11748,7 +11600,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11757,7 +11609,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11766,7 +11618,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11775,7 +11627,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11784,7 +11636,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11793,7 +11645,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11803,7 +11655,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11812,7 +11664,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11822,7 +11674,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11831,7 +11683,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11840,7 +11692,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11849,7 +11701,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11858,7 +11710,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11867,7 +11719,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11876,7 +11728,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11885,15 +11737,24 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11901,18 +11762,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11922,7 +11774,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11931,7 +11783,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11940,7 +11792,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11949,7 +11801,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11958,7 +11810,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11967,7 +11819,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11977,7 +11829,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11986,7 +11838,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11995,7 +11847,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12004,7 +11856,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12013,7 +11865,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12022,7 +11874,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12031,7 +11883,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12040,7 +11892,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12049,7 +11901,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12058,7 +11910,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12067,7 +11919,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12076,7 +11928,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12085,7 +11937,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12094,7 +11946,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12103,7 +11955,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12112,7 +11964,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12121,7 +11973,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12130,7 +11982,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12139,7 +11991,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12148,7 +12000,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12157,7 +12009,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12166,7 +12018,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12175,7 +12027,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12184,7 +12036,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12193,7 +12045,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12202,7 +12054,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12211,7 +12063,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12220,7 +12072,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12229,7 +12081,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12238,7 +12090,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12247,7 +12099,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12256,7 +12108,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12265,7 +12117,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12274,7 +12126,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12283,7 +12135,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12292,7 +12144,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12301,7 +12153,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12310,7 +12162,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12319,7 +12171,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12328,7 +12180,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12337,7 +12189,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12346,7 +12198,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12355,7 +12207,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12364,7 +12216,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12373,7 +12225,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12382,7 +12234,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12391,7 +12243,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12400,7 +12252,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12409,7 +12261,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12418,7 +12270,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12427,7 +12279,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12436,7 +12288,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12445,7 +12297,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12453,7 +12305,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12462,7 +12314,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12471,7 +12323,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12480,7 +12332,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12489,7 +12341,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12498,7 +12350,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12507,7 +12359,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12670,7 +12522,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", @@ -13233,286 +12927,17 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -13530,60 +12955,11 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -13600,7 +12976,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -13617,22 +12993,13 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -13650,79 +13017,19 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "\n" ], "text/plain": [ - "
" + "
" ] }, "metadata": {}, @@ -13730,17 +13037,18 @@ } ], "source": [ - "optyx_diagram.draw(figsize=(10, 25))" + "optyx_diagram.foliation().draw(figsize=(8, 25))" ] }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 43, "id": "af82f2ef", "metadata": {}, "outputs": [], "source": [ - "to_transmit = (0.7071067811865476+0j)*pcvl.BasicState([1, 0]) + (-0.21850801222441052+0.6724985119639574j)*pcvl.BasicState([0, 1])\n", + "to_transmit = ((0.7071067811865476+0j)*pcvl.BasicState([1, 0]) +\n", + " (-0.21850801222441052+0.6724985119639574j)*pcvl.BasicState([0, 1]))\n", "to_transmit.normalize()\n", "\n", "sg = pcvl.StateGenerator(pcvl.Encoding.DUAL_RAIL)\n", @@ -13756,7 +13064,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 44, "id": "4cc23c53", "metadata": {}, "outputs": [], @@ -13766,7 +13074,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 45, "id": "d9bc5f3b", "metadata": {}, "outputs": [], @@ -13786,7 +13094,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 46, "id": "ad7fe8c0", "metadata": {}, "outputs": [], @@ -13796,7 +13104,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 47, "id": "e787f65b", "metadata": {}, "outputs": [], @@ -13812,7 +13120,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 48, "id": "e433baf1", "metadata": {}, "outputs": [], @@ -13828,7 +13136,7 @@ "id": "36241fe2", "metadata": {}, "source": [ - "# Fusion teleportation" + "## Fusion teleportation" ] }, { @@ -13851,7 +13159,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 49, "id": "5b0a58bb", "metadata": {}, "outputs": [], @@ -13876,7 +13184,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 50, "id": "f7998428", "metadata": {}, "outputs": [ @@ -13891,7 +13199,7 @@ " \n", " \n", " \n", - " 2025-09-16T14:24:01.625617\n", + " 2025-09-16T19:39:45.505830\n", " image/svg+xml\n", " \n", " \n", @@ -13920,152 +13228,152 @@ "L 295.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pd1e3729155)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", "
\n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf1d496d931)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -14602,7 +13910,7 @@ " \n", "
\n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -14635,7 +13943,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 51, "id": "0ce269cb", "metadata": {}, "outputs": [], @@ -14668,7 +13976,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 52, "id": "a1764edb", "metadata": {}, "outputs": [], @@ -14680,7 +13988,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 53, "id": "08e9fc37", "metadata": {}, "outputs": [], @@ -14698,7 +14006,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 54, "id": "76f472af", "metadata": {}, "outputs": [ @@ -14713,7 +14021,7 @@ " \n", " \n", " \n", - " 2025-09-16T14:24:42.083969\n", + " 2025-09-16T19:39:48.378097\n", " image/svg+xml\n", " \n", " \n", @@ -14742,127 +14050,127 @@ "L 367.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p7959831e85)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", "
\n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p826096f03f)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -15234,8 +14542,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", @@ -15504,155 +14717,11 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -15670,29 +14739,11 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -15710,30 +14761,12 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -15757,9 +14837,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -15768,9 +14848,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -15779,9 +14859,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -15792,7 +14872,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -15812,7 +14892,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 55, "id": "c557c4b8", "metadata": {}, "outputs": [], @@ -15829,7 +14909,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 56, "id": "4b5ee771", "metadata": {}, "outputs": [], @@ -15848,7 +14928,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 58, "id": "12531eea", "metadata": {}, "outputs": [ @@ -15858,12 +14938,12 @@ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-16T14:25:06.777764\n", + " 2025-09-16T19:40:04.737240\n", " image/svg+xml\n", " \n", " \n", @@ -15878,8 +14958,8 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "Q 79.2 16.8 79.2 16.8 \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p50772a6b5a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16631,7 +15711,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16641,7 +15721,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16651,7 +15731,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16661,7 +15741,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16671,7 +15751,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16681,7 +15761,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16691,7 +15771,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16701,7 +15781,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16711,7 +15791,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16721,7 +15801,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16731,7 +15811,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16741,7 +15821,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16751,7 +15831,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16761,7 +15841,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16771,7 +15851,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16781,7 +15861,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16791,7 +15871,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16801,7 +15881,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16811,7 +15891,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16821,7 +15901,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16831,7 +15911,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16840,7 +15920,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16849,7 +15929,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16858,7 +15938,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16867,7 +15947,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16875,7 +15955,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16883,7 +15963,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16891,7 +15971,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16899,7 +15979,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16907,7 +15987,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16915,7 +15995,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16925,7 +16005,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16935,7 +16015,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16943,7 +16023,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16951,7 +16031,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16961,7 +16041,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16971,7 +16051,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16981,7 +16061,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16991,7 +16071,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -17440,7 +16520,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -17456,7 +16536,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -17471,7 +16551,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -17486,7 +16566,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -17501,7 +16581,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", " \n", " \n", " \n", @@ -17729,50 +16795,11 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -17790,29 +16817,11 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -17830,29 +16839,11 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -17949,9 +16940,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -17960,9 +16951,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -17971,9 +16962,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -17984,14 +16975,14 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "\n" ], "text/plain": [ - "
" + "
" ] }, "metadata": {}, @@ -17999,12 +16990,12 @@ } ], "source": [ - "teleportation.foliation().draw()" + "teleportation.foliation().draw(figsize=(8, 8))" ] }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 59, "id": "c8c49c91", "metadata": {}, "outputs": [], @@ -18014,7 +17005,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 60, "id": "5017fe5a", "metadata": {}, "outputs": [], @@ -18028,7 +17019,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 61, "id": "c19354d7", "metadata": {}, "outputs": [ @@ -18038,7 +17029,7 @@ "True" ] }, - "execution_count": 93, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" } @@ -18054,12 +17045,12 @@ "id": "07c143a0", "metadata": {}, "source": [ - "## Fusion with distinguishable photons" + "### Fusion with distinguishable photons" ] }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 62, "id": "74e3f64e", "metadata": {}, "outputs": [ @@ -18074,7 +17065,7 @@ " \n", " \n", " \n", - " 2025-09-16T14:45:27.340645\n", + " 2025-09-16T19:40:13.218081\n", " image/svg+xml\n", " \n", " \n", @@ -18103,182 +17094,182 @@ "L 439.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p2d4f7e4122)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", "
\n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76bd758808)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -18987,7 +17978,7 @@ " \n", "
\n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19008,7 +17999,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": null, "id": "fcbe90b6", "metadata": {}, "outputs": [ @@ -19016,14 +18007,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "[1, 0] [1. 0.]\n" + "[1, 0] [0. 1.]\n" ] } ], "source": [ - "amp = 0.1\n", "internal_state_1 = [1, 0]\n", - "internal_state_2 = [1, 0]\n", + "internal_state_2 = [0, 1]\n", "internal_state_2 = internal_state_2 / np.linalg.norm(internal_state_2)\n", "\n", "print(internal_state_1, internal_state_2)" @@ -19031,7 +18021,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 70, "id": "bdb9611d", "metadata": {}, "outputs": [ @@ -19046,7 +18036,7 @@ " \n", " \n", " \n", - " 2025-09-16T14:45:43.979798\n", + " 2025-09-16T19:40:29.920521\n", " image/svg+xml\n", " \n", " \n", @@ -19075,262 +18065,262 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p060b7d29fe)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", "
\n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb0db694e32)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -20798,9 +19788,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -20835,7 +19825,18 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -20857,21 +19858,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -20902,7 +19892,7 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 75, "id": "2fbb6c45", "metadata": {}, "outputs": [], @@ -20912,44 +19902,2791 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 76, + "id": "14a649ed", + "metadata": {}, + "outputs": [], + "source": [ + "fidelity = (experiment >> bell_state.dagger())" + ] + }, + { + "cell_type": "code", + "execution_count": 77, "id": "aa3042f9", "metadata": {}, "outputs": [], "source": [ - "fidelity = (experiment >> bell_state.dagger())\n", - "\n", - "normalisation = (experiment >> Discard(2)).inflate(2).double().to_tensor().to_quimb()^..." + "normalisation = (experiment >> Discard(2)).inflate(2).eval().tensor.array" ] }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 78, "id": "c83b686e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(1.0000000000000002-1.8369701987210297e-16j)" + "(0.5000000000000001-3.061616997868383e-17j)" ] }, - "execution_count": 108, + "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "f = fidelity.inflate(2).double().to_tensor().to_quimb()^...\n", + "f = fidelity.inflate(2).eval().tensor.array\n", "f/normalisation" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 79, "id": "9e5c4078", "metadata": {}, "outputs": [], + "source": [ + "import math\n", + "\n", + "def rotated_unit_vectors(n: int = 10):\n", + " for i in range(n):\n", + " theta = i * (math.pi / 2) / (n - 1)\n", + " yield (math.cos(theta), math.sin(theta))" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "83a32908", + "metadata": {}, + "outputs": [], + "source": [ + "unit_vectors = list(rotated_unit_vectors(30))" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "30b96ad0", + "metadata": {}, + "outputs": [], + "source": [ + "inner_product_states = []\n", + "inner_product_bell_states = []\n", + "\n", + "result_bell = bell_state.eval().tensor.array.flatten()\n", + "result_bell = result_bell / np.linalg.norm(result_bell)\n", + "\n", + "for vector in unit_vectors:\n", + " encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(vector)\n", + " experiment = bell_state @ bell_state >> Id(1) @ (encoding_layer >> fusion_channel\n", + " >> post_select) @ Id(1)\n", + "\n", + " f = (experiment >> bell_state.dagger()).inflate(2).eval().tensor.array\n", + " normalisation = (experiment >> Discard(2)).inflate(2).eval().tensor.array\n", + "\n", + " inner_product_states.append(np.inner(vector, internal_state_1))\n", + " inner_product_bell_states.append(f/normalisation)" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "1c50f388", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1719: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " return math.isfinite(val)\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1355: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " return np.asarray(x, float)\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T19:44:02.386954\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.figure(figsize=(6, 4))\n", + "plt.plot(inner_product_states, inner_product_bell_states, marker='o')\n", + "plt.xlabel('')\n", + "plt.ylabel(' (fidelity)')\n", + "plt.title('Fidelity of the resulting state with the perfect Bell state')\n", + "plt.grid(True)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "06b9a545", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-16T19:44:02.522864\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.figure(figsize=(6, 4))\n", + "plt.plot(inner_product_states, inner_product_bell_states, marker='o')\n", + "plt.xlabel('')\n", + "plt.ylabel(' (fidelity)')\n", + "plt.title('Fidelity of the resulting state with the perfect Bell state')\n", + "plt.xlim(0.9, 1)\n", + "plt.ylim(0.9, 1)\n", + "plt.grid(True)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2f2a52e7", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d316d264", + "metadata": {}, + "outputs": [], "source": [] } ], diff --git a/docs/notebooks/photonic_generators.png b/docs/notebooks/photonic_generators.png new file mode 100644 index 0000000000000000000000000000000000000000..c99f61499c6b7b564f132c39a94eb263b9b7f9e0 GIT binary patch literal 218623 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�qA$92}5I290(0sTf6ODKqb^t&yr<`Bd7 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

;-@zjWYO~UY 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 bJ?ZS;_FT7pdzJiO5?*>bOSIz`TJHZ}7qG!^ literal 0 HcmV?d00001 diff --git a/docs/notebooks/qubit_generators.png b/docs/notebooks/qubit_generators.png new file mode 100644 index 0000000000000000000000000000000000000000..60b8286e3fa3cf1baa8b2b1d3d5b6fcaf4064799 GIT binary patch literal 101147 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 TKjP=P`A47#I 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

jn_P=C3%0}<_~Arg&K~~ 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
9OMc+W*E;(iP%pw$j~I3gbe9VoYlg2|Ho}! z`IJJwr!RH28QbkdbVV?jeA8bX+^g7af0)Mu4ExfER=(Lr{TLac93R;{i|vPjPqifP z!|q42WlE`M+yzTD9AL)@U=gCuAKMiP_7p+B zbmmy=Q}j(z>%_ETs$nn?yBo2P2)MR-Yz#^^ph2df(FG>e6jIthfBv+^9Vn4kn&)g& zf9V}~pW9}D2{=~tJ09Q;%_aHs63m@YG#mg9)wpX-$s3sG#xxd!2m9@ GpYsC)F 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 Vm^$JwK}q+cr6i{=TP|%L`ac!\n", " \n", " \n", - " 2025-09-20T15:23:03.038095\n", + " 2025-09-22T16:09:05.479277\n", " image/svg+xml\n", " \n", " \n", @@ -70,27 +70,27 @@ "L 151.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#peefc055285)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p65614644b3)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p65614644b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p65614644b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p65614644b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p65614644b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p65614644b3)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -396,7 +396,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -435,7 +435,7 @@ " \n", " \n", " \n", - " 2025-09-20T15:23:03.113336\n", + " 2025-09-22T16:09:05.511685\n", " image/svg+xml\n", " \n", " \n", @@ -464,27 +464,27 @@ "L 151.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p82b0da7130)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p12201c4d34)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p12201c4d34)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p12201c4d34)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p12201c4d34)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p12201c4d34)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p12201c4d34)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p12201c4d34)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p12201c4d34)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -957,7 +957,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1209,6 +1209,16 @@ "## Fusion teleportation" ] }, + { + "cell_type": "markdown", + "id": "7043700a", + "metadata": {}, + "source": [ + "Ursin, R., Jennewein, T., Aspelmeyer, M. et al. Quantum teleportation across the Danube. Nature 430, 849 (2004). https://doi.org/10.1038/430849a\n", + "\n", + "\"Fusion" + ] + }, { "cell_type": "markdown", "id": "5721aeab", @@ -1216,7 +1226,7 @@ "source": [ "Graphically, the fusion measurement we would like to use, takes the following form:\n", "\n", - "![Fusion II](./fusion_ii.png \"Fusion measurement implementing a Bell measurement in dual rail encoding\")\n" + "\"Fusion\n" ] }, { @@ -1248,6 +1258,21 @@ { "cell_type": "code", "execution_count": 11, + "id": "c557c4b8", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.photonic import DualRail\n", + "\n", + "dual_rail_encoded_bell = (\n", + " bell >>\n", + " DualRail(1) @ DualRail(1)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, "id": "a1764edb", "metadata": {}, "outputs": [], @@ -1267,21 +1292,6 @@ ")" ] }, - { - "cell_type": "code", - "execution_count": 12, - "id": "c557c4b8", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.photonic import DualRail\n", - "\n", - "dual_rail_encoded_bell = (\n", - " bell >>\n", - " DualRail(1) @ DualRail(1)\n", - ")" - ] - }, { "cell_type": "code", "execution_count": 13, @@ -1320,7 +1330,7 @@ " \n", " \n", " \n", - " 2025-09-20T15:23:05.418345\n", + " 2025-09-22T16:09:07.230615\n", " image/svg+xml\n", " \n", " \n", @@ -1349,217 +1359,217 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p343a897278)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2920,9 +2930,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2957,9 +2967,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2968,9 +2978,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2979,9 +2989,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2992,7 +3002,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3015,8 +3025,6 @@ " fusion_failure_processing @ correction\n", ")\n", "\n", - "array_teleportation = fusion_teleportation_monoidal_syntax.eval().tensor.array\n", - "\n", "fusion_teleportation_monoidal_syntax.foliation().draw(figsize=(8, 8))\n" ] }, @@ -3049,7 +3057,9 @@ "import numpy as np\n", "from optyx.photonic import Id\n", "\n", + "array_teleportation = fusion_teleportation_monoidal_syntax.eval().tensor.array\n", "array_dr = (DualRail(1) @ Scalar(0.5**0.5)).double().to_tensor().eval().array\n", + "\n", "np.allclose(array_teleportation[:, :, :2, :2, :2, :2], array_dr)\n" ] }, @@ -3068,8 +3078,6 @@ "metadata": {}, "outputs": [], "source": [ - "# process fidelity\n", - "\n", "def _flat(x):\n", " return np.asarray(x, dtype=complex).ravel()\n", "\n", @@ -3136,7 +3144,7 @@ " \n", " \n", " \n", - " 2025-09-20T15:24:56.567030\n", + " 2025-09-22T16:11:08.655997\n", " image/svg+xml\n", " \n", " \n", @@ -3172,16 +3180,16 @@ " \n", " \n", + "\" clip-path=\"url(#p3bb6a4514b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3241,11 +3249,11 @@ " \n", " \n", + "\" clip-path=\"url(#p3bb6a4514b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3288,11 +3296,11 @@ " \n", " \n", + "\" clip-path=\"url(#p3bb6a4514b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3334,11 +3342,11 @@ " \n", " \n", + "\" clip-path=\"url(#p3bb6a4514b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3354,11 +3362,11 @@ " \n", " \n", + "\" clip-path=\"url(#p3bb6a4514b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3408,11 +3416,11 @@ " \n", " \n", + "\" clip-path=\"url(#p3bb6a4514b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3428,11 +3436,11 @@ " \n", " \n", + "\" clip-path=\"url(#p3bb6a4514b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3469,11 +3477,11 @@ " \n", " \n", + "\" clip-path=\"url(#p3bb6a4514b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3489,11 +3497,11 @@ " \n", " \n", + "\" clip-path=\"url(#p3bb6a4514b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3572,23 +3580,23 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3597,18 +3605,18 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3617,18 +3625,18 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3637,18 +3645,18 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3769,8 +3777,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", + "L 141.177614 221.435207 \n", + "L 222.34125 68.285781 \n", + "L 303.504886 34.486016 \n", + "L 384.668523 34.414125 \n", + "\" clip-path=\"url(#p3bb6a4514b)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4094,13 +4164,26 @@ " \n", " \n", " \n", - " \n", + " \n", - " \n", - " \n", - " \n", " \n", + " \n", " \n", - " \n", " \n", " \n", " \n", @@ -4338,7 +4355,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4374,8 +4391,8 @@ "plt.plot(range(1, 6), errors, marker='o')\n", "plt.grid()\n", "plt.xlabel('Chi')\n", - "plt.ylabel('Average Gate Fidelity')\n", - "plt.title('Fusion-based Teleportation Fidelity vs Contraction Chi')\n" + "plt.ylabel('Average cosine similarity')\n", + "plt.title('Fusion-based Teleportation similarity vs Contraction Chi')\n" ] }, { @@ -4415,16 +4432,51 @@ { "cell_type": "code", "execution_count": 19, + "id": "ccefb368", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.core.channel import Spider, Diagram\n", + "\n", + "def get_perm(n):\n", + " return sorted(sorted(list(range(n))), key=lambda i: i % 2)\n", + "\n", + "def channel_fidelity(diagram_1, diagram_2):\n", + " bell_1 = Channel.tensor(*[Spider(0, 2, ty) for ty in diagram_1.dom])\n", + " permutation_1 = Diagram.permutation(get_perm(len(bell_1.cod)), bell_1.cod)\n", + "\n", + " bell_2 = Channel.tensor(*[Spider(0, 2, ty) for ty in diagram_2.dom])\n", + " permutation_2 = Diagram.permutation(get_perm(len(bell_2.cod)), bell_2.cod)\n", + "\n", + " choi_1 = bell_1 >> permutation_1 >> (diagram_1 @ diagram_1.dom)\n", + " choi_2 = bell_2 >> permutation_2 >> (diagram_2 @ diagram_2.dom)\n", + "\n", + " return (choi_1 >> choi_2.dagger()).eval().tensor.array\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, "id": "7e1a2957", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1719: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " return math.isfinite(val)\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1355: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " return np.asarray(x, float)\n" + ] + }, { "data": { "text/plain": [ - "Text(0.5, 1.0, 'Fusion-based Teleportation: Success Probability vs Average Fidelity')" + "Text(0.5, 1.0, 'Fusion-based Teleportation: Success Probability vs Fidelity')" ] }, - "execution_count": 19, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, @@ -4434,12 +4486,12 @@ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-20T15:25:17.545024\n", + " 2025-09-22T16:11:48.012032\n", " image/svg+xml\n", " \n", " \n", @@ -4455,8 +4507,8 @@ " \n", " \n", " \n", @@ -4473,23 +4525,23 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", + "\" clip-path=\"url(#p924eb87d0c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4762,7 +4792,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5133,145 +5163,84 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5279,121 +5248,37 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", + "\" clip-path=\"url(#p924eb87d0c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5402,24 +5287,47 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -5626,23 +5445,10 @@ "L 400.90125 22.318125 \n", "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5817,14 +5615,14 @@ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", - "ps = np.linspace(0.0, 1.0, 20)\n", + "ps = np.linspace(0.05, 1.0, 20)\n", "\n", "F_avg_vals = []\n", "succ_probs = []\n", "for p in ps:\n", - " S_impl = fusion_teleportation_with_photon_loss(p).eval().tensor.array\n", - " S_tgt = array_teleportation\n", - " s = average_fidelity(S_impl, S_tgt, d=2)\n", + " S_impl = fusion_teleportation_with_photon_loss(p)\n", + " S_tgt = fusion_teleportation_monoidal_syntax\n", + " s = channel_fidelity(S_impl, S_tgt)\n", "\n", " succ_probs.append(s)\n", "\n", @@ -5832,8 +5630,8 @@ "plt.plot(ps, succ_probs, marker='o')\n", "plt.grid(True)\n", "plt.xlabel('Photon Survival Probability (p)')\n", - "plt.ylabel('Average fidelity')\n", - "plt.title('Fusion-based Teleportation: Success Probability vs Average Fidelity')\n" + "plt.ylabel('Fidelity')\n", + "plt.title('Fusion-based Teleportation: Success Probability vs Fidelity')\n" ] }, { @@ -5844,6 +5642,17 @@ "## Distributed entanglement generation" ] }, + { + "cell_type": "markdown", + "id": "9fa0ec11", + "metadata": {}, + "source": [ + "![Distributed entanglement](./distributed_entanglement.png \"An example of distributed entanglement generation\")\n", + "\n", + "Main, D., Drmota, P., Nadlinger, D.P. et al. Distributed quantum computing across an optical network link. Nature 638, 383–388 (2025). https://doi.org/10.1038/s41586-024-08404-x~\n", + "\n" + ] + }, { "cell_type": "markdown", "id": "e20c30a8", @@ -5862,7 +5671,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "id": "fcbe90b6", "metadata": {}, "outputs": [ @@ -5883,7 +5692,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "id": "bdb9611d", "metadata": {}, "outputs": [ @@ -5898,7 +5707,7 @@ " \n", " \n", " \n", - " 2025-09-20T15:25:17.703789\n", + " 2025-09-22T16:11:48.160380\n", " image/svg+xml\n", " \n", " \n", @@ -5927,157 +5736,157 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pced80a7f19)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -7385,7 +7194,30 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -7410,8 +7242,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -7421,31 +7253,8 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7458,7 +7267,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7503,7 +7312,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "id": "9e5c4078", "metadata": {}, "outputs": [], @@ -7528,7 +7337,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "id": "30b96ad0", "metadata": {}, "outputs": [], @@ -7550,1362 +7359,13 @@ " normalisation = (experiment >> Discard(2)).inflate(2).eval().tensor.array\n", "\n", " inner_product_states.append(np.inner(vector, internal_state_1))\n", - " inner_product_bell_states.append(f/normalisation)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "1c50f388", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1719: ComplexWarning: Casting complex values to real discards the imaginary part\n", - " return math.isfinite(val)\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1355: ComplexWarning: Casting complex values to real discards the imaginary part\n", - " return np.asarray(x, float)\n" - ] - }, - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-20T15:26:10.606186\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "plt.figure(figsize=(6, 4))\n", - "plt.plot(inner_product_states, inner_product_bell_states, marker='o')\n", - "plt.xlabel('')\n", - "plt.ylabel(' (fidelity)')\n", - "plt.title('Fidelity of the resulting state with the perfect Bell state')\n", - "plt.grid(True)\n", - "plt.show()" + " inner_product_bell_states.append(f/normalisation)" ] }, { "cell_type": "code", "execution_count": 25, - "id": "06b9a545", + "id": "1c50f388", "metadata": {}, "outputs": [ { @@ -8914,12 +7374,12 @@ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-20T15:26:10.677437\n", + " 2025-09-22T16:12:41.489701\n", " image/svg+xml\n", " \n", " \n", @@ -8935,41 +7395,41 @@ " \n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", @@ -9900,15 +8389,24 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "\n" @@ -10190,8 +8697,6 @@ "plt.xlabel('')\n", "plt.ylabel(' (fidelity)')\n", "plt.title('Fidelity of the resulting state with the perfect Bell state')\n", - "plt.xlim(0.9, 1)\n", - "plt.ylim(0.9, 1)\n", "plt.grid(True)\n", "plt.show()" ] @@ -10209,7 +8714,9 @@ "id": "e4b64d36", "metadata": {}, "source": [ - "### Graphix" + "### Graphix\n", + "\n", + "Open graphs only for now (graph + measurements; desire to implement deterministically - no corrections)" ] }, { @@ -10217,22 +8724,6 @@ "execution_count": 26, "id": "79f358ae", "metadata": {}, - "outputs": [], - "source": [ - "import graphix\n", - "from optyx import qubits\n", - "\n", - "circuit = graphix.Circuit(2)\n", - "circuit.cnot(0, 1)\n", - "\n", - "pattern = circuit.transpile().pattern" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "4888034c", - "metadata": {}, "outputs": [ { "name": "stdout", @@ -10252,7 +8743,7 @@ " \n", " \n", " \n", - " 2025-09-20T15:26:10.879280\n", + " 2025-09-22T16:12:41.572896\n", " image/svg+xml\n", " \n", " \n", @@ -10286,35 +8777,35 @@ " \n", " \n", + "\" clip-path=\"url(#pfb4929274f)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pfb4929274f)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pfb4929274f)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pfb4929274f)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pfb4929274f)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pfb4929274f)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pfb4929274f)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -10433,11 +8924,11 @@ "L 167.778687 33.07423 \n", "L 169.081412 33.262286 \n", "L 170.382137 33.454569 \n", - "\" clip-path=\"url(#p2d12089205)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#pfb4929274f)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -10541,7 +9032,7 @@ "\" style=\"fill: none; stroke: #d62728; stroke-linecap: round\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10572,7 +9063,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10596,7 +9087,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10630,7 +9121,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11069,7 +9560,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11084,12 +9575,19 @@ } ], "source": [ + "import graphix\n", + "\n", + "circuit = graphix.Circuit(2)\n", + "circuit.cnot(0, 1)\n", + "\n", + "pattern = circuit.transpile().pattern\n", + "\n", "pattern.draw_graph()" ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 27, "id": "bff50dee", "metadata": {}, "outputs": [], @@ -11100,11 +9598,13 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 28, "id": "bf2d9106", "metadata": {}, "outputs": [], "source": [ + "from optyx import qubits\n", + "\n", "optyx_zx = qubits.Circuit(pattern)\n", "\n", "optyx_res = (\n", @@ -11114,7 +9614,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 29, "id": "908e477d", "metadata": {}, "outputs": [], @@ -11131,16 +9631,6 @@ "### Perceval circuits and processors" ] }, - { - "cell_type": "code", - "execution_count": 31, - "id": "07f5f7ba", - "metadata": {}, - "outputs": [], - "source": [ - "import perceval as pcvl" - ] - }, { "cell_type": "markdown", "id": "7d106d80", @@ -11151,7 +9641,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 30, "id": "988c9618", "metadata": {}, "outputs": [ @@ -11360,15 +9850,17 @@ "" ], "text/plain": [ - "" + "" ] }, - "execution_count": 32, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "import perceval as pcvl\n", + "\n", "p = pcvl.Processor(\"SLOS\", 6)\n", "p.add(0, pcvl.catalog[\"postprocessed cnot\"].build_processor())\n", "\n", @@ -11402,7 +9894,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 31, "id": "96d5bf6b", "metadata": {}, "outputs": [], @@ -11424,7 +9916,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 32, "id": "bce649df", "metadata": {}, "outputs": [], @@ -11445,7 +9937,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 33, "id": "f0c1fbf3", "metadata": {}, "outputs": [], @@ -11463,7 +9955,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 34, "id": "463bcb6f", "metadata": {}, "outputs": [], @@ -11475,7 +9967,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 35, "id": "3f3fca2d", "metadata": {}, "outputs": [], @@ -11497,7 +9989,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 36, "id": "54633b7a", "metadata": {}, "outputs": [], @@ -11507,7 +9999,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 37, "id": "e019251e", "metadata": {}, "outputs": [], @@ -11523,7 +10015,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 38, "id": "ca6102c5", "metadata": {}, "outputs": [], diff --git a/docs/notebooks/teleportation_danube.png b/docs/notebooks/teleportation_danube.png new file mode 100644 index 0000000000000000000000000000000000000000..b206aa6032ebb08f5509e4be7554184f83c5073a GIT binary patch literal 190048 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

uXSHJB0#{EDam7zZu}3_Z{b* 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≫_=kaExI= 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 literal 0 HcmV?d00001 From b983051f1144ff543493114db95e5fcdad414216 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Mon, 22 Sep 2025 17:19:40 +0100 Subject: [PATCH 19/59] fixing plot typos --- docs/notebooks/graphix_workshop.ipynb | 1219 ++++++++++++------------- 1 file changed, 587 insertions(+), 632 deletions(-) diff --git a/docs/notebooks/graphix_workshop.ipynb b/docs/notebooks/graphix_workshop.ipynb index 37b61e36..3ffad86a 100644 --- a/docs/notebooks/graphix_workshop.ipynb +++ b/docs/notebooks/graphix_workshop.ipynb @@ -26,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 41, "id": "13dbbb3a", "metadata": {}, "outputs": [ @@ -41,7 +41,7 @@ " \n", " \n", " \n", - " 2025-09-22T16:09:05.479277\n", + " 2025-09-22T17:00:56.423581\n", " image/svg+xml\n", " \n", " \n", @@ -70,27 +70,27 @@ "L 151.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p65614644b3)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p82ef8c5618)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p82ef8c5618)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p82ef8c5618)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p82ef8c5618)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p82ef8c5618)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p82ef8c5618)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -396,7 +396,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -420,7 +420,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 42, "id": "79ab4b08", "metadata": {}, "outputs": [ @@ -435,7 +435,7 @@ " \n", " \n", " \n", - " 2025-09-22T16:09:05.511685\n", + " 2025-09-22T17:00:57.109107\n", " image/svg+xml\n", " \n", " \n", @@ -464,27 +464,27 @@ "L 151.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p12201c4d34)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p9d6919ffad)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9d6919ffad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9d6919ffad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9d6919ffad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9d6919ffad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9d6919ffad)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9d6919ffad)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9d6919ffad)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -957,7 +957,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1000,7 +1000,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 43, "id": "f1478f68", "metadata": {}, "outputs": [ @@ -1010,7 +1010,7 @@ "array(-0.+0.j)" ] }, - "execution_count": 3, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } @@ -1024,7 +1024,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 44, "id": "801f0884", "metadata": {}, "outputs": [ @@ -1034,7 +1034,7 @@ "{(0, 2): 0.5, (1, 1): 4.9303806576313227e-32, (2, 0): 0.5}" ] }, - "execution_count": 4, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -1053,7 +1053,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 45, "id": "47e64a7d", "metadata": {}, "outputs": [], @@ -1076,7 +1076,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 47, "id": "8fa3a149", "metadata": {}, "outputs": [], @@ -1100,7 +1100,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 51, "id": "8c0301af", "metadata": {}, "outputs": [], @@ -1121,7 +1121,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 52, "id": "174c4713", "metadata": {}, "outputs": [], @@ -1146,7 +1146,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 53, "id": "bb29783a", "metadata": {}, "outputs": [ @@ -1156,7 +1156,7 @@ "True" ] }, - "execution_count": 9, + "execution_count": 53, "metadata": {}, "output_type": "execute_result" } @@ -1174,7 +1174,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 55, "id": "25af2db6", "metadata": {}, "outputs": [ @@ -1184,7 +1184,7 @@ "True" ] }, - "execution_count": 10, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" } @@ -1257,7 +1257,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 56, "id": "c557c4b8", "metadata": {}, "outputs": [], @@ -1272,7 +1272,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 57, "id": "a1764edb", "metadata": {}, "outputs": [], @@ -1294,7 +1294,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 58, "id": "7bb5e46f", "metadata": {}, "outputs": [], @@ -1315,7 +1315,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 59, "id": "4b5ee771", "metadata": {}, "outputs": [ @@ -1330,7 +1330,7 @@ " \n", " \n", " \n", - " 2025-09-22T16:09:07.230615\n", + " 2025-09-22T17:06:57.972030\n", " image/svg+xml\n", " \n", " \n", @@ -1359,217 +1359,217 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p343a897278)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p61f6979ec4)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2930,7 +2930,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2956,7 +2956,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2967,7 +2967,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2978,7 +2978,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2989,7 +2989,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3002,7 +3002,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3038,7 +3038,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 60, "id": "c19354d7", "metadata": {}, "outputs": [ @@ -3048,7 +3048,7 @@ "True" ] }, - "execution_count": 15, + "execution_count": 60, "metadata": {}, "output_type": "execute_result" } @@ -3073,7 +3073,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 62, "id": "51acb733", "metadata": {}, "outputs": [], @@ -3088,48 +3088,22 @@ " den = np.linalg.norm(a) * np.linalg.norm(b)\n", " if den == 0:\n", " return 0.0\n", - " return float(num / den)\n", - "\n", - "def average_fidelity(SU, SV, d):\n", - " Fp = process_fidelity(SU, SV)\n", - " return float((d * Fp + 1) / (d + 1))" + " return float(num / den)" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 63, "id": "fb497580", "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", - " warnings.warn(\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", - " warnings.warn(\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", - " warnings.warn(\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", - " warnings.warn(\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", - " warnings.warn(\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", - " warnings.warn(\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", - " warnings.warn(\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", - " warnings.warn(\n" - ] - }, { "data": { "text/plain": [ - "Text(0.5, 1.0, 'Fusion-based Teleportation Fidelity vs Contraction Chi')" + "Text(0.5, 1.0, 'Fusion-based Teleportation similarity vs Contraction Chi')" ] }, - "execution_count": 17, + "execution_count": 63, "metadata": {}, "output_type": "execute_result" }, @@ -3144,7 +3118,7 @@ " \n", " \n", " \n", - " 2025-09-22T16:11:08.655997\n", + " 2025-09-22T17:11:15.809568\n", " image/svg+xml\n", " \n", " \n", @@ -3180,16 +3154,16 @@ " \n", " \n", + "\" clip-path=\"url(#p1ed173bbef)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3249,11 +3223,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1ed173bbef)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3296,11 +3270,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1ed173bbef)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3342,11 +3316,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1ed173bbef)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3362,11 +3336,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1ed173bbef)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3416,11 +3390,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1ed173bbef)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3436,11 +3410,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1ed173bbef)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3477,11 +3451,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1ed173bbef)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3497,11 +3471,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1ed173bbef)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3580,83 +3554,63 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", + "\" clip-path=\"url(#p1ed173bbef)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3776,7 +3730,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4112,15 +4066,15 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + "\" clip-path=\"url(#p1ed173bbef)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4160,9 +4114,9 @@ "L 400.90125 22.318125 \n", "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4405,7 +4361,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 64, "id": "ac439493", "metadata": {}, "outputs": [], @@ -4431,7 +4387,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 65, "id": "ccefb368", "metadata": {}, "outputs": [], @@ -4456,7 +4412,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 66, "id": "7e1a2957", "metadata": {}, "outputs": [ @@ -4473,10 +4429,10 @@ { "data": { "text/plain": [ - "Text(0.5, 1.0, 'Fusion-based Teleportation: Success Probability vs Fidelity')" + "Text(0.5, 1.0, 'Fusion-based Teleportation: Photon Survival Probability vs Fidelity')" ] }, - "execution_count": 20, + "execution_count": 66, "metadata": {}, "output_type": "execute_result" }, @@ -4486,12 +4442,12 @@ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-22T16:11:48.012032\n", + " 2025-09-22T17:12:06.905184\n", " image/svg+xml\n", " \n", " \n", @@ -4507,8 +4463,8 @@ " \n", " \n", " \n", @@ -4525,23 +4481,23 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", + "\" clip-path=\"url(#p98e1b0ab2b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4792,7 +4770,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5163,24 +5141,24 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5188,19 +5166,19 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5208,19 +5186,19 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5228,19 +5206,19 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5248,19 +5226,19 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5268,17 +5246,17 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", + "\" clip-path=\"url(#p98e1b0ab2b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5287,7 +5265,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5367,30 +5345,30 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", + "\" clip-path=\"url(#p98e1b0ab2b)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -5445,9 +5423,9 @@ "L 400.90125 22.318125 \n", "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", " \n", " \n", " \n", @@ -5561,43 +5518,51 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5615,7 +5580,7 @@ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", - "ps = np.linspace(0.05, 1.0, 20)\n", + "ps = np.linspace(0.0, 1.0, 20)\n", "\n", "F_avg_vals = []\n", "succ_probs = []\n", @@ -5631,7 +5596,7 @@ "plt.grid(True)\n", "plt.xlabel('Photon Survival Probability (p)')\n", "plt.ylabel('Fidelity')\n", - "plt.title('Fusion-based Teleportation: Success Probability vs Fidelity')\n" + "plt.title('Fusion-based Teleportation: Photon Survival Probability vs Fidelity')\n" ] }, { @@ -5671,28 +5636,18 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 67, "id": "fcbe90b6", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1, 0] [0, 1]\n" - ] - } - ], + "outputs": [], "source": [ "internal_state_1 = [1, 0]\n", - "internal_state_2 = [0, 1]\n", - "\n", - "print(internal_state_1, internal_state_2)" + "internal_state_2 = [0, 1]" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 68, "id": "bdb9611d", "metadata": {}, "outputs": [ @@ -5707,7 +5662,7 @@ " \n", " \n", " \n", - " 2025-09-22T16:11:48.160380\n", + " 2025-09-22T17:13:18.353326\n", " image/svg+xml\n", " \n", " \n", @@ -5736,157 +5691,157 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pced80a7f19)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p56b857efbe)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -7194,7 +7149,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7217,7 +7172,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7243,7 +7198,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7254,7 +7209,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7267,7 +7222,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7312,7 +7267,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 69, "id": "9e5c4078", "metadata": {}, "outputs": [], @@ -7337,7 +7292,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 70, "id": "30b96ad0", "metadata": {}, "outputs": [], @@ -7364,7 +7319,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 72, "id": "1c50f388", "metadata": {}, "outputs": [ @@ -7379,7 +7334,7 @@ " \n", " \n", " \n", - " 2025-09-22T16:12:41.489701\n", + " 2025-09-22T17:14:51.666648\n", " image/svg+xml\n", " \n", " \n", @@ -7415,16 +7370,16 @@ " \n", " \n", + "\" clip-path=\"url(#pfc4c6b495d)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7470,11 +7425,11 @@ " \n", " \n", + "\" clip-path=\"url(#pfc4c6b495d)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7516,11 +7471,11 @@ " \n", " \n", + "\" clip-path=\"url(#pfc4c6b495d)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7557,11 +7512,11 @@ " \n", " \n", + "\" clip-path=\"url(#pfc4c6b495d)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7609,11 +7564,11 @@ " \n", " \n", + "\" clip-path=\"url(#pfc4c6b495d)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7670,11 +7625,11 @@ " \n", " \n", + "\" clip-path=\"url(#pfc4c6b495d)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7940,16 +7895,16 @@ " \n", " \n", + "\" clip-path=\"url(#pfc4c6b495d)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7992,11 +7947,11 @@ " \n", " \n", + "\" clip-path=\"url(#pfc4c6b495d)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8012,11 +7967,11 @@ " \n", " \n", + "\" clip-path=\"url(#pfc4c6b495d)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8044,11 +7999,11 @@ " \n", " \n", + "\" clip-path=\"url(#pfc4c6b495d)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8064,11 +8019,11 @@ " \n", " \n", + "\" clip-path=\"url(#pfc4c6b495d)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8116,11 +8071,11 @@ " \n", " \n", + "\" clip-path=\"url(#pfc4c6b495d)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8404,9 +8359,9 @@ "L 127.048587 224.015787 \n", "L 93.399222 231.470859 \n", "L 59.321307 233.998125 \n", - "\" clip-path=\"url(#p28e97f9b12)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#pfc4c6b495d)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -8675,7 +8630,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8721,7 +8676,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 73, "id": "79f358ae", "metadata": {}, "outputs": [ @@ -8743,7 +8698,7 @@ " \n", " \n", " \n", - " 2025-09-22T16:12:41.572896\n", + " 2025-09-22T17:14:54.996796\n", " image/svg+xml\n", " \n", " \n", @@ -8777,35 +8732,35 @@ " \n", " \n", + "\" clip-path=\"url(#pc54d94e5e6)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc54d94e5e6)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc54d94e5e6)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc54d94e5e6)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pc54d94e5e6)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc54d94e5e6)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pc54d94e5e6)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -8924,11 +8879,11 @@ "L 167.778687 33.07423 \n", "L 169.081412 33.262286 \n", "L 170.382137 33.454569 \n", - "\" clip-path=\"url(#pfb4929274f)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#pc54d94e5e6)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9032,7 +8987,7 @@ "\" style=\"fill: none; stroke: #d62728; stroke-linecap: round\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9063,7 +9018,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9087,7 +9042,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9121,7 +9076,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9560,7 +9515,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9587,7 +9542,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 74, "id": "bff50dee", "metadata": {}, "outputs": [], @@ -9598,7 +9553,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 75, "id": "bf2d9106", "metadata": {}, "outputs": [], @@ -9614,7 +9569,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 76, "id": "908e477d", "metadata": {}, "outputs": [], @@ -9641,7 +9596,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 77, "id": "988c9618", "metadata": {}, "outputs": [ @@ -9850,10 +9805,10 @@ "" ], "text/plain": [ - "" + "" ] }, - "execution_count": 30, + "execution_count": 77, "metadata": {}, "output_type": "execute_result" } @@ -9894,7 +9849,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 78, "id": "96d5bf6b", "metadata": {}, "outputs": [], @@ -9916,7 +9871,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 79, "id": "bce649df", "metadata": {}, "outputs": [], @@ -9937,7 +9892,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 80, "id": "f0c1fbf3", "metadata": {}, "outputs": [], @@ -9955,7 +9910,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 81, "id": "463bcb6f", "metadata": {}, "outputs": [], @@ -9967,7 +9922,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 82, "id": "3f3fca2d", "metadata": {}, "outputs": [], @@ -9989,7 +9944,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 83, "id": "54633b7a", "metadata": {}, "outputs": [], @@ -9999,7 +9954,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 84, "id": "e019251e", "metadata": {}, "outputs": [], @@ -10015,7 +9970,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 85, "id": "ca6102c5", "metadata": {}, "outputs": [], From 573693033fb65b5f7f541c11d51461a30267d3dc Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Mon, 22 Sep 2025 17:31:33 +0100 Subject: [PATCH 20/59] fix rounding issue with backends --- optyx/core/backends.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/optyx/core/backends.py b/optyx/core/backends.py index ab9e1565..1d01c668 100644 --- a/optyx/core/backends.py +++ b/optyx/core/backends.py @@ -205,15 +205,17 @@ def _convert_array_to_dict( entries of an array. """ - if round_digits is not None: - array = np.round(array, round_digits) - nz_flat = np.flatnonzero(array) if nz_flat.size == 0: return {} nz_vals = array.flat[nz_flat] nz_multi = np.vstack(np.unravel_index(nz_flat, array.shape)).T + + if round_digits is not None: + return {tuple(idx): np.round(val, round_digits) for + idx, val in zip(nz_multi, nz_vals)} + return {tuple(idx): val for idx, val in zip(nz_multi, nz_vals)} def _prob_dist_pure(self, round_digits: int = None) -> dict: From dceb26600033728614f36d94e73e990180b52414 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Mon, 22 Sep 2025 17:53:55 +0100 Subject: [PATCH 21/59] add comments to readme --- docs/notebooks/graphix_workshop.ipynb | 9182 +------------------------ 1 file changed, 79 insertions(+), 9103 deletions(-) diff --git a/docs/notebooks/graphix_workshop.ipynb b/docs/notebooks/graphix_workshop.ipynb index 3ffad86a..d14950c8 100644 --- a/docs/notebooks/graphix_workshop.ipynb +++ b/docs/notebooks/graphix_workshop.ipynb @@ -26,954 +26,29 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": null, "id": "13dbbb3a", "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-22T17:00:56.423581\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from optyx.photonic import BBS\n", "\n", + "# diagram generators:\n", + "# beam-splitter\n", "beam_splitter = BBS(0)\n", - "\n", "beam_splitter.draw()" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": null, "id": "79ab4b08", "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-22T17:00:57.109107\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from optyx.photonic import Create\n", "\n", + "# diagram composition with function syntax\n", "hong_ou_mandel = (\n", " Create(1) @ Create(1) >>\n", " beam_splitter\n", @@ -1000,22 +75,12 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "id": "f1478f68", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(-0.+0.j)" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ + "# an amplitude (raw result of tensor contraction)\n", "from optyx.classical import Select\n", "(\n", " hong_ou_mandel >> Select(1, 1)\n", @@ -1024,21 +89,10 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "id": "801f0884", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(0, 2): 0.5, (1, 1): 4.9303806576313227e-32, (2, 0): 0.5}" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "hong_ou_mandel.eval().prob_dist()" ] @@ -1053,7 +107,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": null, "id": "47e64a7d", "metadata": {}, "outputs": [], @@ -1076,11 +130,14 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": null, "id": "8fa3a149", "metadata": {}, "outputs": [], "source": [ + "# function syntax\n", + "# CNOT from ZX generators\n", + "\n", "@Channel.from_callable(\n", " dom=qubit @ qubit, cod=qubit @ qubit\n", ")\n", @@ -1100,7 +157,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": null, "id": "8c0301af", "metadata": {}, "outputs": [], @@ -1121,11 +178,13 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": null, "id": "174c4713", "metadata": {}, "outputs": [], "source": [ + "# function syntax avoids explicit swaps and identity wires\n", + "\n", "teleportation_monoidal_syntax = (\n", " qubit @ bell >>\n", " cnot @ qubit >>\n", @@ -1146,50 +205,31 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": null, "id": "bb29783a", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "import numpy as np\n", "from optyx.qubits import Id\n", "\n", + "# both implementations are equivalent\n", "np.allclose(\n", " teleportation.eval().tensor.array,\n", - " Id(1).double().to_tensor().eval().array,\n", - " teleportation_monoidal_syntax.eval().tensor.array\n", + " teleportation_monoidal_syntax.eval().tensor.array,\n", + " Id(1).double().to_tensor().eval().array\n", ")" ] }, { "cell_type": "code", - "execution_count": 55, + "execution_count": null, "id": "25af2db6", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ + "# backends (Perceval, Discopy, Quimb)\n", + "\n", "from optyx.core.backends import (\n", " DiscopyBackend,\n", " QuimbBackend\n", @@ -1257,7 +297,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": null, "id": "c557c4b8", "metadata": {}, "outputs": [], @@ -1272,7 +312,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": null, "id": "a1764edb", "metadata": {}, "outputs": [], @@ -1294,7 +334,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": null, "id": "7bb5e46f", "metadata": {}, "outputs": [], @@ -1315,1707 +355,10 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": null, "id": "4b5ee771", "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-22T17:06:57.972030\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from optyx.photonic import FusionTypeII\n", "\n", @@ -3038,21 +381,10 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": null, "id": "c19354d7", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 60, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "import numpy as np\n", "from optyx.photonic import Id\n", @@ -3073,7 +405,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": null, "id": "51acb733", "metadata": {}, "outputs": [], @@ -3081,8 +413,7 @@ "def _flat(x):\n", " return np.asarray(x, dtype=complex).ravel()\n", "\n", - "# cosine similarity of pure unitary channels as superoperators\n", - "def process_fidelity(SU, SV):\n", + "def cosine_similarity(SU, SV):\n", " a, b = _flat(SU), _flat(SV)\n", " num = abs(np.vdot(a, b))\n", " den = np.linalg.norm(a) * np.linalg.norm(b)\n", @@ -3093,1241 +424,14 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": null, "id": "fb497580", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0.5, 1.0, 'Fusion-based Teleportation similarity vs Contraction Chi')" - ] - }, - "execution_count": 63, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-22T17:11:15.809568\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from cotengra import HyperCompressedOptimizer\n", "\n", + "# cosine similarity between the result of exact contaction and approximate contraction for different chis\n", "errors = []\n", "for chi in range(1, 6):\n", " optimiser = HyperCompressedOptimizer(\n", @@ -4336,7 +440,7 @@ " error_for_chi = []\n", " for _ in range(10):\n", " error_for_chi.append(\n", - " process_fidelity(\n", + " cosine_similarity(\n", " fusion_teleportation.eval(QuimbBackend(optimiser)).tensor.array,\n", " array_teleportation\n", " )\n", @@ -4361,13 +465,14 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": null, "id": "ac439493", "metadata": {}, "outputs": [], "source": [ "from optyx.photonic import FusionTypeII, PhotonLoss\n", "\n", + "# photo loss is one of the main error sources in photonic quantum computing\n", "def fusion_teleportation_with_photon_loss(p):\n", " @Channel.from_callable(\n", " dom=qubit, cod=qmode**2\n", @@ -4375,9 +480,12 @@ " def fusion_teleportation(a):\n", " dr_input_1, dr_input_2 = DualRail(1)(a)\n", " b, c, d, e = dual_rail_encoded_bell()\n", + " # apply photon loss to all modes here:\n", + " #-----------------------------------\n", " dr_input_1_loss, dr_input_2_loss, b_loss, c_loss, d_loss, e_loss = (\n", " PhotonLoss(p)(dr_input_1), PhotonLoss(p)(dr_input_2), PhotonLoss(p)(b), PhotonLoss(p)(c), PhotonLoss(p)(d), PhotonLoss(p)(e)\n", " )\n", + " #-----------------------------------\n", " s, k = FusionTypeII()(dr_input_1_loss, dr_input_2_loss, b_loss, c_loss)\n", " fusion_failure_processing(s)\n", " output_rail_1, output_rail = correction(k, d_loss, e_loss)\n", @@ -4387,7 +495,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": null, "id": "ccefb368", "metadata": {}, "outputs": [], @@ -4412,1176 +520,17 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": null, "id": "7e1a2957", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1719: ComplexWarning: Casting complex values to real discards the imaginary part\n", - " return math.isfinite(val)\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1355: ComplexWarning: Casting complex values to real discards the imaginary part\n", - " return np.asarray(x, float)\n" - ] - }, - { - "data": { - "text/plain": [ - "Text(0.5, 1.0, 'Fusion-based Teleportation: Photon Survival Probability vs Fidelity')" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-22T17:12:06.905184\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "ps = np.linspace(0.0, 1.0, 20)\n", "\n", + "# compute fidelity for different photon loss probabilities\n", "F_avg_vals = []\n", "succ_probs = []\n", "for p in ps:\n", @@ -5636,1606 +585,10 @@ }, { "cell_type": "code", - "execution_count": 67, - "id": "fcbe90b6", - "metadata": {}, - "outputs": [], - "source": [ - "internal_state_1 = [1, 0]\n", - "internal_state_2 = [0, 1]" - ] - }, - { - "cell_type": "code", - "execution_count": 68, + "execution_count": null, "id": "bdb9611d", "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-22T17:13:18.353326\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from optyx.qubits import Z, Scalar, Id, Measure\n", "from optyx.photonic import DualRail\n", @@ -7243,9 +596,14 @@ "from discopy.drawing import Equation\n", "\n", "bell_state = Z(0, 2) @ Scalar(0.5 ** 0.5)\n", + "\n", + "# generators introducing new qubits accepting internal states\n", + "internal_state_1 = [1, 0]\n", + "internal_state_2 = [0, 1]\n", "dual_rail_encoding = lambda state: DualRail(1, internal_states=[state])\n", "encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(internal_state_2)\n", "\n", + "# postselect on fusion success and no errors\n", "post_select = PostselectBit(1) @ PostselectBit(0)\n", "\n", "protocol = (\n", @@ -7267,13 +625,14 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": null, "id": "9e5c4078", "metadata": {}, "outputs": [], "source": [ "import math\n", "\n", + "# internal states - 2 dimensional - move further and further apart\n", "def rotated_unit_vectors(n: int = 10):\n", " for i in range(n):\n", " theta = i * (math.pi / 2) / (n - 1)\n", @@ -7292,7 +651,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": null, "id": "30b96ad0", "metadata": {}, "outputs": [], @@ -7319,1331 +678,10 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": null, "id": "1c50f388", "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-22T17:14:51.666648\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", @@ -8676,859 +714,10 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": null, "id": "79f358ae", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The pattern is not consistent with flow or gflow structure.\n" - ] - }, - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-22T17:14:54.996796\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import graphix\n", "\n", @@ -9542,7 +731,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": null, "id": "bff50dee", "metadata": {}, "outputs": [], @@ -9553,7 +742,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": null, "id": "bf2d9106", "metadata": {}, "outputs": [], @@ -9569,7 +758,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": null, "id": "908e477d", "metadata": {}, "outputs": [], @@ -9596,223 +785,10 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": null, "id": "988c9618", "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "POSTPROCESSED CNOT\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "H\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Θ=1.910633\n", - "\n", - "\n", - "H\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Θ=1.910633\n", - "\n", - "\n", - "H\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Θ=1.910633\n", - "\n", - "\n", - "H\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "H\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "H\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PNR\n", - "\n", - "\n", - "\n", - "PNR\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "FFC\n", - "\n", - "\n", - "\n", - "U(FFC)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PNR\n", - "\n", - "\n", - "\n", - "PNR\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "FFC\n", - "\n", - "\n", - "Φ=phi\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "[herald0]\n", - "0\n", - "\n", - "[herald1]\n", - "0\n", - "\n", - "[ctrl]\n", - "\n", - "[data]\n", - "\n", - "[ctrl]\n", - "\n", - "[data]\n", - "\n", - "[herald0]\n", - "0\n", - "\n", - "[herald1]\n", - "0\n", - "0\n", - "1\n", - "2\n", - "3\n", - "4\n", - "5\n", - "0\n", - "1\n", - "2\n", - "3\n", - "4\n", - "5\n", - "" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 77, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "import perceval as pcvl\n", "\n", @@ -9849,7 +825,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": null, "id": "96d5bf6b", "metadata": {}, "outputs": [], @@ -9871,7 +847,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": null, "id": "bce649df", "metadata": {}, "outputs": [], @@ -9892,7 +868,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": null, "id": "f0c1fbf3", "metadata": {}, "outputs": [], @@ -9910,7 +886,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": null, "id": "463bcb6f", "metadata": {}, "outputs": [], @@ -9922,7 +898,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": null, "id": "3f3fca2d", "metadata": {}, "outputs": [], @@ -9944,7 +920,7 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": null, "id": "54633b7a", "metadata": {}, "outputs": [], @@ -9954,7 +930,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": null, "id": "e019251e", "metadata": {}, "outputs": [], @@ -9970,7 +946,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": null, "id": "ca6102c5", "metadata": {}, "outputs": [], From a1c8375775e6a5d950488f4b24da25a191ed739a Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Tue, 23 Sep 2025 13:10:25 +0100 Subject: [PATCH 22/59] rename readme notebook --- docs/notebooks/readme_example.ipynb | 10075 ++++++++++++++++++++++++++ 1 file changed, 10075 insertions(+) create mode 100644 docs/notebooks/readme_example.ipynb diff --git a/docs/notebooks/readme_example.ipynb b/docs/notebooks/readme_example.ipynb new file mode 100644 index 00000000..c05af05a --- /dev/null +++ b/docs/notebooks/readme_example.ipynb @@ -0,0 +1,10075 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0d360e60", + "metadata": {}, + "source": [ + "# Optyx: A ZX-based Python library for networked quantum architectures" + ] + }, + { + "cell_type": "markdown", + "id": "b1adf8d9", + "metadata": {}, + "source": [ + "## Hong-Ou-Mandel effect" + ] + }, + { + "cell_type": "markdown", + "id": "6f3dab5d", + "metadata": {}, + "source": [ + "### Experiment definition" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "13dbbb3a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-23T09:38:17.988554\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from optyx.photonic import BBS\n", + "\n", + "# diagram generators:\n", + "# beam-splitter\n", + "beam_splitter = BBS(0)\n", + "beam_splitter.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "79ab4b08", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-23T09:38:39.460152\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from optyx.photonic import Create\n", + "\n", + "# diagram composition with monoidal syntax\n", + "hong_ou_mandel = (\n", + " Create(1) @ Create(1) >>\n", + " beam_splitter\n", + ")\n", + "\n", + "hong_ou_mandel.draw()" + ] + }, + { + "cell_type": "markdown", + "id": "a869643c", + "metadata": {}, + "source": [ + " ![HOM](./hom.png \"Hong-Ou-Mandel Effect\")" + ] + }, + { + "cell_type": "markdown", + "id": "94bfc225", + "metadata": {}, + "source": [ + "### Diagram evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f1478f68", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(-0.+0.j)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# an amplitude (raw result of tensor contraction)\n", + "from optyx.classical import Select\n", + "(\n", + " hong_ou_mandel >> Select(1, 1)\n", + ").eval().tensor.array" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "801f0884", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{(0, 2): 0.5, (1, 1): 4.9303806576313227e-32, (2, 0): 0.5}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hong_ou_mandel.eval().prob_dist()" + ] + }, + { + "cell_type": "markdown", + "id": "b1f34bd2", + "metadata": {}, + "source": [ + "## Qubit teleportation - function syntax and backends" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "47e64a7d", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx import qubit, bit\n", + "from optyx.qubits import Scalar\n", + "\n", + "from optyx import Channel\n", + "from optyx.qubits import Z, X, H, Measure, Scalar, qubit, bit\n", + "from optyx.classical import BitControlledGate" + ] + }, + { + "cell_type": "markdown", + "id": "748d7e3d", + "metadata": {}, + "source": [ + "### Define the protocol" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8fa3a149", + "metadata": {}, + "outputs": [], + "source": [ + "# function syntax\n", + "# CNOT from ZX generators\n", + "\n", + "@Channel.from_callable(\n", + " dom=qubit @ qubit, cod=qubit @ qubit\n", + ")\n", + "def cnot(a, b):\n", + " c, d = Z(1, 2)(a)\n", + " Scalar(2 ** 0.5)()\n", + " return c, X(2, 1)(d, b)" + ] + }, + { + "cell_type": "markdown", + "id": "668cadf7", + "metadata": {}, + "source": [ + "
\"Teleportation\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "8c0301af", + "metadata": {}, + "outputs": [], + "source": [ + "bell = Scalar(0.5 ** 0.5) @ Z(0, 2)\n", + "\n", + "@Channel.from_callable(\n", + " dom=qubit, cod=qubit\n", + ")\n", + "def teleportation(c):\n", + " a, b = bell()\n", + " cc, aa = cnot(c, a)\n", + " c_ = Measure(1)(H()(cc))\n", + " a_ = Measure(1)(aa)\n", + " bb = BitControlledGate(X(1, 1, 0.5))(a_, b)\n", + " return BitControlledGate(Z(1, 1, 0.5))(c_, bb)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "174c4713", + "metadata": {}, + "outputs": [], + "source": [ + "# function syntax avoids explicit swaps and identity wires\n", + "\n", + "teleportation_monoidal_syntax = (\n", + " qubit @ bell >>\n", + " cnot @ qubit >>\n", + " H() @ qubit ** 2 >>\n", + " Measure(1) @ Measure(1) @ qubit >>\n", + " bit @ BitControlledGate(X(1, 1, 0.5)) >>\n", + " BitControlledGate(Z(1, 1, 0.5))\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "7fcce92a", + "metadata": {}, + "source": [ + "### Verify the protocol" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "bb29783a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "from optyx.qubits import Id\n", + "\n", + "# both implementations are equivalent\n", + "np.allclose(\n", + " teleportation.eval().tensor.array,\n", + " teleportation_monoidal_syntax.eval().tensor.array,\n", + " Id(1).double().to_tensor().eval().array\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "25af2db6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# backends (Perceval, Discopy, Quimb)\n", + "\n", + "from optyx.core.backends import (\n", + " DiscopyBackend,\n", + " QuimbBackend\n", + ")\n", + "\n", + "np.allclose(\n", + " teleportation.eval(DiscopyBackend()).tensor.array,\n", + " teleportation.eval(QuimbBackend()).tensor.array\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "36241fe2", + "metadata": {}, + "source": [ + "## Fusion teleportation" + ] + }, + { + "cell_type": "markdown", + "id": "7043700a", + "metadata": {}, + "source": [ + "Ursin, R., Jennewein, T., Aspelmeyer, M. et al. Quantum teleportation across the Danube. Nature 430, 849 (2004). https://doi.org/10.1038/430849a\n", + "\n", + "\"Fusion" + ] + }, + { + "cell_type": "markdown", + "id": "5721aeab", + "metadata": {}, + "source": [ + "Graphically, the fusion measurement we would like to use, takes the following form:\n", + "\n", + "\"Fusion\n" + ] + }, + { + "cell_type": "markdown", + "id": "1ab1655b", + "metadata": {}, + "source": [ + "where $\\underline{a}, \\underline{b}, \\underline{c}, \\underline{d}$ are the measurement outcomes as the measured photon numbers. " + ] + }, + { + "cell_type": "markdown", + "id": "ea1f931a", + "metadata": {}, + "source": [ + "$\\underline{s} = \\underline{a} \\oplus \\underline{b}$\n", + "\n", + "$\\underline{k} = \\underline{s} (\\underline{b} + \\underline{d}) + \\neg \\underline s (1 - \\frac{\\underline{a} + \\underline{b}}{2})$" + ] + }, + { + "cell_type": "markdown", + "id": "515133cf", + "metadata": {}, + "source": [ + "### Define the protocol" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "c557c4b8", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.photonic import DualRail\n", + "\n", + "dual_rail_encoded_bell = (\n", + " bell >>\n", + " DualRail(1) @ DualRail(1)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "a1764edb", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.classical import PostselectBit, BitControlledGate\n", + "from optyx.photonic import Phase\n", + "from optyx.photonic import HadamardBS, qmode\n", + "\n", + "# postselect on fusion success\n", + "fusion_failure_processing = PostselectBit(1)\n", + "\n", + "# apply the box if the control bit is 1, otherwise apply an identity channel\n", + "correction = BitControlledGate(\n", + " HadamardBS() >>\n", + " (Phase(0.5) @ qmode) >>\n", + " HadamardBS()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e83e3857", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "7bb5e46f", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.photonic import FusionTypeII\n", + "\n", + "@Channel.from_callable(\n", + " dom=qubit, cod=qmode @ qmode\n", + ")\n", + "def fusion_teleportation(a):\n", + " dual_rail_encoded_input = DualRail(1)(a)\n", + " b, c, d, e = dual_rail_encoded_bell()\n", + " s, k = FusionTypeII()(*dual_rail_encoded_input, b, c)\n", + " fusion_failure_processing(s)\n", + " dr_output_1, dr_output_2 = correction(k, d, e)\n", + " return dr_output_1, dr_output_2" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "4b5ee771", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-23T09:43:12.181076\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from optyx.photonic import FusionTypeII\n", + "\n", + "fusion_teleportation_monoidal_syntax = (\n", + " DualRail(1) @ dual_rail_encoded_bell >>\n", + " FusionTypeII() @ qmode**2 >>\n", + " fusion_failure_processing @ correction\n", + ")\n", + "\n", + "fusion_teleportation_monoidal_syntax.foliation().draw(figsize=(8, 8))\n" + ] + }, + { + "cell_type": "markdown", + "id": "5017fe5a", + "metadata": {}, + "source": [ + "### Verify the protocol" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "c19354d7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "from optyx.photonic import Id\n", + "\n", + "array_teleportation = fusion_teleportation_monoidal_syntax.eval().tensor.array\n", + "array_dr = (DualRail(1) @ Scalar(0.5**0.5)).double().to_tensor().eval().array\n", + "\n", + "np.allclose(array_teleportation[:, :, :2, :2, :2, :2], array_dr)\n" + ] + }, + { + "cell_type": "markdown", + "id": "6e6b4039", + "metadata": {}, + "source": [ + "### Approximate contraction with Quimb and Cotengra" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "51acb733", + "metadata": {}, + "outputs": [], + "source": [ + "def _flat(x):\n", + " return np.asarray(x, dtype=complex).ravel()\n", + "\n", + "def cosine_similarity(SU, SV):\n", + " a, b = _flat(SU), _flat(SV)\n", + " num = abs(np.vdot(a, b))\n", + " den = np.linalg.norm(a) * np.linalg.norm(b)\n", + " if den == 0:\n", + " return 0.0\n", + " return float(num / den)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "fb497580", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Fusion-based Teleportation similarity vs Contraction Chi')" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-23T09:46:04.540850\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from cotengra import HyperCompressedOptimizer\n", + "\n", + "# cosine similarity between the result of exact contaction and approximate contraction for different chis\n", + "errors = []\n", + "for chi in range(1, 6):\n", + " optimiser = HyperCompressedOptimizer(\n", + " chi=chi\n", + " )\n", + " error_for_chi = []\n", + " for _ in range(10):\n", + " error_for_chi.append(\n", + " cosine_similarity(\n", + " fusion_teleportation.eval(QuimbBackend(optimiser)).tensor.array,\n", + " array_teleportation\n", + " )\n", + " )\n", + " errors.append(np.median(error_for_chi))\n", + "\n", + "import matplotlib.pyplot as plt\n", + "plt.plot(range(1, 6), errors, marker='o')\n", + "plt.grid()\n", + "plt.xlabel('Chi')\n", + "plt.ylabel('Average cosine similarity')\n", + "plt.title('Fusion-based Teleportation similarity vs Contraction Chi')\n" + ] + }, + { + "cell_type": "markdown", + "id": "351608f0", + "metadata": {}, + "source": [ + "### Photon loss and channel fidelity" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "ac439493", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.photonic import FusionTypeII, PhotonLoss\n", + "\n", + "# photo loss is one of the main error sources in photonic quantum computing\n", + "def fusion_teleportation_with_photon_loss(p):\n", + " @Channel.from_callable(\n", + " dom=qubit, cod=qmode**2\n", + " )\n", + " def fusion_teleportation(a):\n", + " dr_input_1, dr_input_2 = DualRail(1)(a)\n", + " b, c, d, e = dual_rail_encoded_bell()\n", + " # apply photon loss to all modes here:\n", + " #-----------------------------------\n", + " dr_input_1_loss, dr_input_2_loss, b_loss, c_loss, d_loss, e_loss = (\n", + " PhotonLoss(p)(dr_input_1), PhotonLoss(p)(dr_input_2), PhotonLoss(p)(b), PhotonLoss(p)(c), PhotonLoss(p)(d), PhotonLoss(p)(e)\n", + " )\n", + " #-----------------------------------\n", + " s, k = FusionTypeII()(dr_input_1_loss, dr_input_2_loss, b_loss, c_loss)\n", + " fusion_failure_processing(s)\n", + " output_rail_1, output_rail = correction(k, d_loss, e_loss)\n", + " return output_rail_1, output_rail\n", + " return fusion_teleportation" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "ccefb368", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.core.channel import Spider, Diagram\n", + "\n", + "def get_perm(n):\n", + " return sorted(sorted(list(range(n))), key=lambda i: i % 2)\n", + "\n", + "def channel_fidelity(diagram_1, diagram_2):\n", + " bell_1 = Channel.tensor(*[Spider(0, 2, ty) for ty in diagram_1.dom])\n", + " permutation_1 = Diagram.permutation(get_perm(len(bell_1.cod)), bell_1.cod)\n", + "\n", + " bell_2 = Channel.tensor(*[Spider(0, 2, ty) for ty in diagram_2.dom])\n", + " permutation_2 = Diagram.permutation(get_perm(len(bell_2.cod)), bell_2.cod)\n", + "\n", + " choi_1 = bell_1 >> permutation_1 >> (diagram_1 @ diagram_1.dom)\n", + " choi_2 = bell_2 >> permutation_2 >> (diagram_2 @ diagram_2.dom)\n", + "\n", + " return (choi_1 >> choi_2.dagger()).eval().tensor.array\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "7e1a2957", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1719: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " return math.isfinite(val)\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1355: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " return np.asarray(x, float)\n" + ] + }, + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Fusion-based Teleportation: Photon Survival Probability vs Fidelity')" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-23T09:46:43.925958\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "ps = np.linspace(0.0, 1.0, 20)\n", + "\n", + "# compute fidelity for different photon loss probabilities\n", + "F_avg_vals = []\n", + "succ_probs = []\n", + "for p in ps:\n", + " S_impl = fusion_teleportation_with_photon_loss(p)\n", + " S_tgt = fusion_teleportation_monoidal_syntax\n", + " s = channel_fidelity(S_impl, S_tgt)\n", + "\n", + " succ_probs.append(s)\n", + "\n", + "plt.figure()\n", + "plt.plot(ps, succ_probs, marker='o')\n", + "plt.grid(True)\n", + "plt.xlabel('Photon Survival Probability (p)')\n", + "plt.ylabel('Fidelity')\n", + "plt.title('Fusion-based Teleportation: Photon Survival Probability vs Fidelity')\n" + ] + }, + { + "cell_type": "markdown", + "id": "07c143a0", + "metadata": {}, + "source": [ + "## Distributed entanglement generation" + ] + }, + { + "cell_type": "markdown", + "id": "9fa0ec11", + "metadata": {}, + "source": [ + "![Distributed entanglement](./distributed_entanglement.png \"An example of distributed entanglement generation\")\n", + "\n", + "Main, D., Drmota, P., Nadlinger, D.P. et al. Distributed quantum computing across an optical network link. Nature 638, 383–388 (2025). https://doi.org/10.1038/s41586-024-08404-x~\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "e20c30a8", + "metadata": {}, + "source": [ + "### Fusion and photon distinguishability" + ] + }, + { + "cell_type": "markdown", + "id": "18ab5a86", + "metadata": {}, + "source": [ + "#### Define the protocol" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "bdb9611d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-23T09:47:37.669705\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from optyx.qubits import Z, Scalar, Id, Measure\n", + "from optyx.photonic import DualRail\n", + "from optyx.classical import PostselectBit\n", + "from discopy.drawing import Equation\n", + "\n", + "bell_state = Z(0, 2) @ Scalar(0.5 ** 0.5)\n", + "\n", + "# generators introducing new qubits accepting internal states\n", + "internal_state_1 = [1, 0]\n", + "internal_state_2 = [0, 1]\n", + "dual_rail_encoding = lambda state: DualRail(1, internal_states=[state])\n", + "encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(internal_state_2)\n", + "\n", + "# postselect on fusion success and no errors\n", + "post_select = PostselectBit(1) @ PostselectBit(0)\n", + "\n", + "protocol = (\n", + " bell_state @ bell_state >>\n", + " Id(1) @ (encoding_layer >> FusionTypeII() >> post_select) @ Id(1)\n", + ")\n", + "measure = Measure(2)\n", + "\n", + "Equation(protocol >> measure, bell_state >> measure).draw(figsize=(8, 8))" + ] + }, + { + "cell_type": "markdown", + "id": "eb9f34b3", + "metadata": {}, + "source": [ + "#### Define a set of internal states with varying degrees of distinguishability" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "9e5c4078", + "metadata": {}, + "outputs": [], + "source": [ + "import math\n", + "\n", + "# internal states - 2 dimensional - move further and further apart\n", + "def rotated_unit_vectors(n: int = 10):\n", + " for i in range(n):\n", + " theta = i * (math.pi / 2) / (n - 1)\n", + " yield (math.cos(theta), math.sin(theta))\n", + "\n", + "unit_vectors = list(rotated_unit_vectors(15))" + ] + }, + { + "cell_type": "markdown", + "id": "945ace07", + "metadata": {}, + "source": [ + "#### Run the experiments" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "30b96ad0", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.qubits import Discard\n", + "\n", + "inner_product_states = []\n", + "inner_product_bell_states = []\n", + "\n", + "result_bell = bell_state.eval().tensor.array.flatten()\n", + "result_bell = result_bell / np.linalg.norm(result_bell)\n", + "\n", + "for vector in unit_vectors:\n", + " encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(vector)\n", + " experiment = bell_state @ bell_state >> Id(1) @ (encoding_layer >> FusionTypeII()\n", + " >> post_select) @ Id(1)\n", + "\n", + " f = (experiment >> bell_state.dagger()).inflate(2).eval().tensor.array\n", + " normalisation = (experiment >> Discard(2)).inflate(2).eval().tensor.array\n", + "\n", + " inner_product_states.append(np.inner(vector, internal_state_1))\n", + " inner_product_bell_states.append(f/normalisation)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "1c50f388", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-23T09:47:37.744591\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.figure(figsize=(6, 4))\n", + "plt.plot(inner_product_states, inner_product_bell_states, marker='o')\n", + "plt.xlabel('')\n", + "plt.ylabel(' (fidelity)')\n", + "plt.title('Fidelity of the resulting state with the perfect Bell state')\n", + "plt.grid(True)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "7aa6a1d2", + "metadata": {}, + "source": [ + "## Interfacing with external libraries" + ] + }, + { + "cell_type": "markdown", + "id": "e4b64d36", + "metadata": {}, + "source": [ + "### Graphix\n", + "\n", + "Open graphs only for now (graph + measurements; desire to implement deterministically - no corrections)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "79f358ae", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The pattern is not consistent with flow or gflow structure.\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-23T09:47:43.571420\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import graphix\n", + "\n", + "circuit = graphix.Circuit(2)\n", + "circuit.cnot(0, 1)\n", + "\n", + "pattern = circuit.transpile().pattern\n", + "\n", + "pattern.draw_graph()" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "bff50dee", + "metadata": {}, + "outputs": [], + "source": [ + "simulator = graphix.simulator.PatternSimulator(pattern, backend=\"statevector\")\n", + "graphix_result = simulator.run().psi.conj()" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "bf2d9106", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx import qubits\n", + "\n", + "optyx_zx = qubits.Circuit(pattern)\n", + "\n", + "optyx_res = (\n", + " qubits.Ket(\"+\")**2 >> optyx_zx\n", + ").eval().amplitudes()" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "908e477d", + "metadata": {}, + "outputs": [], + "source": [ + "for keys in optyx_res.keys():\n", + " assert np.isclose(optyx_res[keys], graphix_result[keys], atol=1e-6)" + ] + }, + { + "cell_type": "markdown", + "id": "598ab8dc", + "metadata": {}, + "source": [ + "### Perceval circuits and processors" + ] + }, + { + "cell_type": "markdown", + "id": "7d106d80", + "metadata": {}, + "source": [ + "#### Define the protocol in Perceval" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "988c9618", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "POSTPROCESSED CNOT\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Θ=1.910633\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Θ=1.910633\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Θ=1.910633\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PNR\n", + "\n", + "\n", + "\n", + "PNR\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "FFC\n", + "\n", + "\n", + "\n", + "U(FFC)\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PNR\n", + "\n", + "\n", + "\n", + "PNR\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "FFC\n", + "\n", + "\n", + "Φ=phi\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "[herald0]\n", + "0\n", + "\n", + "[herald1]\n", + "0\n", + "\n", + "[ctrl]\n", + "\n", + "[data]\n", + "\n", + "[ctrl]\n", + "\n", + "[data]\n", + "\n", + "[herald0]\n", + "0\n", + "\n", + "[herald1]\n", + "0\n", + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import perceval as pcvl\n", + "\n", + "p = pcvl.Processor(\"SLOS\", 6)\n", + "p.add(0, pcvl.catalog[\"postprocessed cnot\"].build_processor())\n", + "\n", + "p.add(0, pcvl.BS.H())\n", + "p.add(0, pcvl.Detector.pnr())\n", + "p.add(1, pcvl.Detector.pnr())\n", + "p.add(2, pcvl.Detector.pnr())\n", + "p.add(3, pcvl.Detector.pnr())\n", + "\n", + "ff_X = pcvl.FFCircuitProvider(\n", + " 2, 0, pcvl.Circuit(2)\n", + ")\n", + "ff_X.add_configuration(\n", + " [0, 1], pcvl.PERM([1, 0])\n", + ")\n", + "p.add(2, ff_X)\n", + "\n", + "phi = pcvl.P(\"phi\")\n", + "ff_Z = pcvl.FFConfigurator(\n", + " 2, 3,\n", + " pcvl.PS(phi),\n", + " {\"phi\": 0}\n", + ").add_configuration(\n", + " [0, 1],\n", + " {\"phi\": np.pi}\n", + ")\n", + "p.add(0, ff_Z)\n", + "\n", + "pcvl.pdisplay(p, recursive=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "96d5bf6b", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.qubits import Ket\n", + "\n", + "state = Ket(\"+\") >> Z(1, 1, 0.3)\n", + "state_array = state.eval().tensor.array\n", + "state_array = state_array / np.linalg.norm(state_array)" + ] + }, + { + "cell_type": "markdown", + "id": "f64e6adb", + "metadata": {}, + "source": [ + "#### Evaluate the protocol in Perceval" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "bce649df", + "metadata": {}, + "outputs": [], + "source": [ + "to_transmit = (complex(state_array[0])*pcvl.BasicState([1, 0]) +\n", + " complex(state_array[1])*pcvl.BasicState([0, 1]))\n", + "\n", + "sg = pcvl.StateGenerator(pcvl.Encoding.DUAL_RAIL)\n", + "bell_state = sg.bell_state(\"phi+\")\n", + "\n", + "input_state = to_transmit * bell_state\n", + "p.min_detected_photons_filter(2)\n", + "\n", + "input_state *= pcvl.BasicState([0, 0])\n", + "\n", + "p.with_input(input_state)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "f0c1fbf3", + "metadata": {}, + "outputs": [], + "source": [ + "result_perceval = p.probs()" + ] + }, + { + "cell_type": "markdown", + "id": "ab098b6e", + "metadata": {}, + "source": [ + "#### Convert to Optyx and simulate" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "463bcb6f", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx import Channel\n", + "\n", + "optyx_diagram = Channel.from_perceval(p)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "3f3fca2d", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.qubits import Scalar, Ket\n", + "from optyx.photonic import DualRail\n", + "\n", + "bell_state = Z(0, 2) @ Scalar(0.5**0.5)\n", + "transmit = Ket(\"+\") >> Z(1, 1, 0.3)\n", + "\n", + "input_state = transmit @ bell_state\n", + "\n", + "protocol = (\n", + " input_state >>\n", + " DualRail(3) >>\n", + " Channel.from_perceval(p)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "54633b7a", + "metadata": {}, + "outputs": [], + "source": [ + "result_optyx = protocol.eval().prob_dist()" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "e019251e", + "metadata": {}, + "outputs": [], + "source": [ + "def check_dict_agreement(d1, d2, rtol=1e-5, atol=1e-8):\n", + " for key in d1.keys() - d2.keys():\n", + " assert np.isclose(d1[key], 0, rtol=rtol, atol=atol)\n", + " for key in d2.keys() - d1.keys():\n", + " assert np.isclose(d2[key], 0, rtol=rtol, atol=atol)\n", + " for key in d1.keys() & d2.keys():\n", + " assert np.isclose(d1[key], d2[key], rtol=rtol, atol=atol)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "ca6102c5", + "metadata": {}, + "outputs": [], + "source": [ + "check_dict_agreement(\n", + " {tuple(k): v for k, v in dict(result_perceval[\"results\"]).items()},\n", + " result_optyx\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a7c85548", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "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.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 36789b382501a14884b823118375b0d764d76c12 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Tue, 23 Sep 2025 13:10:54 +0100 Subject: [PATCH 23/59] remove an unused example notebook --- docs/notebooks/graphix_workshop.ipynb | 990 -------------------------- 1 file changed, 990 deletions(-) delete mode 100644 docs/notebooks/graphix_workshop.ipynb diff --git a/docs/notebooks/graphix_workshop.ipynb b/docs/notebooks/graphix_workshop.ipynb deleted file mode 100644 index d14950c8..00000000 --- a/docs/notebooks/graphix_workshop.ipynb +++ /dev/null @@ -1,990 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "0d360e60", - "metadata": {}, - "source": [ - "# Optyx: A ZX-based Python library for networked quantum architectures" - ] - }, - { - "cell_type": "markdown", - "id": "b1adf8d9", - "metadata": {}, - "source": [ - "## Hong-Ou-Mandel effect" - ] - }, - { - "cell_type": "markdown", - "id": "6f3dab5d", - "metadata": {}, - "source": [ - "### Experiment definition" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "13dbbb3a", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.photonic import BBS\n", - "\n", - "# diagram generators:\n", - "# beam-splitter\n", - "beam_splitter = BBS(0)\n", - "beam_splitter.draw()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "79ab4b08", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.photonic import Create\n", - "\n", - "# diagram composition with function syntax\n", - "hong_ou_mandel = (\n", - " Create(1) @ Create(1) >>\n", - " beam_splitter\n", - ")\n", - "\n", - "hong_ou_mandel.draw()" - ] - }, - { - "cell_type": "markdown", - "id": "a869643c", - "metadata": {}, - "source": [ - " ![HOM](./hom.png \"Hong-Ou-Mandel Effect\")" - ] - }, - { - "cell_type": "markdown", - "id": "94bfc225", - "metadata": {}, - "source": [ - "### Diagram evaluation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f1478f68", - "metadata": {}, - "outputs": [], - "source": [ - "# an amplitude (raw result of tensor contraction)\n", - "from optyx.classical import Select\n", - "(\n", - " hong_ou_mandel >> Select(1, 1)\n", - ").eval().tensor.array" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "801f0884", - "metadata": {}, - "outputs": [], - "source": [ - "hong_ou_mandel.eval().prob_dist()" - ] - }, - { - "cell_type": "markdown", - "id": "b1f34bd2", - "metadata": {}, - "source": [ - "## Qubit teleportation - function syntax and backends" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "47e64a7d", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx import qubit, bit\n", - "from optyx.qubits import Scalar\n", - "\n", - "from optyx import Channel\n", - "from optyx.qubits import Z, X, H, Measure, Scalar, qubit, bit\n", - "from optyx.classical import BitControlledGate" - ] - }, - { - "cell_type": "markdown", - "id": "748d7e3d", - "metadata": {}, - "source": [ - "### Define the protocol" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8fa3a149", - "metadata": {}, - "outputs": [], - "source": [ - "# function syntax\n", - "# CNOT from ZX generators\n", - "\n", - "@Channel.from_callable(\n", - " dom=qubit @ qubit, cod=qubit @ qubit\n", - ")\n", - "def cnot(a, b):\n", - " c, d = Z(1, 2)(a)\n", - " Scalar(2 ** 0.5)()\n", - " return X(2, 1)(c, b), d" - ] - }, - { - "cell_type": "markdown", - "id": "668cadf7", - "metadata": {}, - "source": [ - "\"Teleportation\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8c0301af", - "metadata": {}, - "outputs": [], - "source": [ - "bell = Scalar(0.5 ** 0.5) @ Z(0, 2)\n", - "\n", - "@Channel.from_callable(\n", - " dom=qubit, cod=qubit\n", - ")\n", - "def teleportation(c):\n", - " a, b = bell()\n", - " aa, cc = cnot(a, c)\n", - " c_ = Measure(1)(H()(cc))\n", - " a_ = Measure(1)(aa)\n", - " bb = BitControlledGate(X(1, 1, 0.5))(a_, b)\n", - " return BitControlledGate(Z(1, 1, 0.5))(c_, bb)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "174c4713", - "metadata": {}, - "outputs": [], - "source": [ - "# function syntax avoids explicit swaps and identity wires\n", - "\n", - "teleportation_monoidal_syntax = (\n", - " qubit @ bell >>\n", - " cnot @ qubit >>\n", - " H() @ qubit ** 2 >>\n", - " Measure(1) @ Measure(1) @ qubit >>\n", - " bit @ BitControlledGate(X(1, 1, 0.5)) >>\n", - " BitControlledGate(Z(1, 1, 0.5))\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "7fcce92a", - "metadata": {}, - "source": [ - "### Verify the protocol" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bb29783a", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "from optyx.qubits import Id\n", - "\n", - "# both implementations are equivalent\n", - "np.allclose(\n", - " teleportation.eval().tensor.array,\n", - " teleportation_monoidal_syntax.eval().tensor.array,\n", - " Id(1).double().to_tensor().eval().array\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "25af2db6", - "metadata": {}, - "outputs": [], - "source": [ - "# backends (Perceval, Discopy, Quimb)\n", - "\n", - "from optyx.core.backends import (\n", - " DiscopyBackend,\n", - " QuimbBackend\n", - ")\n", - "\n", - "np.allclose(\n", - " teleportation.eval(DiscopyBackend()).tensor.array,\n", - " teleportation.eval(QuimbBackend()).tensor.array\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "36241fe2", - "metadata": {}, - "source": [ - "## Fusion teleportation" - ] - }, - { - "cell_type": "markdown", - "id": "7043700a", - "metadata": {}, - "source": [ - "Ursin, R., Jennewein, T., Aspelmeyer, M. et al. Quantum teleportation across the Danube. Nature 430, 849 (2004). https://doi.org/10.1038/430849a\n", - "\n", - "\"Fusion" - ] - }, - { - "cell_type": "markdown", - "id": "5721aeab", - "metadata": {}, - "source": [ - "Graphically, the fusion measurement we would like to use, takes the following form:\n", - "\n", - "\"Fusion\n" - ] - }, - { - "cell_type": "markdown", - "id": "1ab1655b", - "metadata": {}, - "source": [ - "where $\\underline{a}, \\underline{b}, \\underline{c}, \\underline{d}$ are the measurement outcomes as the measured photon numbers. " - ] - }, - { - "cell_type": "markdown", - "id": "ea1f931a", - "metadata": {}, - "source": [ - "$\\underline{s} = \\underline{a} \\oplus \\underline{b}$\n", - "\n", - "$\\underline{k} = \\underline{s} (\\underline{b} + \\underline{d}) + \\neg \\underline s (1 - \\frac{\\underline{a} + \\underline{b}}{2})$" - ] - }, - { - "cell_type": "markdown", - "id": "515133cf", - "metadata": {}, - "source": [ - "### Define the protocol" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c557c4b8", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.photonic import DualRail\n", - "\n", - "dual_rail_encoded_bell = (\n", - " bell >>\n", - " DualRail(1) @ DualRail(1)\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a1764edb", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.classical import PostselectBit, BitControlledGate\n", - "from optyx.photonic import Phase\n", - "from optyx.photonic import HadamardBS, qmode\n", - "\n", - "# postselect on fusion success\n", - "fusion_failure_processing = PostselectBit(1)\n", - "\n", - "# apply the box if the control bit is 1, otherwise apply an identity channel\n", - "correction = BitControlledGate(\n", - " HadamardBS() >>\n", - " (Phase(0.5) @ qmode) >>\n", - " HadamardBS()\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7bb5e46f", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.photonic import FusionTypeII\n", - "\n", - "@Channel.from_callable(\n", - " dom=qubit, cod=qmode @ qmode\n", - ")\n", - "def fusion_teleportation(a):\n", - " dual_rail_encoded_input = DualRail(1)(a)\n", - " b, c, d, e = dual_rail_encoded_bell()\n", - " s, k = FusionTypeII()(*dual_rail_encoded_input, b, c)\n", - " fusion_failure_processing(s)\n", - " dr_output_1, dr_output_2 = correction(k, d, e)\n", - " return dr_output_1, dr_output_2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4b5ee771", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.photonic import FusionTypeII\n", - "\n", - "fusion_teleportation_monoidal_syntax = (\n", - " DualRail(1) @ dual_rail_encoded_bell >>\n", - " FusionTypeII() @ qmode**2 >>\n", - " fusion_failure_processing @ correction\n", - ")\n", - "\n", - "fusion_teleportation_monoidal_syntax.foliation().draw(figsize=(8, 8))\n" - ] - }, - { - "cell_type": "markdown", - "id": "5017fe5a", - "metadata": {}, - "source": [ - "### Verify the protocol" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c19354d7", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "from optyx.photonic import Id\n", - "\n", - "array_teleportation = fusion_teleportation_monoidal_syntax.eval().tensor.array\n", - "array_dr = (DualRail(1) @ Scalar(0.5**0.5)).double().to_tensor().eval().array\n", - "\n", - "np.allclose(array_teleportation[:, :, :2, :2, :2, :2], array_dr)\n" - ] - }, - { - "cell_type": "markdown", - "id": "6e6b4039", - "metadata": {}, - "source": [ - "### Approximate contraction with Quimb and Cotengra" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "51acb733", - "metadata": {}, - "outputs": [], - "source": [ - "def _flat(x):\n", - " return np.asarray(x, dtype=complex).ravel()\n", - "\n", - "def cosine_similarity(SU, SV):\n", - " a, b = _flat(SU), _flat(SV)\n", - " num = abs(np.vdot(a, b))\n", - " den = np.linalg.norm(a) * np.linalg.norm(b)\n", - " if den == 0:\n", - " return 0.0\n", - " return float(num / den)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fb497580", - "metadata": {}, - "outputs": [], - "source": [ - "from cotengra import HyperCompressedOptimizer\n", - "\n", - "# cosine similarity between the result of exact contaction and approximate contraction for different chis\n", - "errors = []\n", - "for chi in range(1, 6):\n", - " optimiser = HyperCompressedOptimizer(\n", - " chi=chi\n", - " )\n", - " error_for_chi = []\n", - " for _ in range(10):\n", - " error_for_chi.append(\n", - " cosine_similarity(\n", - " fusion_teleportation.eval(QuimbBackend(optimiser)).tensor.array,\n", - " array_teleportation\n", - " )\n", - " )\n", - " errors.append(np.median(error_for_chi))\n", - "\n", - "import matplotlib.pyplot as plt\n", - "plt.plot(range(1, 6), errors, marker='o')\n", - "plt.grid()\n", - "plt.xlabel('Chi')\n", - "plt.ylabel('Average cosine similarity')\n", - "plt.title('Fusion-based Teleportation similarity vs Contraction Chi')\n" - ] - }, - { - "cell_type": "markdown", - "id": "351608f0", - "metadata": {}, - "source": [ - "### Photon loss and channel fidelity" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ac439493", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.photonic import FusionTypeII, PhotonLoss\n", - "\n", - "# photo loss is one of the main error sources in photonic quantum computing\n", - "def fusion_teleportation_with_photon_loss(p):\n", - " @Channel.from_callable(\n", - " dom=qubit, cod=qmode**2\n", - " )\n", - " def fusion_teleportation(a):\n", - " dr_input_1, dr_input_2 = DualRail(1)(a)\n", - " b, c, d, e = dual_rail_encoded_bell()\n", - " # apply photon loss to all modes here:\n", - " #-----------------------------------\n", - " dr_input_1_loss, dr_input_2_loss, b_loss, c_loss, d_loss, e_loss = (\n", - " PhotonLoss(p)(dr_input_1), PhotonLoss(p)(dr_input_2), PhotonLoss(p)(b), PhotonLoss(p)(c), PhotonLoss(p)(d), PhotonLoss(p)(e)\n", - " )\n", - " #-----------------------------------\n", - " s, k = FusionTypeII()(dr_input_1_loss, dr_input_2_loss, b_loss, c_loss)\n", - " fusion_failure_processing(s)\n", - " output_rail_1, output_rail = correction(k, d_loss, e_loss)\n", - " return output_rail_1, output_rail\n", - " return fusion_teleportation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ccefb368", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.core.channel import Spider, Diagram\n", - "\n", - "def get_perm(n):\n", - " return sorted(sorted(list(range(n))), key=lambda i: i % 2)\n", - "\n", - "def channel_fidelity(diagram_1, diagram_2):\n", - " bell_1 = Channel.tensor(*[Spider(0, 2, ty) for ty in diagram_1.dom])\n", - " permutation_1 = Diagram.permutation(get_perm(len(bell_1.cod)), bell_1.cod)\n", - "\n", - " bell_2 = Channel.tensor(*[Spider(0, 2, ty) for ty in diagram_2.dom])\n", - " permutation_2 = Diagram.permutation(get_perm(len(bell_2.cod)), bell_2.cod)\n", - "\n", - " choi_1 = bell_1 >> permutation_1 >> (diagram_1 @ diagram_1.dom)\n", - " choi_2 = bell_2 >> permutation_2 >> (diagram_2 @ diagram_2.dom)\n", - "\n", - " return (choi_1 >> choi_2.dagger()).eval().tensor.array\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7e1a2957", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "ps = np.linspace(0.0, 1.0, 20)\n", - "\n", - "# compute fidelity for different photon loss probabilities\n", - "F_avg_vals = []\n", - "succ_probs = []\n", - "for p in ps:\n", - " S_impl = fusion_teleportation_with_photon_loss(p)\n", - " S_tgt = fusion_teleportation_monoidal_syntax\n", - " s = channel_fidelity(S_impl, S_tgt)\n", - "\n", - " succ_probs.append(s)\n", - "\n", - "plt.figure()\n", - "plt.plot(ps, succ_probs, marker='o')\n", - "plt.grid(True)\n", - "plt.xlabel('Photon Survival Probability (p)')\n", - "plt.ylabel('Fidelity')\n", - "plt.title('Fusion-based Teleportation: Photon Survival Probability vs Fidelity')\n" - ] - }, - { - "cell_type": "markdown", - "id": "07c143a0", - "metadata": {}, - "source": [ - "## Distributed entanglement generation" - ] - }, - { - "cell_type": "markdown", - "id": "9fa0ec11", - "metadata": {}, - "source": [ - "![Distributed entanglement](./distributed_entanglement.png \"An example of distributed entanglement generation\")\n", - "\n", - "Main, D., Drmota, P., Nadlinger, D.P. et al. Distributed quantum computing across an optical network link. Nature 638, 383–388 (2025). https://doi.org/10.1038/s41586-024-08404-x~\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "e20c30a8", - "metadata": {}, - "source": [ - "### Fusion and photon distinguishability" - ] - }, - { - "cell_type": "markdown", - "id": "18ab5a86", - "metadata": {}, - "source": [ - "#### Define the protocol" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bdb9611d", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.qubits import Z, Scalar, Id, Measure\n", - "from optyx.photonic import DualRail\n", - "from optyx.classical import PostselectBit\n", - "from discopy.drawing import Equation\n", - "\n", - "bell_state = Z(0, 2) @ Scalar(0.5 ** 0.5)\n", - "\n", - "# generators introducing new qubits accepting internal states\n", - "internal_state_1 = [1, 0]\n", - "internal_state_2 = [0, 1]\n", - "dual_rail_encoding = lambda state: DualRail(1, internal_states=[state])\n", - "encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(internal_state_2)\n", - "\n", - "# postselect on fusion success and no errors\n", - "post_select = PostselectBit(1) @ PostselectBit(0)\n", - "\n", - "protocol = (\n", - " bell_state @ bell_state >>\n", - " Id(1) @ (encoding_layer >> FusionTypeII() >> post_select) @ Id(1)\n", - ")\n", - "measure = Measure(2)\n", - "\n", - "Equation(protocol >> measure, bell_state >> measure).draw(figsize=(8, 8))" - ] - }, - { - "cell_type": "markdown", - "id": "eb9f34b3", - "metadata": {}, - "source": [ - "#### Define a set of internal states with varying degrees of distinguishability" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9e5c4078", - "metadata": {}, - "outputs": [], - "source": [ - "import math\n", - "\n", - "# internal states - 2 dimensional - move further and further apart\n", - "def rotated_unit_vectors(n: int = 10):\n", - " for i in range(n):\n", - " theta = i * (math.pi / 2) / (n - 1)\n", - " yield (math.cos(theta), math.sin(theta))\n", - "\n", - "unit_vectors = list(rotated_unit_vectors(15))" - ] - }, - { - "cell_type": "markdown", - "id": "945ace07", - "metadata": {}, - "source": [ - "#### Run the experiments" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "30b96ad0", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.qubits import Discard\n", - "\n", - "inner_product_states = []\n", - "inner_product_bell_states = []\n", - "\n", - "result_bell = bell_state.eval().tensor.array.flatten()\n", - "result_bell = result_bell / np.linalg.norm(result_bell)\n", - "\n", - "for vector in unit_vectors:\n", - " encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(vector)\n", - " experiment = bell_state @ bell_state >> Id(1) @ (encoding_layer >> FusionTypeII()\n", - " >> post_select) @ Id(1)\n", - "\n", - " f = (experiment >> bell_state.dagger()).inflate(2).eval().tensor.array\n", - " normalisation = (experiment >> Discard(2)).inflate(2).eval().tensor.array\n", - "\n", - " inner_product_states.append(np.inner(vector, internal_state_1))\n", - " inner_product_bell_states.append(f/normalisation)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1c50f388", - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "plt.figure(figsize=(6, 4))\n", - "plt.plot(inner_product_states, inner_product_bell_states, marker='o')\n", - "plt.xlabel('')\n", - "plt.ylabel(' (fidelity)')\n", - "plt.title('Fidelity of the resulting state with the perfect Bell state')\n", - "plt.grid(True)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "7aa6a1d2", - "metadata": {}, - "source": [ - "## Interfacing with external libraries" - ] - }, - { - "cell_type": "markdown", - "id": "e4b64d36", - "metadata": {}, - "source": [ - "### Graphix\n", - "\n", - "Open graphs only for now (graph + measurements; desire to implement deterministically - no corrections)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "79f358ae", - "metadata": {}, - "outputs": [], - "source": [ - "import graphix\n", - "\n", - "circuit = graphix.Circuit(2)\n", - "circuit.cnot(0, 1)\n", - "\n", - "pattern = circuit.transpile().pattern\n", - "\n", - "pattern.draw_graph()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bff50dee", - "metadata": {}, - "outputs": [], - "source": [ - "simulator = graphix.simulator.PatternSimulator(pattern, backend=\"statevector\")\n", - "graphix_result = simulator.run().psi.conj()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bf2d9106", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx import qubits\n", - "\n", - "optyx_zx = qubits.Circuit(pattern)\n", - "\n", - "optyx_res = (\n", - " qubits.Ket(\"+\")**2 >> optyx_zx\n", - ").eval().amplitudes()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "908e477d", - "metadata": {}, - "outputs": [], - "source": [ - "for keys in optyx_res.keys():\n", - " assert np.isclose(optyx_res[keys], graphix_result[keys], atol=1e-6)" - ] - }, - { - "cell_type": "markdown", - "id": "598ab8dc", - "metadata": {}, - "source": [ - "### Perceval circuits and processors" - ] - }, - { - "cell_type": "markdown", - "id": "7d106d80", - "metadata": {}, - "source": [ - "#### Define the protocol in Perceval" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "988c9618", - "metadata": {}, - "outputs": [], - "source": [ - "import perceval as pcvl\n", - "\n", - "p = pcvl.Processor(\"SLOS\", 6)\n", - "p.add(0, pcvl.catalog[\"postprocessed cnot\"].build_processor())\n", - "\n", - "p.add(0, pcvl.BS.H())\n", - "p.add(0, pcvl.Detector.pnr())\n", - "p.add(1, pcvl.Detector.pnr())\n", - "p.add(2, pcvl.Detector.pnr())\n", - "p.add(3, pcvl.Detector.pnr())\n", - "\n", - "ff_X = pcvl.FFCircuitProvider(\n", - " 2, 0, pcvl.Circuit(2)\n", - ")\n", - "ff_X.add_configuration(\n", - " [0, 1], pcvl.PERM([1, 0])\n", - ")\n", - "p.add(2, ff_X)\n", - "\n", - "phi = pcvl.P(\"phi\")\n", - "ff_Z = pcvl.FFConfigurator(\n", - " 2, 3,\n", - " pcvl.PS(phi),\n", - " {\"phi\": 0}\n", - ").add_configuration(\n", - " [0, 1],\n", - " {\"phi\": np.pi}\n", - ")\n", - "p.add(0, ff_Z)\n", - "\n", - "pcvl.pdisplay(p, recursive=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "96d5bf6b", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.qubits import Ket\n", - "\n", - "state = Ket(\"+\") >> Z(1, 1, 0.3)\n", - "state_array = state.eval().tensor.array\n", - "state_array = state_array / np.linalg.norm(state_array)" - ] - }, - { - "cell_type": "markdown", - "id": "f64e6adb", - "metadata": {}, - "source": [ - "#### Evaluate the protocol in Perceval" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bce649df", - "metadata": {}, - "outputs": [], - "source": [ - "to_transmit = (complex(state_array[0])*pcvl.BasicState([1, 0]) +\n", - " complex(state_array[1])*pcvl.BasicState([0, 1]))\n", - "\n", - "sg = pcvl.StateGenerator(pcvl.Encoding.DUAL_RAIL)\n", - "bell_state = sg.bell_state(\"phi+\")\n", - "\n", - "input_state = to_transmit * bell_state\n", - "p.min_detected_photons_filter(2)\n", - "\n", - "input_state *= pcvl.BasicState([0, 0])\n", - "\n", - "p.with_input(input_state)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f0c1fbf3", - "metadata": {}, - "outputs": [], - "source": [ - "result_perceval = p.probs()" - ] - }, - { - "cell_type": "markdown", - "id": "ab098b6e", - "metadata": {}, - "source": [ - "#### Convert to Optyx and simulate" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "463bcb6f", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx import Channel\n", - "\n", - "optyx_diagram = Channel.from_perceval(p)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3f3fca2d", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.qubits import Scalar, Ket\n", - "from optyx.photonic import DualRail\n", - "\n", - "bell_state = Z(0, 2) @ Scalar(0.5**0.5)\n", - "transmit = Ket(\"+\") >> Z(1, 1, 0.3)\n", - "\n", - "input_state = transmit @ bell_state\n", - "\n", - "protocol = (\n", - " input_state >>\n", - " DualRail(3) >>\n", - " Channel.from_perceval(p)\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "54633b7a", - "metadata": {}, - "outputs": [], - "source": [ - "result_optyx = protocol.eval().prob_dist()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e019251e", - "metadata": {}, - "outputs": [], - "source": [ - "def check_dict_agreement(d1, d2, rtol=1e-5, atol=1e-8):\n", - " for key in d1.keys() - d2.keys():\n", - " assert np.isclose(d1[key], 0, rtol=rtol, atol=atol)\n", - " for key in d2.keys() - d1.keys():\n", - " assert np.isclose(d2[key], 0, rtol=rtol, atol=atol)\n", - " for key in d1.keys() & d2.keys():\n", - " assert np.isclose(d1[key], d2[key], rtol=rtol, atol=atol)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ca6102c5", - "metadata": {}, - "outputs": [], - "source": [ - "check_dict_agreement(\n", - " {tuple(k): v for k, v in dict(result_perceval[\"results\"]).items()},\n", - " result_optyx\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a7c85548", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "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.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 43d2bdc73055562f3f6b0908cc35f5d07fe39184 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Wed, 24 Sep 2025 11:22:51 +0100 Subject: [PATCH 24/59] Fixed a bug in daggers for Multiply and Divide --- optyx/core/diagram.py | 11 +++++++++-- optyx/core/zw.py | 37 +++++++++++++++++-------------------- optyx/utils/utils.py | 34 ++++++++++++++++++++++++++++------ 3 files changed, 54 insertions(+), 28 deletions(-) diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index ce40e78e..35cc9b50 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -303,6 +303,7 @@ def to_tensor( ) -> tensor.Diagram: """Returns a :class:`tensor.Diagram` for evaluation""" from optyx.core import zw + from optyx.utils.utils import is_diagram_LO, is_identity prev_layers: List[Tuple[int, Box]] = [] @@ -321,7 +322,7 @@ def list_to_dim(dims: np.ndarray | list) -> Dim: ) layer_dims = input_dims - if len(self.boxes) == 0 and len(self.offsets) == 0: + if is_identity(self): return tensor.Diagram.id(list_to_dim(layer_dims)) for i, (box, left_offset) in enumerate(zip(self.boxes, self.offsets)): @@ -336,13 +337,19 @@ def list_to_dim(dims: np.ndarray | list) -> Dim: input_dims, prev_layers ) + dims_in = layer_dims[left_offset:left_offset + len(box.dom)] + dims_out, _ = modify_io_dims_against_max_dim( box.determine_output_dimensions(dims_in), None, max_dim ) - if isinstance(box, zw.LO_ELEMENTS): + + if ( + isinstance(box, zw.LO_ELEMENTS) or + is_identity(box) + ): prev_layers.append((left_offset, box)) elif isinstance(box, DualRail): prev_layers.append((left_offset, zw.Select(1))) diff --git a/optyx/core/zw.py b/optyx/core/zw.py index d23b95d8..65cf0ce5 100644 --- a/optyx/core/zw.py +++ b/optyx/core/zw.py @@ -291,7 +291,6 @@ def __init__( super().__init__(legs_in, legs_out, diagram.Mode(1)) self.legs_in = legs_in self.legs_out = legs_out - self.photon_sum_preserving = False def conjugate(self): return ZBox(self.legs_in, self.legs_out, self.amplitudes.conjugate()) @@ -430,7 +429,6 @@ def __init__(self, name = "Create(1)" if self.photons == (1,) else f"Create({photons})" super().__init__(name, 0, len(self.photons)) - self.photon_sum_preserving = False def conjugate(self): return self @@ -534,7 +532,6 @@ def __init__(self, self.photons = photons or (1,) name = "Select(1)" if self.photons == (1,) else f"Select({photons})" super().__init__(name, len(self.photons), 0) - self.photon_sum_preserving = False def inflate(self, d): @@ -690,20 +687,20 @@ class Multiply(ZWBox): Example ------- - >>> mbox = Multiply() - >>> result = mbox.to_tensor(input_dims=[3, 3]).eval().array - >>> import numpy as np - >>> assert result.shape == (3, 3, 9) - >>> nonzero = np.nonzero(result) - >>> assert len(nonzero[0]) > 0 + >>> mbox = Create(3, 2) >> Multiply() >> Select(6) + >>> mbox_dagger = mbox.dagger() + >>> tensor = mbox.to_tensor().eval().array + >>> assert np.allclose(tensor, 1.0) + >>> tensor_dagger = mbox_dagger.to_tensor().eval().array + >>> assert np.allclose(tensor_dagger, 1.0) + """ def __init__(self, is_dagger: bool = False): dom = diagram.Mode(1) if is_dagger else diagram.Mode(2) cod = diagram.Mode(2) if is_dagger else diagram.Mode(1) - super().__init__("Multiply", dom, cod) - self.photon_sum_preserving = False + self.is_dagger = is_dagger def truncation_specification( self, @@ -716,7 +713,7 @@ def truncation_specification( def determine_output_dimensions(self, input_dims: List[int]) -> List[int]: if self.is_dagger: - return [int(input_dims[0])] + return [int(input_dims[0]), int(input_dims[0])] return [int(np.prod(input_dims))] def conjugate(self): @@ -732,11 +729,12 @@ class Divide(ZWBox): Example ------- - >>> dbox = Divide() - >>> result = dbox.to_tensor(input_dims=[3, 3]).eval().array - >>> import numpy as np - >>> assert result.shape == (3, 3, 9) - >>> assert np.all(result >= 0) + >>> dbox = Create(9, 3) >> Divide() >> Select(3) + >>> dbox_dagger = dbox.dagger() + >>> result = dbox.to_tensor().eval().array + >>> assert np.allclose(result, 1.0) + >>> result_dagger = dbox_dagger.to_tensor().eval().array + >>> assert np.allclose(result_dagger, 1.0) """ def __init__(self, is_dagger: bool = False): @@ -744,7 +742,6 @@ def __init__(self, is_dagger: bool = False): cod = diagram.Mode(2) if is_dagger else diagram.Mode(1) super().__init__("Divide", dom, cod) self.is_dagger = is_dagger - self.photon_sum_preserving = False def truncation_specification( self, @@ -759,8 +756,8 @@ def truncation_specification( def determine_output_dimensions(self, input_dims: List[int]) -> List[int]: if self.is_dagger: - return [int(input_dims[0])] - return [int(np.prod(input_dims))] + return [diagram.MAX_DIM, diagram.MAX_DIM] + return [int(input_dims[0])] def conjugate(self): return self diff --git a/optyx/utils/utils.py b/optyx/utils/utils.py index df0e6502..e485f4aa 100644 --- a/optyx/utils/utils.py +++ b/optyx/utils/utils.py @@ -453,12 +453,19 @@ def update_connections( end = len(wires_in_light_cone) - previous_right_offset # replace cod slice with a dom-length slice of the same boolean + from optyx.core.control import BitControlledBox + if isinstance(previous_box, BitControlledBox): + return ( + wires_in_light_cone[:start] + + [False] # control wire always out of light-cone + + [connected] * (len(previous_box.dom) - 1) + + wires_in_light_cone[end:] + ) return ( wires_in_light_cone[:start] + [connected] * len(previous_box.dom) + wires_in_light_cone[end:] ) - def calculate_right_offset(total_wires: int, left_offset: int, span_len: int) -> int: """Right offset = number of wires to the right of a span.""" return total_wires - span_len - left_offset @@ -517,10 +524,11 @@ def get_max_dim_for_box( prev_layers, ): from optyx.core.diagram import Swap, DualRail - from optyx.core.zw import Create, Endo + from optyx.core.zw import Create, Endo, Divide, Multiply from optyx.core.control import BitControlledBox - if len(box.dom) == 0 or isinstance(box, (Swap, Endo)): + if (len(box.dom) == 0 or + isinstance(box, (Swap, Endo, Divide, Multiply))): return 1e20 dim_for_box = 0 @@ -567,10 +575,8 @@ def get_max_dim_for_box( ) if idxs: dim_for_box += sum(previous_box.photons[i] for i in idxs) - if isinstance(previous_box, DualRail): dim_for_box += 1 - if isinstance(previous_box, Swap): wires_in_light_cone = ( wires_in_light_cone[:adj_left] @@ -586,4 +592,20 @@ def get_max_dim_for_box( previous_right_offset, ) dim_for_box += sum(2 * dim for wire, dim in zip(wires_in_light_cone, input_dims) if wire) + 1 - return max(dim_for_box, 3) + return max(dim_for_box, 2) + + +def is_diagram_LO(diagram): + from optyx.core.zw import LO_ELEMENTS + if is_identity(diagram): + return True + + for box in diagram.boxes: + if is_identity(box): + continue + if not isinstance(box, LO_ELEMENTS): + return False + + return True + +is_identity = lambda box: len(box.boxes) == 0 and len(box.offsets) == 0 \ No newline at end of file From c5e9df413493c71531f23d18b97ec17566f498f2 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Wed, 24 Sep 2025 11:57:15 +0100 Subject: [PATCH 25/59] Fixed a bug in zw.Mod2 --- optyx/core/zw.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/optyx/core/zw.py b/optyx/core/zw.py index 65cf0ce5..afec0796 100644 --- a/optyx/core/zw.py +++ b/optyx/core/zw.py @@ -780,7 +780,9 @@ class Mod2(ZWBox): """ def __init__(self, is_dagger: bool = False): - super().__init__("Mod2", diagram.Mode(1), diagram.Bit(1)) + dom = diagram.Bit(1) if is_dagger else diagram.Mode(1) + cod = diagram.Mode(1) if is_dagger else diagram.Bit(1) + super().__init__("Mod2", dom, cod) self.is_dagger = is_dagger def truncation_specification( @@ -794,7 +796,7 @@ def truncation_specification( def determine_output_dimensions(self, input_dims: List[int]) -> List[int]: if self.is_dagger: - return [input_dims[0]] + return [diagram.MAX_DIM] return [2] def conjugate(self): From b399ccbd47b8cda1d97c50f94e53262fe350227e Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Wed, 24 Sep 2025 18:40:26 +0100 Subject: [PATCH 26/59] refactored the max dimension finding algorithm --- optyx/classical.py | 2 +- optyx/core/channel.py | 4 +- optyx/core/control.py | 15 +++- optyx/core/diagram.py | 154 ++++++++++++++++++++++++++++-------------- optyx/core/zw.py | 37 +++++++++- optyx/core/zx.py | 4 ++ optyx/utils/utils.py | 77 ++++++++++----------- 7 files changed, 195 insertions(+), 98 deletions(-) diff --git a/optyx/classical.py b/optyx/classical.py index 382ab4c7..b6e0c5eb 100644 --- a/optyx/classical.py +++ b/optyx/classical.py @@ -192,7 +192,7 @@ def __init__( ) super().__init__( - f"BitControlledGate", + "BitControlledGate", kraus, bit @ tp**len(control_gate_single.dom), tp**len(control_gate_single.cod) diff --git a/optyx/core/channel.py b/optyx/core/channel.py index cabf31f3..5fd5a838 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -240,7 +240,8 @@ def is_pure(self): for layer in self: generator = layer.inside[0][1] - # if we have a discard/measure acting on quantum types, it's not pure + # if we have a discard/measure + # acting on quantum types, it's not pure if ( isinstance(generator, (Discard, Measure)) and any(not ty.is_classical for ty in generator.dom.inside) @@ -878,6 +879,7 @@ class Cap(frobenius.Cap, Channel): class Hypergraph(hypergraph.Hypergraph): # pragma: no cover category, functor = Category, Functor + Hypergraph.ty_factory = Ty Diagram.spider_factory = Spider Diagram.cup_factory = Cup diff --git a/optyx/core/control.py b/optyx/core/control.py index f691b6c8..b210431d 100644 --- a/optyx/core/control.py +++ b/optyx/core/control.py @@ -40,7 +40,7 @@ from discopy import tensor from discopy.frobenius import Dim import numpy as np -from optyx.utils.utils import BasisTransition +from optyx.utils.utils import BasisTransition, is_diagram_LO from optyx.core import diagram, zw @@ -119,7 +119,18 @@ def __init__( self.action_box = action_box self.default_box = default_box self.is_dagger = is_dagger - self.photon_sum_preserving = False + self.photon_preservation_behaviour = \ + diagram.PhotonNumberPreservation.CUSTOM + + def photon_number_transform(self, dims_in, dims_out): + if is_diagram_LO(self.action_box) and is_diagram_LO(self.default_box): + from optyx.core.zx import Z + return Z(1, 0) @ self.default_box if not self.is_dagger else \ + Z(0, 1) @ self.default_box + else: + self.photon_preservation_behaviour = \ + diagram.PhotonNumberPreservation.NON_LO + return super().photon_number_transform(dims_in, dims_out) def determine_output_dimensions(self, input_dims: List[int]) -> List[int]: diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index 35cc9b50..d4adee98 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -226,8 +226,8 @@ from discopy.cat import factory, rsubs from discopy.frobenius import Dim from discopy.quantum.gates import format_number +from enum import Enum from optyx.utils.utils import ( - modify_io_dims_against_max_dim, BasisTransition, calculate_right_offset, get_max_dim_for_box @@ -237,6 +237,24 @@ MAX_DIM = 10 +class PhotonNumberPreservation(Enum): + """This is used as a flag to indicate how a box acts + on the incoming photons. Used by the tensor network building + algorithm to determine the bond dimensions / truncations. + + LO: Linear Optical - preserves photon number between input and output + NON_LO: Does not preserve photon number between input and output + CUSTOM: Custom behaviour defined by the user + (a box need to implement a method) + QUBIT: Qubit - does not act on photons + """ + + LO = "lo" + NON_LO = "non_lo" + CUSTOM = "custom" + QUBIT = "qubit" + + class Ob(frobenius.Ob): """Basic object in an optyx Diagram: bit or mode""" @@ -303,28 +321,21 @@ def to_tensor( ) -> tensor.Diagram: """Returns a :class:`tensor.Diagram` for evaluation""" from optyx.core import zw - from optyx.utils.utils import is_diagram_LO, is_identity - - prev_layers: List[Tuple[int, Box]] = [] - - # pylint: disable=import-outside-toplevel - def list_to_dim(dims: np.ndarray | list) -> Dim: - """Converts a list of dimensions to a Dim object""" - return Dim(*[int(i) for i in dims]) - - number_of_input_layer_wires = len(self.dom) + from optyx.utils.utils import is_identity if input_dims is None: input_dims = [2 for _ in range(len(self.dom))] else: assert len(self.dom) == len(input_dims), ( - f"Input dims length {len(input_dims)} does not match number of input wires {len(self.dom)}" + "Input dims length does not match number of input wires" ) layer_dims = input_dims if is_identity(self): - return tensor.Diagram.id(list_to_dim(layer_dims)) + return tensor.Diagram.id(Dim(*[int(i) for i in layer_dims])) + number_of_input_layer_wires = len(self.dom) + prev_layers: List[Tuple[int, Box]] = [] for i, (box, left_offset) in enumerate(zip(self.boxes, self.offsets)): right_offset = calculate_right_offset( number_of_input_layer_wires, left_offset, len(box.dom) @@ -337,47 +348,23 @@ def list_to_dim(dims: np.ndarray | list) -> Dim: input_dims, prev_layers ) - dims_in = layer_dims[left_offset:left_offset + len(box.dom)] + dims_out = [max_dim if i > max_dim else i + for i in box.determine_output_dimensions(dims_in)] - dims_out, _ = modify_io_dims_against_max_dim( - box.determine_output_dimensions(dims_in), - None, - max_dim - ) - - if ( - isinstance(box, zw.LO_ELEMENTS) or - is_identity(box) - ): - prev_layers.append((left_offset, box)) - elif isinstance(box, DualRail): - prev_layers.append((left_offset, zw.Select(1))) - prev_layers.append((left_offset, zw.Create(0))) - prev_layers.append((left_offset, box)) - else: - if len(dims_in) > 0: - prev_layers.append( - ( - left_offset, - zw.Select(*[int(i) for i in np.array(dims_in)-1]) - ) - ) - if len(dims_out) > 0: - prev_layers.append( - ( - left_offset, - zw.Create(*[int(i) for i in np.array(dims_out)-1]) - ) - ) + prev_layers += [ + (left_offset, replacement_box) for replacement_box in + box.photon_number_transform(dims_in, dims_out) + ] left = Dim() if left_offset > 0: - left = list_to_dim(layer_dims[0:left_offset]) + left = Dim(*[int(i) for i in layer_dims[0:left_offset]]) right = Dim() if left_offset + len(box.dom) < number_of_input_layer_wires: - right = list_to_dim( - layer_dims[left_offset + len(box.dom): number_of_input_layer_wires] + right = Dim( + *[int(i) for i in layer_dims[left_offset + len(box.dom): + number_of_input_layer_wires]] ) number_of_input_layer_wires += -len(box.dom) + len(box.cod) @@ -405,7 +392,6 @@ def list_to_dim(dims: np.ndarray | list) -> Dim: diagram >>= zboxes return diagram - @classmethod def from_bosonic_operator(cls, n_modes, operators, scalar=1): """Create a :class:`zw` diagram from a bosonic operator.""" @@ -474,8 +460,42 @@ class Box(frobenius.Box, Diagram): def __init__(self, name, dom, cod, array=None, **params): self._array = array - self.photon_sum_preserving = True super().__init__(name, dom, cod, **params) + self.photon_preservation_behaviour = PhotonNumberPreservation.NON_LO + + def photon_number_transform( + self, dims_in: list[int], dims_out: list[int] + ) -> Box: + if ( + self.photon_preservation_behaviour == + PhotonNumberPreservation.LO or + self.photon_preservation_behaviour == + PhotonNumberPreservation.QUBIT + ): + return [self] + elif self.photon_preservation_behaviour == \ + PhotonNumberPreservation.NON_LO: + from optyx.core.zw import Create, Select + + return_list = [] + if len(dims_in) > 0: + return_list.append( + ( + Select(*[int(i) for i in np.array(dims_in)-1]) + ) + ) + if len(dims_out) > 0: + return_list.append( + ( + Create(*[int(i) for i in np.array(dims_out)-1]) + ) + ) + return return_list + else: + raise NotImplementedError( + f"{self.__class__.__name__} does not implement " + "photon_number_transform method" + ) @classmethod def get_perm(self, n, d): @@ -654,6 +674,7 @@ class Spider(frobenius.Spider, Box): draw_as_spider = True color = "green" + photon_preservation_behaviour = PhotonNumberPreservation.NON_LO def conjugate(self): return self @@ -766,6 +787,8 @@ def grad(self, var, **params): class Swap(frobenius.Swap, Box): """Swap in optyx diagram""" + photon_preservation_behaviour = PhotonNumberPreservation.LO + def conjugate(self): return self @@ -811,6 +834,7 @@ def __init__(self, scalar: complex | Symbol): super().__init__( name="scalar", dom=Mode(0), cod=Mode(0), data=self.scalar ) + self.photon_preservation_behaviour = PhotonNumberPreservation.LO def conjugate(self): return Scalar(self.scalar.conjugate()) @@ -870,7 +894,22 @@ def __init__(self, super().__init__("2R", dom, cod) self.internal_state = internal_state self.is_dagger = is_dagger - self.photon_sum_preserving = False + self.photon_preservation_behaviour = \ + PhotonNumberPreservation.CUSTOM + + def photon_number_transform(self, dims_in, dims_out): + from optyx.core.zw import Create + from optyx.core.zx import Z + from copy import deepcopy + + prev_layers = [] + prev_layers.append(Z(1, 0) if not self.is_dagger else Z(0, 1)) + prev_layers.append(Create(1) if not self.is_dagger else Z(1, 0)) + box = deepcopy(self) + if not self.is_dagger: + box.dom = Mode(1) + prev_layers.append(box) + return prev_layers if not self.is_dagger else prev_layers[::-1] def conjugate(self): return self @@ -930,6 +969,21 @@ def __init__(self, is_dagger=False): else: super().__init__("PTD", Mode(1), Bit(1)) self.is_dagger = is_dagger + self.photon_preservation_behaviour = \ + PhotonNumberPreservation.CUSTOM + + def photon_number_transform(self, dims_in, dims_out): + from optyx.core.zw import Create, Select + from optyx.core.zx import Z + + prev_layers = [] + if self.is_dagger: + prev_layers.append(Z(1, 0)) + prev_layers.append(Create(dims_out[0]-1)) + else: + prev_layers.append(Select(0)) + prev_layers.append(Z(0, 1)) + return prev_layers def truncation_specification( self, diff --git a/optyx/core/zw.py b/optyx/core/zw.py index afec0796..1306fa6f 100644 --- a/optyx/core/zw.py +++ b/optyx/core/zw.py @@ -171,6 +171,8 @@ def __init__(self, name, dom, cod, **params): if isinstance(cod, int): cod = diagram.Mode(cod) super().__init__(name=name, dom=dom, cod=cod, **params) + self.photon_preservation_behaviour = \ + diagram.PhotonNumberPreservation.LO class IndexableAmplitudes: @@ -291,6 +293,8 @@ def __init__( super().__init__(legs_in, legs_out, diagram.Mode(1)) self.legs_in = legs_in self.legs_out = legs_out + self.photon_preservation_behaviour = \ + diagram.PhotonNumberPreservation.NON_LO def conjugate(self): return ZBox(self.legs_in, self.legs_out, self.amplitudes.conjugate()) @@ -426,10 +430,14 @@ def __init__(self, "All internal states must be of the same length" self.internal_states = internal_states - + self.photon_preservation_behaviour = \ + diagram.PhotonNumberPreservation.CUSTOM name = "Create(1)" if self.photons == (1,) else f"Create({photons})" super().__init__(name, 0, len(self.photons)) + def photon_number_transform(self, dims_in, dims_out): + return super().photon_number_transform(dims_in, dims_out) + def conjugate(self): return self @@ -530,9 +538,14 @@ def __init__(self, self.internal_states = internal_states self.photons = photons or (1,) + self.photon_preservation_behaviour = \ + diagram.PhotonNumberPreservation.CUSTOM name = "Select(1)" if self.photons == (1,) else f"Select({photons})" super().__init__(name, len(self.photons), 0) + def photon_number_transform(self, dims_in, dims_out): + return super().photon_number_transform(dims_in, dims_out) + def inflate(self, d): dgrm = Create( @@ -701,6 +714,8 @@ def __init__(self, is_dagger: bool = False): cod = diagram.Mode(2) if is_dagger else diagram.Mode(1) super().__init__("Multiply", dom, cod) self.is_dagger = is_dagger + self.photon_preservation_behaviour = \ + diagram.PhotonNumberPreservation.NON_LO def truncation_specification( self, @@ -742,6 +757,8 @@ def __init__(self, is_dagger: bool = False): cod = diagram.Mode(2) if is_dagger else diagram.Mode(1) super().__init__("Divide", dom, cod) self.is_dagger = is_dagger + self.photon_preservation_behaviour = \ + diagram.PhotonNumberPreservation.NON_LO def truncation_specification( self, @@ -784,6 +801,19 @@ def __init__(self, is_dagger: bool = False): cod = diagram.Mode(1) if is_dagger else diagram.Bit(1) super().__init__("Mod2", dom, cod) self.is_dagger = is_dagger + self.photon_preservation_behaviour = \ + diagram.PhotonNumberPreservation.CUSTOM + + def photon_number_transform(self, dims_in, dims_out): + from optyx.core.zx import Z + prev_layers = [] + if self.is_dagger: + prev_layers.append(Z(1, 0)) + prev_layers.append(Create(dims_out[0] - 1)) + else: + prev_layers.append(Select(0)) + prev_layers.append(Z(0, 1)) + return prev_layers def truncation_specification( self, @@ -828,5 +858,6 @@ def Id(n): Select, Add, Endo, - diagram.Swap -) \ No newline at end of file + diagram.Swap, + Add +) diff --git a/optyx/core/zx.py b/optyx/core/zx.py index 8a441dc1..c52c20c3 100644 --- a/optyx/core/zx.py +++ b/optyx/core/zx.py @@ -375,6 +375,8 @@ def __init__(self, name, dom, cod, **params): if isinstance(cod, int): cod = diagram.Bit(cod) super().__init__(name=name, dom=dom, cod=cod, **params) + self.photon_preservation_behaviour = \ + diagram.PhotonNumberPreservation.QUBIT def conjugate(self): raise NotImplementedError @@ -413,6 +415,8 @@ def __init__(self, n_legs_in, n_legs_out, phase=0): phase_str = f", {self.phase}" if self.phase else "" self.name = f"{factory_str}({n_legs_in}, {n_legs_out}{phase_str})" self.n_legs_in, self.n_legs_out = n_legs_in, n_legs_out + self.photon_preservation_behaviour = \ + diagram.PhotonNumberPreservation.QUBIT def conjugate(self): return type(self)(self.n_legs_in, self.n_legs_out, -self.phase) diff --git a/optyx/utils/utils.py b/optyx/utils/utils.py index e485f4aa..8e3d2a14 100644 --- a/optyx/utils/utils.py +++ b/optyx/utils/utils.py @@ -158,15 +158,6 @@ def basis_vector_from_kets( return j -def modify_io_dims_against_max_dim(input_dims, output_dims, max_dim): - """Modify the input and output dimensions against the maximum dimension""" - if input_dims is not None: - input_dims = [max_dim if i > max_dim else i for i in input_dims] - if output_dims is not None: - output_dims = [max_dim if i > max_dim else i for i in output_dims] - return input_dims, output_dims - - def amplitudes_2_tensor(perceval_result, input_occ, output_occ): # pylint: disable=import-outside-toplevel from discopy.tensor import Tensor @@ -437,8 +428,9 @@ def update_connections( previous_box, previous_right_offset: int, ) -> List[bool]: + from optyx.core.diagram import mode """ - Replace the previous box's COD segment in the light-cone by a DOM-length + Replace the previous box's cod segment in the light-cone by a dom-length segment that is either all True (if connected) or all False. This pulls the cone one layer backward. """ @@ -452,24 +444,22 @@ def update_connections( start = previous_left_offset end = len(wires_in_light_cone) - previous_right_offset - # replace cod slice with a dom-length slice of the same boolean - from optyx.core.control import BitControlledBox - if isinstance(previous_box, BitControlledBox): - return ( - wires_in_light_cone[:start] - + [False] # control wire always out of light-cone - + [connected] * (len(previous_box.dom) - 1) - + wires_in_light_cone[end:] - ) return ( wires_in_light_cone[:start] - + [connected] * len(previous_box.dom) + + [connected if t == mode else False for t in previous_box.dom] + wires_in_light_cone[end:] ) -def calculate_right_offset(total_wires: int, left_offset: int, span_len: int) -> int: + + +def calculate_right_offset( + total_wires: int, + left_offset: int, + span_len: int +) -> int: """Right offset = number of wires to the right of a span.""" return total_wires - span_len - left_offset + def is_previous_box_connected_to_current_box( wires_in_light_cone: List[bool], previous_left_offset: int, @@ -486,11 +476,13 @@ def is_previous_box_connected_to_current_box( ) # lengths should match by construction assert len(mask) == len(wires_in_light_cone), ( - f"Mask/wires length mismatch: {len(mask)} != {len(wires_in_light_cone)}" + (f"Mask/wires length mismatch: {len(mask)}" + + f" != {len(wires_in_light_cone)}") ) return any(w and m for w, m in zip(wires_in_light_cone, mask)) + def get_previous_box_cod_index_in_light_cone( wires_in_light_cone: List[bool], previous_left_offset: int, @@ -498,7 +490,8 @@ def get_previous_box_cod_index_in_light_cone( previous_right_offset: int, ) -> List[int]: """ - Get the indices of the COD of the previous box that are in the current light-cone. + Get the indices of the cod of the previous box + that are in the current light-cone. """ mask = ( [False] * previous_left_offset @@ -507,11 +500,13 @@ def get_previous_box_cod_index_in_light_cone( ) # lengths should match by construction assert len(mask) == len(wires_in_light_cone), ( - f"Mask/wires length mismatch: {len(mask)} != {len(wires_in_light_cone)}" + (f"Mask/wires length mismatch: {len(mask)}" + + f" != {len(wires_in_light_cone)}") ) return [ - i - previous_left_offset for i, (w, m) in enumerate(zip(wires_in_light_cone, mask)) + i - previous_left_offset for i, (w, m) in + enumerate(zip(wires_in_light_cone, mask)) if w and m ] @@ -523,27 +518,24 @@ def get_max_dim_for_box( input_dims: List[int], prev_layers, ): - from optyx.core.diagram import Swap, DualRail + from optyx.core.diagram import Swap, mode from optyx.core.zw import Create, Endo, Divide, Multiply - from optyx.core.control import BitControlledBox - if (len(box.dom) == 0 or - isinstance(box, (Swap, Endo, Divide, Multiply))): + if ( + len(box.dom) == 0 or + isinstance(box, (Swap, Endo, Divide, Multiply)) + ): return 1e20 dim_for_box = 0 - # light-cone at the current layer inputs + # light-cone at the current layer [connected] * len(previous_box.dom)inputs wires_in_light_cone: List[bool] = ( [False] * left_offset - + [True] * len(box.dom) - + [False] * right_offset - ) if not isinstance(box, BitControlledBox) else ( - [False] * (left_offset + 1) - + [True] * (len(box.dom) - 1) + + [True if t == mode else False for t in box.dom] + [False] * right_offset - ) + # walk previous layers from nearest to farthest for previous_left_offset, previous_box in prev_layers[::-1]: total = len(wires_in_light_cone) @@ -558,7 +550,8 @@ def get_max_dim_for_box( elif adj_left > max_left: adj_left = max_left - previous_right_offset = calculate_right_offset(total, adj_left, cod_len) + previous_right_offset = \ + calculate_right_offset(total, adj_left, cod_len) if is_previous_box_connected_to_current_box( wires_in_light_cone, @@ -575,8 +568,7 @@ def get_max_dim_for_box( ) if idxs: dim_for_box += sum(previous_box.photons[i] for i in idxs) - if isinstance(previous_box, DualRail): - dim_for_box += 1 + if isinstance(previous_box, Swap): wires_in_light_cone = ( wires_in_light_cone[:adj_left] @@ -591,7 +583,8 @@ def get_max_dim_for_box( previous_box, previous_right_offset, ) - dim_for_box += sum(2 * dim for wire, dim in zip(wires_in_light_cone, input_dims) if wire) + 1 + dim_for_box += sum(2 * dim for wire, dim in + zip(wires_in_light_cone, input_dims) if wire) + 1 return max(dim_for_box, 2) @@ -608,4 +601,6 @@ def is_diagram_LO(diagram): return True -is_identity = lambda box: len(box.boxes) == 0 and len(box.offsets) == 0 \ No newline at end of file + +is_identity = lambda box: (len(box.boxes) == 0 and # noqa: E731 + len(box.offsets) == 0) From cd12a774a751387f21ad63c5f04a3c3a0a73102a Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Thu, 25 Sep 2025 09:52:27 +0100 Subject: [PATCH 27/59] linting qubits --- optyx/qubits.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/optyx/qubits.py b/optyx/qubits.py index c2212c82..d2958768 100644 --- a/optyx/qubits.py +++ b/optyx/qubits.py @@ -412,7 +412,9 @@ def _to_optyx_from_graphix(cls, underlying_circuit): og = opengraph.OpenGraph.from_pattern(underlying_circuit) pyzx_diagram = pyzx.to_pyzx_graph(og) + # pylint: disable=protected-access pyzx_diagram._inputs = tuple(pyzx_diagram._inputs) + # pylint: disable=protected-access pyzx_diagram._outputs = tuple(pyzx_diagram._outputs) return cls._to_optyx_from_pyzx(pyzx_diagram) From 142b50771f6b5cc492efbd9e0f8a85f710639bc1 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Thu, 25 Sep 2025 10:03:53 +0100 Subject: [PATCH 28/59] linting photonic --- optyx/photonic.py | 58 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/optyx/photonic.py b/optyx/photonic.py index 2b6de50c..6641fd55 100644 --- a/optyx/photonic.py +++ b/optyx/photonic.py @@ -245,13 +245,13 @@ """ +from functools import cached_property +from abc import abstractmethod, ABC +from collections.abc import Iterable import numpy as np import sympy as sp from sympy import Expr, lambdify, Symbol, Mul from discopy.cat import rsubs -from functools import cached_property -from abc import abstractmethod, ABC -from collections.abc import Iterable from optyx.core import ( channel, @@ -384,6 +384,9 @@ def _normal_form(self, dom, cod): @cached_property def array(self): + """ + Array to be used for building zw diagrams. + """ return np.asarray(self._compute_array()) @abstractmethod @@ -417,9 +420,7 @@ class Gate(AbstractGate): ... diagram.Id(diagram.Mode(2)).to_path().eval(2).array) """ - # need to make it a Circuit? - # this should also take a perceval matrix - # as an input + # pylint: disable=too-many-positional-arguments def __init__( self, matrix, @@ -443,6 +444,9 @@ def dagger(self): ) def conjugate(self): + """ + Conjugate defined on the underlying matrix. + """ return Gate( np.conjugate(self.array), len(self.dom), @@ -497,10 +501,16 @@ def dagger(self): return Phase(-self.angle) def conjugate(self): + """ + Conjugate defined on the underlying matrix. + """ return Phase(-self.angle) class NumOp(Channel): + """ + Number operator. + """ def __init__(self): super().__init__( "NumOp", @@ -589,6 +599,9 @@ def dagger(self): return BBS(0.5 - self.bias) def conjugate(self): + """ + Conjugate defined on the underlying matrix. + """ return BBS(self.bias, not self.is_conj) @@ -641,6 +654,9 @@ def __init__(self, @cached_property def global_phase(self): + """ + Global phase of the TBS. + """ backend = sp if self.dtype is Expr else np return ( -1j * backend.exp(-1j * self.theta * backend.pi) @@ -677,6 +693,9 @@ def grad(self, var): return self._decomp().grad(var) def conjugate(self): + """ + Conjugate defined on the underlying matrix. + """ return TBS(self.theta, self.is_gate_dagger, not self.is_conj) def dagger(self): @@ -740,6 +759,9 @@ def __init__(self, @cached_property def global_phase(self): + """ + Global phase of the MZI. + """ backend = sp if self.dtype is Expr else np return ( -1j * backend.exp(-1j * self.theta * backend.pi) @@ -783,6 +805,9 @@ def dagger(self): is_conj=self.is_conj) def conjugate(self): + """ + Conjugate defined on the underlying matrix. + """ return MZI(self.theta, self.phi, self.is_gate_dagger, not self.is_conj) @@ -864,11 +889,11 @@ def __init__(self, phase): class ZMeasurementDR(Diagram): + """ + ZMeasurement circuit that performs a measurement in the Z basis + after applying a phase shift of alpha. + """ def __new__(cls, alpha): - """ - ZMeasurement circuit that performs a measurement in the Z basis - after applying a phase shift of alpha. - """ return ( qmode @ Phase(alpha) >> HadamardBS() >> @@ -878,11 +903,11 @@ def __new__(cls, alpha): class XMeasurementDR(Diagram): + """ + XMeasurement circuit that performs a measurement in the X basis + after applying a Hadamard beam splitter. + """ def __new__(cls, alpha): - """ - XMeasurement circuit that performs a measurement in the X basis - after applying a Hadamard beam splitter. - """ return ( HadamardBS() >> ZMeasurementDR(alpha) @@ -926,6 +951,7 @@ class FusionTypeI(Diagram): :align: center """ def __new__(cls): + # pylint: disable=invalid-name kraus_map_fusion_I = ( diagram.Mode(1) @ diagram.Swap( diagram.Mode(1), @@ -971,6 +997,9 @@ def fusion_I_function(x): class Swap(channel.Swap): + """ + Swap channel for qmodes. + """ def __init__(self, left, right): super().__init__(qmode**left, qmode**right) @@ -1061,6 +1090,7 @@ class FusionTypeII(Diagram): :align: center """ def __new__(cls): + # pylint: disable=invalid-name fusion_II = Channel( "Fusion II", ( From f4e54a44fcef94dd26df4b117472f4129ce7f1d1 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Thu, 25 Sep 2025 10:27:41 +0100 Subject: [PATCH 29/59] linting classical --- optyx/core/channel.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/optyx/core/channel.py b/optyx/core/channel.py index 5fd5a838..7b243b63 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -493,7 +493,7 @@ def eval(self, backend=None, **kwargs): return backend.eval(self, **kwargs) -class Channel(frobenius.Box, Diagram): +class Channel(Diagram, frobenius.Box): """ Channel initialised by its Kraus map. """ @@ -647,7 +647,7 @@ def eval(self, n_photons=0, permanent=None, dtype=complex): ) -class CQMap(frobenius.Box, Diagram): +class CQMap(Diagram, frobenius.Box): """ Channel initialised by its Density matrix. """ From 43dc36a217222143fb4eb0fb4eeb6cd9712eb6e3 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Thu, 25 Sep 2025 10:30:12 +0100 Subject: [PATCH 30/59] linting backends --- optyx/core/backends.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/optyx/core/backends.py b/optyx/core/backends.py index 1d01c668..0c46726f 100644 --- a/optyx/core/backends.py +++ b/optyx/core/backends.py @@ -195,7 +195,6 @@ def prob(self, occupation: tuple) -> float: prob_dist = self.prob_dist() return prob_dist.get(occupation, 0.0) - # pylint: disable=no-self-use def _convert_array_to_dict( self, array: np.ndarray, @@ -290,7 +289,6 @@ class AbstractBackend(ABC): All backends must implement the `eval` method. """ - # pylint: disable=no-self-use def _get_matrix( self, diagram: Diagram @@ -321,7 +319,6 @@ def _get_quimb_tensor( """ return self._get_discopy_tensor(diagram).to_quimb() - # pylint: disable=no-self-use def _umatrix_to_perceval_circuit( self, matrix: np.ndarray) -> pcvl.Circuit: @@ -332,7 +329,6 @@ def _umatrix_to_perceval_circuit( perceval_matrix = pcvl.Matrix(matrix.T) return pcvl.components.Unitary(U=perceval_matrix) - # pylint: disable=no-self-use def _get_discopy_tensor( self, diagram: Diagram From 83571878feb66e30a7c055e2ce7d6f99be5f8387 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Thu, 25 Sep 2025 10:45:04 +0100 Subject: [PATCH 31/59] linting channel --- optyx/core/channel.py | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/optyx/core/channel.py b/optyx/core/channel.py index 7b243b63..4e3c0668 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -111,13 +111,13 @@ from discopy import tensor from discopy import symmetric, frobenius, hypergraph from discopy.cat import factory -from optyx.core import zx, diagram from pytket.extensions.pyzx import pyzx_to_tk from pyzx import extract_circuit - +from optyx.core import zx, diagram from optyx.utils.utils import explode_channel + class Ob(frobenius.Ob): """Basic object: bit, mode, qubit or qmode""" @@ -175,15 +175,24 @@ def double(self): @staticmethod # pylint: disable=invalid-name def from_optyx(ty): + """ + Get quantum types from core/diagram.Ty. + """ assert isinstance(ty, diagram.Ty) # pylint: disable=protected-access return Ty(*[Ob._quantum[ob.name] for ob in ty.inside]) def needs_inflation(self) -> bool: + """ + Diagrams with at least one :code:`qmode` need inflation. + """ return "qmode" in self.name # pylint: disable=invalid-name def inflate(self, d) -> Ty: + """ + Inflate the type. + """ return (mode**0).tensor( *(o**d if o.needs_inflation() else o for o in self) ) @@ -203,6 +212,10 @@ class Diagram(frobenius.Diagram): grad = tensor.Diagram.grad def needs_inflation(self) -> bool: + """ + If the domain or codomain need inflation, + the diagram needs inflation. + """ return self.dom.needs_inflation() or self.cod.needs_inflation() # pylint: disable=invalid-name @@ -235,6 +248,11 @@ def double(self): @property def is_pure(self): + """ + Check if the diagram is pure, i.e. it does not + contain any discards or measures acting on quantum types, + and does not prepare quantum types from classical types. + """ are_layers_pure = [] are_layers_classical = [] for layer in self: @@ -273,6 +291,9 @@ def is_pure(self): return not any(are_layers_pure) or all(are_layers_classical) def get_kraus(self): + """ + Obtain the Kraus map of a pure circuit. + """ assert self.is_pure, "Cannot get a Kraus map of non-pure circuit" kraus_maps = [diagram.Id(self.dom.single())] for layer in self: @@ -363,7 +384,7 @@ def to_tket(self): ) def to_pyzx(self): - + """Convert to PyZX circuit. The circuit must be a pure circuit.""" assert self.is_pure, "Diagram must be pure for conversion." return self.get_kraus().to_pyzx() @@ -391,6 +412,8 @@ def from_discopy(cls, discopy_circuit): @classmethod def from_bosonic_operator(cls, n_modes, operators, scalar=1): + """Convert from a list of bosonic operators. Based on + diagram.Diagram.from_bosonic_operator.""" return Channel( "Bosonic operator", diagram.Diagram.from_bosonic_operator( @@ -415,6 +438,7 @@ def from_perceval(cls, p): acting on polarisation modes, time delays, and with symbols. """ + # pylint: disable=import-outside-toplevel from optyx import photonic from optyx.utils import perceval_conversion import perceval as pcvl @@ -605,6 +629,9 @@ def inflate(self, d): class Spider(frobenius.Spider, Channel): # pragma: no cover + """ + Spider as a channel. + """ def __init__(self, n_legs_in: int, n_legs_out: int, typ: Ty, data=None, **params): super().__init__( @@ -726,7 +753,6 @@ def inflate(self, d): return diagram.Diagram.tensor(*diagrams) # pylint: disable=invalid-name - # pylint: disable=no-self-use def _measure_wire(self, ob, d): """Return the diagram that measures one `ob`.""" # pylint: disable=import-outside-toplevel From 5bcc25757ccc17a9ce3d3f77de604571fdaa6f1d Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Thu, 25 Sep 2025 10:50:55 +0100 Subject: [PATCH 32/59] linting control --- optyx/core/control.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/optyx/core/control.py b/optyx/core/control.py index b210431d..d22948d7 100644 --- a/optyx/core/control.py +++ b/optyx/core/control.py @@ -153,7 +153,7 @@ def determine_output_dimensions(self, input_dims: List[int]) -> List[int]: return dims def truncation( - self, input_dims: List[int], output_dims: List[int] + self, input_dims: list[int] = None, output_dims: list[int] = None ) -> tensor.Box: if self.is_dagger: @@ -260,7 +260,7 @@ def __init__( self.n_control_modes = n_control_modes def truncation( - self, input_dims: List[int], output_dims: List[int] + self, input_dims: list[int] = None, output_dims: list[int] = None ) -> tensor.Box: if self.is_dagger: From a0c59693f512bfaf7d5e9e0251d8227ca0dd806f Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Thu, 25 Sep 2025 10:52:55 +0100 Subject: [PATCH 33/59] pflake channel --- optyx/core/channel.py | 1 - 1 file changed, 1 deletion(-) diff --git a/optyx/core/channel.py b/optyx/core/channel.py index 4e3c0668..2616431d 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -117,7 +117,6 @@ from optyx.utils.utils import explode_channel - class Ob(frobenius.Ob): """Basic object: bit, mode, qubit or qmode""" From 68f6897831c6b1bf8102c7cf3f5ce70286fd842d Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Thu, 25 Sep 2025 11:01:59 +0100 Subject: [PATCH 34/59] remove unused functions in utils --- optyx/utils/utils.py | 77 -------------------------------------------- 1 file changed, 77 deletions(-) diff --git a/optyx/utils/utils.py b/optyx/utils/utils.py index 8e3d2a14..ca9ed494 100644 --- a/optyx/utils/utils.py +++ b/optyx/utils/utils.py @@ -345,83 +345,6 @@ def preprocess_quimb_tensors_safe(tn, epsilon=1e-12, value_limit=1e10): return tn -def total_photons_created( - diagram, - input_dims: Optional[List[int]] = None -) -> int: - """ - Scan `diagram` once and return the total number of photons created. - - Counts: - - zw.Create(*photons) -> +sum(photons) - Everything else is ignored for 'creation' - (they conserve or consume photons). - - Parameters - ---------- - diagram : optyx.core.diagram.Diagram - The diagram to scan (sequential list of - boxes is in `diagram.boxes`). - input_dims : Optional[List[int]] - - Returns - ------- - int - Total number of photons created in the diagram. - """ - created = 0 - - from optyx.core import zw - - if input_dims is None: - input_dims = [] - - for box in diagram.boxes: - if isinstance(box, zw.Create): - created += sum(int(p) for p in box.photons) - continue - - return max(int(created) + int(sum(input_dims, 0)), 3) - - -def max_postselection( - diagram, - input_dims: Optional[List[int]] = None -) -> int: - """ - Scan `diagram` once and return the - maximum post-selection dimension. - - Counts: - - zw.Create(*photons) -> +sum(photons) - Everything else is ignored for 'selection' - Parameters - ---------- - diagram : optyx.core.diagram.Diagram - The diagram to scan (sequential list - of boxes is in `diagram.boxes`). - input_dims : Optional[List[int]] - - Returns - ------- - int - Maximum post-selection dimension in the diagram. - """ - max_dim = 0 - - from optyx.core import zw - - if input_dims is None: - input_dims = [] - - for box in diagram.boxes: - if isinstance(box, zw.Select): - max_dim = max(max_dim, max(int(p) for p in box.photons)) - continue - - return max(int(max_dim) + int(sum(input_dims, 0)), 3) - - def update_connections( wires_in_light_cone: List[bool], previous_left_offset: int, From d2dea274abffbe18cf9ecec26689054073763487 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Thu, 25 Sep 2025 11:05:52 +0100 Subject: [PATCH 35/59] pflake8 utils --- optyx/utils/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/optyx/utils/utils.py b/optyx/utils/utils.py index ca9ed494..40f7e716 100644 --- a/optyx/utils/utils.py +++ b/optyx/utils/utils.py @@ -12,7 +12,6 @@ from typing import ( NamedTuple, Tuple, - Optional, List ) from numbers import Number From 366356cd68b9f6a6e5eca4cd992a7ef2a04c8c52 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Mon, 6 Oct 2025 19:22:07 +0100 Subject: [PATCH 36/59] Remove Cup/Cap from channel and add description to PhotonNumberPreservation --- optyx/core/channel.py | 24 ------------------------ optyx/core/diagram.py | 4 +++- 2 files changed, 3 insertions(+), 25 deletions(-) diff --git a/optyx/core/channel.py b/optyx/core/channel.py index 2616431d..d83c9914 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -879,36 +879,12 @@ def __call__(self, other): return frobenius.Functor.__call__(self, other) -class Cup(frobenius.Cup, Channel): - """ - A frobenius cup is a compact cup in a frobenius diagram. - - Parameters: - left (Ty) : The atomic type. - right (Ty) : Its adjoint. - """ - __ambiguous_inheritance__ = (frobenius.Cup, ) - - -class Cap(frobenius.Cap, Channel): - """ - A frobenius cap is a compact cap in a frobenius diagram. - - Parameters: - left (Ty) : The atomic type. - right (Ty) : Its adjoint. - """ - __ambiguous_inheritance__ = (frobenius.Cap, ) - - class Hypergraph(hypergraph.Hypergraph): # pragma: no cover category, functor = Category, Functor Hypergraph.ty_factory = Ty Diagram.spider_factory = Spider -Diagram.cup_factory = Cup -Diagram.cap_factory = Cap Diagram.hypergraph_factory = Hypergraph Diagram.braid_factory = Swap Diagram.sum_factory = Sum diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index d4adee98..3850a210 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -240,7 +240,9 @@ class PhotonNumberPreservation(Enum): """This is used as a flag to indicate how a box acts on the incoming photons. Used by the tensor network building - algorithm to determine the bond dimensions / truncations. + algorithm to determine the bond dimensions / truncations + based on number of photons in the past light + cone of the Box to minimise the truncation dimensions. LO: Linear Optical - preserves photon number between input and output NON_LO: Does not preserve photon number between input and output From c7dd3ef8d3adbe3ac988c7db81691cd7fd490d64 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Fri, 5 Sep 2025 17:23:16 +0100 Subject: [PATCH 37/59] making the notebooks work with the backends --- docs/notebooks/bosonic-vqe-2.ipynb | 292 +- docs/notebooks/compile_to_semm.ipynb | 26 +- docs/notebooks/distributed-412-code.ipynb | 5010 +++++++++-------- docs/notebooks/distributed-422-code.ipynb | 3368 +++++------ docs/notebooks/feed_forward_example.ipynb | 1318 +++-- docs/notebooks/optyx-compilation.ipynb | 279 - docs/notebooks/optyx-vqe-experiment.ipynb | 160 +- .../notebooks/photon_distinguishability.ipynb | 776 +-- optyx/core/backends.py | 59 +- optyx/core/channel.py | 84 +- optyx/qubits.py | 197 +- 11 files changed, 6041 insertions(+), 5528 deletions(-) delete mode 100644 docs/notebooks/optyx-compilation.ipynb diff --git a/docs/notebooks/bosonic-vqe-2.ipynb b/docs/notebooks/bosonic-vqe-2.ipynb index c558f36d..2d28c183 100644 --- a/docs/notebooks/bosonic-vqe-2.ipynb +++ b/docs/notebooks/bosonic-vqe-2.ipynb @@ -17,11 +17,11 @@ " \n", " \n", " \n", - " 2025-07-01T14:58:41.907047\n", + " 2025-09-05T11:56:11.751703\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -46,62 +46,62 @@ "L 223.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pc99b687103)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -878,7 +878,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -916,11 +916,11 @@ " \n", " \n", " \n", - " 2025-07-01T14:58:42.693815\n", + " 2025-09-05T11:56:11.815619\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -945,87 +945,87 @@ "L 799.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pdf91bd2a9d)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1674,7 +1674,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1699,7 +1699,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1707,7 +1707,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1717,7 +1717,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1761,85 +1761,44 @@ { "cell_type": "code", "execution_count": 3, - "id": "05f93f4b", + "id": "8a02308c-aba4-4a39-9325-faee4c1f0c2d", "metadata": {}, "outputs": [], "source": [ - "import numpy as np\n", - "sum = np.sum([(term.double().to_tensor(input_dims = [3,3,3,3], max_dim=3).to_quimb()^...).data for term in terms])" + "expectation = circuit >> hamiltonian >> circuit.dagger()" ] }, { "cell_type": "code", "execution_count": 4, - "id": "4351a6e7", + "id": "68041095", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "(67.9411254969543+0j)" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Create((1, 1, 1)) >> MZI(a_0_0, b_0_0) @ qmode >> qmode @ MZI(a_1_0, b_1_0) >> MZI(a_2_0, b_2_0) @ qmode >> qmode @ MZI(a_3_0, b_3_0) >> qmode @ qmode @ Select((1,)) >> Bosonic operator >> qmode @ qmode @ Select((1,)).dagger() >> qmode @ MZI(a_3_0, b_3_0) >> MZI(a_2_0, b_2_0) @ qmode >> qmode @ MZI(a_1_0, b_1_0) >> MZI(a_0_0, b_0_0) @ qmode >> Create((1, 1, 1)).dagger()\n", + "Create((1, 1, 1)) >> MZI(a_0_0, b_0_0) @ qmode >> qmode @ MZI(a_1_0, b_1_0) >> MZI(a_2_0, b_2_0) @ qmode >> qmode @ MZI(a_3_0, b_3_0) >> qmode @ qmode @ Select((1,)) >> Bosonic operator >> qmode @ qmode @ Select((1,)).dagger() >> qmode @ MZI(a_3_0, b_3_0) >> MZI(a_2_0, b_2_0) @ qmode >> qmode @ MZI(a_1_0, b_1_0) >> MZI(a_0_0, b_0_0) @ qmode >> Create((1, 1, 1)).dagger()\n", + "Create((1, 1, 1)) >> MZI(a_0_0, b_0_0) @ qmode >> qmode @ MZI(a_1_0, b_1_0) >> MZI(a_2_0, b_2_0) @ qmode >> qmode @ MZI(a_3_0, b_3_0) >> qmode @ qmode @ Select((1,)) >> Bosonic operator >> qmode @ qmode @ Select((1,)).dagger() >> qmode @ MZI(a_3_0, b_3_0) >> MZI(a_2_0, b_2_0) @ qmode >> qmode @ MZI(a_1_0, b_1_0) >> MZI(a_0_0, b_0_0) @ qmode >> Create((1, 1, 1)).dagger()\n", + "Create((1, 1, 1)) >> MZI(a_0_0, b_0_0) @ qmode >> qmode @ MZI(a_1_0, b_1_0) >> MZI(a_2_0, b_2_0) @ qmode >> qmode @ MZI(a_3_0, b_3_0) >> qmode @ qmode @ Select((1,)) >> Bosonic operator >> qmode @ qmode @ Select((1,)).dagger() >> qmode @ MZI(a_3_0, b_3_0) >> MZI(a_2_0, b_2_0) @ qmode >> qmode @ MZI(a_1_0, b_1_0) >> MZI(a_0_0, b_0_0) @ qmode >> Create((1, 1, 1)).dagger()\n" + ] } ], "source": [ - "sum" + "for i in expectation.terms:\n", + " print(i)" ] }, { "cell_type": "code", "execution_count": 5, - "id": "a9759ff9", - "metadata": {}, - "outputs": [], - "source": [ - "terms_2 = hamiltonian.double().terms\n", - "\n", - "sum = np.sum([(term_2.to_tensor(input_dims = [3,3,3,3], max_dim=3).to_quimb()^...).data for term_2 in terms_2])" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "c21af673", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(67.9411254969543+0j)" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sum" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "8a02308c-aba4-4a39-9325-faee4c1f0c2d", - "metadata": {}, - "outputs": [], - "source": [ - "expectation = circuit >> hamiltonian >> circuit.dagger()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, "id": "f4e5462d-464d-4b09-8574-6867522b61ea", "metadata": {}, "outputs": [], "source": [ + "from optyx.core.backends import DiscopyBackend\n", + "\n", "def to_float(x):\n", " if isinstance(x, complex):\n", " assert x.imag < 1e-10, x\n", @@ -1848,18 +1807,32 @@ "\n", "free_syms = list(expectation.free_symbols)\n", "\n", - "f_exp = lambda xs: to_float(expectation.lambdify(*free_syms)(*xs).eval().array[0, 0])\n", + "#f_exp = lambda xs: to_float(expectation.lambdify(*free_syms)(*xs).eval().array[0, 0])\n", + "\n", + "def f_exp(xs):\n", + " val = 0\n", + " for term in expectation.lambdify(*free_syms)(*xs).terms:\n", + " val += to_float(term.eval().tensor.array)\n", + " return val\n", + "\n", + "# def d_f_exp(xs):\n", + "# return [\n", + "# expectation.grad(s).lambdify(*free_syms)(*xs).eval().array[0, 0]\n", + "# for s in free_syms\n", + "# ]\n", "\n", "def d_f_exp(xs):\n", - " return [\n", - " expectation.grad(s).lambdify(*free_syms)(*xs).eval().array[0, 0]\n", - " for s in free_syms\n", - " ]" + " grads = [expectation.grad(s) for s in free_syms]\n", + " vals = [0] * len(grads)\n", + " for i, g in enumerate(grads):\n", + " for term in g.lambdify(*free_syms)(*xs).terms:\n", + " vals[i] += to_float(term.eval().tensor.array)\n", + " return vals" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 14, "id": "24355282-4c9c-40b3-b643-461981f9475f", "metadata": {}, "outputs": [], @@ -1890,7 +1863,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 15, "id": "e96227b0-db8e-4871-8c12-b1d034a4bc86", "metadata": {}, "outputs": [ @@ -1898,7 +1871,14 @@ "name": "stderr", "output_type": "stream", "text": [ - "100%|██████████| 10/10 [06:35<00:00, 39.56s/it]\n" + " 0%| | 0/10 [00:00\n", " \n", " \n", - " 2025-07-01T15:06:04.533106\n", + " 2025-09-05T11:59:44.101867\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -1958,12 +1938,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1999,7 +1979,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2038,7 +2018,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2072,7 +2052,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2117,7 +2097,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2171,7 +2151,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2203,12 +2183,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2240,7 +2220,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2256,7 +2236,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2272,7 +2252,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2287,7 +2267,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2302,7 +2282,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2351,7 +2331,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2375,7 +2355,15 @@ { "cell_type": "code", "execution_count": null, - "id": "ce3cd5e4-f9b5-4f29-b805-7bee285dfed7", + "id": "346a4294", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5e2fd068", "metadata": {}, "outputs": [], "source": [] @@ -2383,7 +2371,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": ".venv", "language": "python", "name": "python3" }, @@ -2397,7 +2385,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/docs/notebooks/compile_to_semm.ipynb b/docs/notebooks/compile_to_semm.ipynb index 101cd911..05c69408 100644 --- a/docs/notebooks/compile_to_semm.ipynb +++ b/docs/notebooks/compile_to_semm.ipynb @@ -28,7 +28,7 @@ "outputs": [ { "data": { - "image/png": "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//79lZubq7Zt26p379564IEHtHv3btPRAADwGwolgoa/5oLKo06dOpo3b57mz5+v9PR02Ww2ffzxxzytBACEBQolgoa/54LKo3v37tq2bZu6d++uJ598Uh06dNC3335rOhYAAD5FoURQMDUXVB7VqlXTtGnTtHTpUn3//feKiYnRpEmTdObMGdPRAADwCQolgoLpuaDy6Nixo7KysvTUU0/phRdeUKtWrZSdnW06FgAAXkehRFAIhLmg8rjqqqv09ttva+3atTp69Kji4+M1ZswYnT592nQ0AAC8hkKJoOB0OtW5c+eAmAsqj8TERGVkZGjkyJEaN26cmjZtqvXr15uOBQCAV1AoEfDcc0HJycmmo3ikUqVKGjt2rDZu3KhKlSopMTFRw4cP1/Hjx01HAwDAIxRKBLxAngsqj8aNG2vdunV644039P777ysmJkb//ve/TccCAKDcKJQIeMEwF1RWkZGRGjFihLZu3ap69eqpQ4cOevLJJ3Xo0CHT0QAAKDMKJQJaMM0FlUfDhg21cuVKTZkyRXPnzlVUVJQWLVpkOhYAAGVCoURAC8a5oLKyWq36/e9/r5ycHMXFxen+++9X7969tW/fPtPRAAAoFQolAlqwzgWVx4033qgvv/xSs2bN0vLly9WoUSPNnDmTr28EAAQ8CiUCWrDPBZWVxWJRnz59tG3bNiUlJalfv3669957lZeXZzoaAAAXRaFEwMrLy1NOTk5If9x9Mdddd51mz56tRYsWKTMzUzabTVOmTFFRUZHpaAAA/AaFEgEr1OaCyuO+++5TTk6O+vbtq0GDBumuu+7S119/bToWAADnoFAiYKWkpCgxMVHVqlUzHcWoa665Rh988IH+/e9/a/fu3YqNjdWbb76pwsJC09EAAJBEoUSACvW5oPJo166dtm7dqmeeeUajRo1SixYttGXLFtOxAACgUCIwhcNcUHlUrlxZEyZM0Lp161RQUKCEhAS9/PLLOnnypOloAIAwRqFEQAqnuaDyaNasmTZu3KjRo0drwoQJiouL09q1a03HAgCEKQolAlK4zQWVR8WKFfXqq68qIyND11xzjex2u5599lkdO3bMdDQAQJihUCLghPNcUHlERUVp7dq1mjRpkqZOnaro6GgtXbrUdCwAQBihUCLgOJ1OWa3WsJ4LKquIiAgNGzZMWVlZatCggZKSkvTYY4/p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h8eYCwJKz+FwKDMzU88//7xee+01NWvWTJs3bzYdCwA8QqGEx5gLAsrmyiuv1J/+9Celp6dLkpo3b66RI0fqxIkThpMBQPlQKOExp9Opli1bMhcElFHTpk21YcMGjR07Vm+99ZaaNGkil8tlOhYAlBmFEh5xzwUlJyebjgIEpQoVKmjUqFHKzMxUzZo15XA4NHjwYB05csR0NAAoNQolPMJcEOAdd955p1wulyZPnqzp06crOjpaKSkppmMBQKlQKOERp9PJXBDgJVarVUOGDFF2drYaNWqke+65R/369dP+/ftNRwOAS6JQwiMpKSnMBQFedvPNN2vJkiX69NNPtXjxYtlsNn3++ed8fSOAgEULQLkxFwT4jsViUf/+/ZWbm6u2bduqV69e6tatm3bv3m06GgD8BoUS5cZcEOB7derU0bx58zR//nylp6fLZrPp448/5mklgIBCoUS5MRcE+E/37t2Vm5ur7t2768knn9Tdd9+tb7/91nQsAJBEoUQ5MRcE+F+1atU0bdo0LV26VN99951iYmI0adIknTlzxnQ0AGGOQolyYS4IMKdjx47KysrSU089pRdeeEGtWrVSdna26VgAwhiFEuXCXBBg1lVXXaW3335ba9eu1dGjRxUfH68xY8bo9OnTpqMBCEMUSpSL0+lkLggIAImJicrIyNDIkSM1btw4NW3aVOvXrzcdC0CYoQ2gzPLy8pSVlcXH3UCAqFSpksaOHauNGzeqUqVKSkxM1PDhw3X8+HHT0QCECQolyoy5ICAwNW7cWOvWrdMbb7yh999/XzExMVq5cqXpWADCAIUSZcZcEBC4IiMjNWLECG3dulX16tVT+/bt9dRTT+nQoUOmowEIYRRKlIl7LoiPu4HA1rBhQ61cuVIffPCB5syZo6ioKC1atMh0LAAhikKJMnHPBbE/CQQ+q9WqgQMHKjc3V3Fxcbr//vvVu3dv7du3z3Q0ACGGQokyYS4ICD716tXTl19+qVmzZmn58uVq1KiRZs6cydc3AvAaCiXKhLkgIDhZLBb16dNH27ZtU1JSkvr166d7771XeXl5pqMBCAG0ApTajz/+yFwQEOSuu+46zZ49W4sWLVJmZqZsNpumTJmioqIi09EABDEKJUrN6XQyFwSEiPvuu085OTnq27evBg0apLvuuktff/216VgAghSFEqXGXBAQWq655hp98MEH+ve//63du3crNjZWb775pgoLC01HAxBkKJQoFeaCgNDVrl07bd26Vc8884xGjRqlFi1aKDMz03QsAEGEQolScc8FUSiB0FS5cmVNmDBB69atU0FBgRISEvTKK6/o5MmTpqMBCAIUSpSKey4oLi7OdBQAPtSsWTNt3LhRr732mv785z8rLi5OqamppmMBCHAUSpQKc0FA+KhYsaJeffVVZWRk6JprrlGbNm307LPP6tixY6ajAQhQtANcFnNBQHiKiorS2rVrNWnSJE2dOlXR0dFaunSp6VgAAhCFEpe1ZMkS5oKAMBUREaFhw4YpKytLDRo0UFJSkh577DEdPHjQdDQAAYRCictKSUlhLggIc7feequWLVumqVOnauHChbLZbJo/f77pWAACBIUSl8RcEAA3i8WiAQMGKDc3V4mJiXrooYf04IMPas+ePaajATCMQolLYi4IwPnq1q2rBQsW6PPPP9eaNWtks9n0ySefqLi42HQ0AIZQKHFJTqdTtWrVYi4IwDksFot69Oih3Nxcde3aVQMGDFBSUpK+//5709EAGEChxCU5nU516dKFuSAAF1SjRg1Nnz5dTqdT27dvV3R0tN59912dOXPGdDQAfkRLwEUxFwSgtDp37qzs7GwNGDBAQ4cOld1u17Zt20zHAuAnFEpcFHNBAMqiatWqmjx5slwulw4ePKgmTZpo3LhxKigoMB0NgI9RKHFRTqeTuSAAZdamTRtt2bJFw4cP1+uvv66EhARt2rTJdCwAPkShxAWdPn1ay5Yt4+NuAOVyxRVXaPz48dqwYYOsVquaN2+uF198USdOnDAdDYAPUChxQcwFAfCGuLg4rV+/Xn/84x/1zjvvKDY2VqtWrTIdC4CXUShxQcwFAfCWChUqaOTIkcrMzFSdOnV011136emnn9aRI0dMRwPgJRRKXJDT6VTnzp2ZCwLgNXfccYdWrVql9957TzNnzlRUVJQWL15sOhYAL6At4Dfcc0HJycmmowAIMVarVYMGDVJ2draio6N17733qm/fvvrll19MRwPgAQolfoO5IAC+dtNNNyklJUWfffaZlixZIpvNpjlz5vD1jUCQolDiN5gLAuAPFotF/fr1U25urtq3b6+HH35Y999/v3766SfT0QCUEYUS5ygoKGAuCIBf1a5dW3PnztXChQu1YcMG2Ww2ffTRRyoqKjIdDUApUShxjrVr1zIXBMCIBx54QLm5uerRo4cGDhyoDh06aMeOHaZjASgFCiXOwVwQAJOqVaumjz/+WMuXL9cPP/yg2NhYTZw4UYWFhaajAbgECiXOwVwQgEDQoUMHZWVl6fe//71GjBihVq1aKSsry3QsABdBa8BZ7rkgPu4GEAiqVKmiSZMmKTU1Vfn5+YqPj9fo0aN16tQp09EAnIdCibPcc0GdOnUyHQUAzmrZsqU2b96sUaNGafz48YqPj9e6detMxwJQAoUSZzEXBCBQVapUSWPGjNHmzZtVuXJltWrVSs8//7zy8/NNRwMgCiX+q6CgQMuXL+fjbgABLSYmRmlpaZowYYKmTJmimJgYrVixwnQsIOxRKCFJSk1N1ZEjRyiUAAJeZGSkhg8frqysLN100026++679cQTT+jQoUOmowFhi0IJSVJKSgpzQQCCSoMGDbRixQp9+OGHmjdvnmw2m7744gvTsYCwRKGEJOaCAAQnq9Wqp556Sjk5OWratKm6deumnj176ueffzYdDQgrtAcwFwQg6NWrV0+LFi3S3//+d61cuVI2m00zZsxQcXGx6WhAWKBQgrkgACHBYrGod+/e2rZtm7p06aLf/e53Sk5O1q5du0xHA0IehRLMBQEIKTVr1tTMmTP1z3/+U9nZ2YqKitJ7772noqIi09GAkEWhDHPMBQEIVffcc49ycnL0yCOPaMiQIWrbtq22b99uOhYQkiiUYY65IACh7Oqrr9aUKVP01Vdfae/evWrcuLHeeOMNFRQUmI4GhBQKZZhzOp3MBQEIeW3bttXWrVs1dOhQvfzyy2rRooUyMjJMxwJCBoUyzKWkpDAXBCAsXHnllXrzzTeVnp6uM2fOqFmzZho1apROnjxpOhoQ9GgRYYy5IADhKCEhQRs3btTrr7+uiRMnqkmTJlqzZo3pWEBQo1CGMeaCAISrChUq6JVXXlFGRoaqV68uu92uIUOG6OjRo6ajAUGJQhnGnE6nWrRowVwQgLBls9nkcrn0zjvv6JNPPlF0dLSWLFliOhYQdCiUYco9F5ScnGw6CgAYFRERoWeffVbZ2dm644471KVLF/Xv318HDhwwHQ0IGhTKMMVcEACc65ZbbtG//vUvffLJJ1q0aJFsNpvmzZvH1zcCpUChDFPMBQHAb1ksFj366KPKzc1VmzZt1LNnT3Xv3l179uwxHQ0IaBTKMOV0OpkLAoCLuP766zV//nz94x//UFpamho1aqRp06bxtBK4CNpEGPrxxx+1detWPu4GgMt48MEHlZubq27duunxxx9Xx44d9d1335mOBQQcCmUYYi4IAEqvevXq+uSTT/Svf/1LO3bsUExMjN5++22dOXPGdDQgYFAowxBzQQBQdp06dVJ2drYef/xxPf/882rdurVycnJMxwICAoUyzLjngvi4GwDK7qqrrtK7774rl8ulw4cPKy4uTn/4wx90+vRp09EAoyiUYcY9F8T+JACUX+vWrZWRkaH/+Z//0ZgxY5SQkKANGzaYjgUYQ6EMM8wFAYB3XHHFFRo3bpw2btyoChUqqGXLlhoxYoSOHz9uOhrgdxTKMMNcEAB4V5MmTZSenq7x48dr8uTJio2N1VdffWU6FuBXtIow8tNPPzEXBAA+EBkZqRdffFFbt25V3bp11a5dOw0cOFCHDx82HQ3wCwplGHE6ncwFAYAP3X777frqq6/0/vvva/bs2YqKitKXX35pOhbgcxTKMMJcEAD4ntVq1dNPP62cnBzFxsaqa9eu6tOnj3755RfT0QCfoVCGCeaCAMC/6tevr8WLF2vmzJlaunSpGjVqpNmzZ/P1jQhJFMow4Z4LolACgP9YLBb17dtXubm56tixo/r27av77rtPeXl5pqMBXkWhDBPuuaD4+HjTUQAg7NSqVUt///vf9f/+3/9TRkaGoqKi9OGHH6qoqMh0NMArKJRhgrkgADCva9euysnJUe/evfX73/9e7du31zfffGM6FuAx2kUYYC4IAALHtddeq48++kgrVqxQXl6eYmNjNWHCBBUWFpqOBpQbhTIMLFmyhLkgAAgw7du3V1ZWlgYNGqSRI0eqZcuWyszMNB0LKBcKZRhgLggAAlPlypU1ceJEpaam6uTJk0pISNCrr76qU6dOmY4GlAmFMsQVFBRo2bJlfNwNAAGsRYsW2rx5s1555RW9+eabiouLU1pamulYQKlRKEMcc0EAEBwqVqyo0aNHa/Pmzapatapat26tYcOG6dixY6ajAZdFoQxxzAUBQHCJjo5WamqqJk6cqI8++kgxMTFatmyZ6VjAJVEoQxxzQQAQfCIiIvTcc88pKytLt956qzp16qQBAwbo119/NR0NuCBaRghjLggAgtttt92m5cuX629/+5vmz58vm82mhQsX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", + "image/png": "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OnjwoB577DFFRkZq7dq1+uKLL7Rz507dc889FEnAw4WHhyswMJDb3l6E91ACcCvHjx/Xu+++q4kTJ6pYsWIaM2aMnnrqKRUpUsR0NAB5pHDhwgoPD6dQehEKJQC3cO7cOX3wwQd6//335e/vr1dffVXPPfecihUrZjoagHzAMMe7UCgBGHXx4kVNnDhR7777rlJTUzVgwAANGTJEZcqUMR0NQD6y2+2aP3++LMviMRYvwDOUAIzIzMzU559/rtq1a+vll1/W3XffreTkZI0ePZoyCfgAu92uc+fO6cCBA6ajIA9QKAEUKIfDof/85z+KiIjQE088oRYtWmjXrl369NNPVblyZdPxABQQ57tjue3tHSiUAAqEZVlasGCBGjZsqF69eik0NFTbtm3Td999p9q1a5uOB6CAVapUSaVKlaJQegkKJYB8t3r1arVo0ULR0dEqVqyYVq1apfnz56tevXqmowEwxM/Pj2GOF6FQAsg327ZtU3R0tJo3b64LFy5owYIFWrFihW6//XbT0QC4AQql96BQAshzSUlJuv/++9WgQQMlJyfrP//5jzZv3qxOnTqx5gTgYrfblZiYqEuXLpmOglyiUALIM7///rueeOIJ1alTR6tXr9bnn3+uuLg43XffffL3548bADnZ7XY5HA7Fx8ebjoJc4k94ALl24sQJDR48WCEhIZo1a5bee+89JSUl6bHHHlNgIK+7BfDXIiMj5efnx21vL8Cf9ACu2/nz5zV27FiNGTNGkvTKK69o0KBBKl68uOFkADxBcHCwatWqRaH0AhRKANfs0qVLmjRpkkaMGKHz58+rf//+euWVV1S2bFnT0QB4GIY53oFb3gCuWmZmpr744guFhobqxRdfVLdu3ZSUlKT333+fMgngutjtdm3fvl2WZZmOglygUAL4Rw6HQzNnzlTdunX12GOP6bbbblN8fLw+//xzValSxXQ8AB7MbrfrxIkTOnr0qOkoyAUKJYArsixLP//8s6KionTfffepZs2a2rJli2bMmKHQ0FDT8QB4AecRjLGxsYaTIDcolAD+0po1a9SqVSt16tRJRYsW1cqVK7VgwQI1aNDAdDQAXqRGjRoKDg7mOUoPR6EEkMOOHTt01113qVmzZjp79qzmz5+vVatWqXnz5qajAfBC/v7+qlu3LoXSw1EoAUiSUlJS1Lt3b9WvX18JCQma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w56r16VLF12+fFkLFy40HcXtUCgBAPARR44c0cKFCzV//vwcw54777zTNewJDg42HdNtvfbaa/rqq6906NAh01HcDoUSAAAflJ6erlWrVrlO7Mk+7HEux2vUqGE6plv5z3/+o169eunEiRMqU6aM6ThuhUIJAABynNizYsUK17An+4k9hQoVMh3TqF27dikiIkLLly9Xq1atTMdxKxRKAACQg3PY4yyY2Yc90dHR6tSpk08OezIzM3XjjTfqvffe07PPPms6jluhUAIAgCtyDnuc5XLTpk05hj3R0dGqV6+ezwx7GjZsqAYNGmjy5Mmmo7gVCiUAALhqzmFPTEyMFi9erAsXLqhy5co5Tuzx5mHPI488ori4OG3YsMF0FLdCoQQAANcl+7AnJiZGSUlJXj/sGTt2rF599VWdP39eAQEBpuO4DQolAADIE9mHPStXrtTly5dVp06dHCf2ePqwZ+nSpWrXrp12796t0NBQ03HcBoUSAADkuXPnzumXX35xndhz9OhRlShRwnVij6cOe44dO6YKFSpo5syZuueee0zHcRsUSgAAkK8cDoe2bNniOrHHOexp3Lix6+qlJw17brrpJj355JN66623TEdxGxRKAABQoP744w/XiT3Zhz133nmnOnfu7PbDnvbt2ys4OFizZ882HcVtUCgBAIAxGRkZOU7scQ57WrVq5Rr21KxZ03TMHAYPHqxZ82I0b/k6ZWQ6FBTor+plghVcONB0NGMolAAAwG0kJSXlOLHHOexxlstmzZoZG/YkHT2vb9cf0NxNKTqZ4Z/jFr2fpKqlb1DrsPLq3biqalcoZiSjKRRKAADgls6fP5/jxJ7swx7niT3lypXL9xwHT6Vp6OxYrUo+oQB/P2U5rlydnL/ePKSsRnS3qUrpG/I9nzugUAIAALfnHPY4y+XGjRtdwx7n1cv69evn+bBnxsYDenNunDId1t8Wyf8V4O+nQH8/vdUlUr2iquZpJndEoQQAAB7HOexxnthz/vx5VapUKceJPTfeeGOuvmPC8iSNWZyY66yD24dqQOvauf4cd0ahBAAAHi37sCcmJkaJiYkKCgrKcWLPtQ57Zmw8oCGzYvMs46geNvX04iuVFEoAAOBV/mrYEx4e7nrn5T8New6eSlO7sSuUnunIs0yFA/31y6CWXvtMJYUSAAB4rezDngULFuiPP/5QiRIl1L59e9eJPf877Hnoi/Vas+fkNT0z+U8C/P10W80ymtq3cZ59pjuhUAIAAJ/gcDi0detW14k9zmHPrbfe6rp6GVyxltqPX5VvGX4Z1EIh5b3vlUIUSgAA4JOOHj2a48Se8+fP6+augxQY3lqWn3+ef1+Av58ealxN/+4SmeefbRqFEgAA+LyMjAytXr1azyw6qVT//HvOsVqZG7RicOt8+3xT8r5+AwAAeJigoCDd2qyF0vKxTErSgZNpSk3PzNfvMIFCCQAAIGn/yVTl921bS9K+k6n5/C0Fj0IJAAAgKSMPXxPkDt9TkCiUAAAAkoICC6YWFdT3FCTv+x0BAABch+plgpW3J4H/X37//R5vQ6EEAACQFFw4UFXz+SSbqmVuUHDhwHz9DhMolAAAAP/VOqy8Avzz5zplgL+fWoeWz5fPNo1CCQAA8F+9G1fN0yMXs8tyWHqwSdV8+WzTKJQAAAD/VbtCMTUPKZvnVykD/P3UPKSsVx67KFEoAQAAchjR3abAPC6Ugf5+GtHdlqef6U4olAAAANlUKX2D3srj87aHdYlUlXwe/JhEoQQAAPgfvaKqanD70Dz5rBfbh6lnlHc+O+nkZ1lWfp8yBAAA4JFmbDygN+fGKdNhXdNYJ8DfT4H+fhrWJdLry6REoQQAAPhbB0+laejsWK1KPqEAf7+/LZbOX28eUlYjutu8+jZ3dhRKAACAq5B09Ly+XX9AyxOP6cDJNGUvUH7686XlrUPL68EmVb12zX0lFEoAAIBrlJqeqX0nU5WR6VBQoL+qlwn2yhNwrhaFEgAAALnCyhsAAAC5QqEEAABArlAoAQAAkCsUSgAAAOQKhRIAAAC5QqEEAABArlAoAQAAkCsUSgAAAOQKhRIAAAC5QqEEAABArlAoAQAAkCsUSgAAAOQKhRIAAAC5QqEEAABArlAoAQAAkCsUSgAAAOQKhRIAAAC5QqEEAABArlAoAQAAkCsUSgAAAOQKhRIAAAC5QqEEAABArlAoAQAAkCsUSgAAAOQKhRIAAAC5QqEEAABArlAoAQAAkCsUSgAAAOQKhRIAAAC5QqEEAABArlAoAQAAkCsUSgAAAOQKhRIAAAC5QqEEAABArlAoAQAAkCsUSgAAAOQKhRIAAAC58v8AKWOGGvP3eLoAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -52,10 +52,24 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "573c939f-f521-4663-a843-7aac795fefd6", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "ValueError", + "evalue": "Output node cannot be measured.", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mValueError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[3]\u001b[39m\u001b[32m, line 7\u001b[39m\n\u001b[32m 4\u001b[39m inputs = {\u001b[32m0\u001b[39m}\n\u001b[32m 5\u001b[39m outputs = {\u001b[32m2\u001b[39m}\n\u001b[32m----> \u001b[39m\u001b[32m7\u001b[39m og = \u001b[43mOpenGraph\u001b[49m\u001b[43m(\u001b[49m\u001b[43mg\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmeas\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutputs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m:7\u001b[39m, in \u001b[36m__init__\u001b[39m\u001b[34m(self, inside, measurements, inputs, outputs)\u001b[39m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/.venv/lib/python3.12/site-packages/graphix/opengraph.py:84\u001b[39m, in \u001b[36mOpenGraph.__post_init__\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 82\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[33m\"\u001b[39m\u001b[33mAll output nodes must be part of the graph\u001b[39m\u001b[33m'\u001b[39m\u001b[33ms nodes.\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 83\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28many\u001b[39m(node \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m.outputs \u001b[38;5;28;01mfor\u001b[39;00m node \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m.measurements):\n\u001b[32m---> \u001b[39m\u001b[32m84\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[33m\"\u001b[39m\u001b[33mOutput node cannot be measured.\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 85\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mset\u001b[39m(\u001b[38;5;28mself\u001b[39m.inputs)) != \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m.inputs):\n\u001b[32m 86\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[33m\"\u001b[39m\u001b[33mInput nodes contain duplicates.\u001b[39m\u001b[33m\"\u001b[39m)\n", + "\u001b[31mValueError\u001b[39m: Output node cannot be measured." + ] + } + ], "source": [ "from optyx.compiler import OpenGraph, Measurement\n", "\n", @@ -76,7 +90,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "412aa1a5-6959-447b-b1d0-fe8891060229", "metadata": {}, "outputs": [ @@ -106,7 +120,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": ".venv", "language": "python", "name": "python3" }, @@ -120,7 +134,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.9" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/docs/notebooks/distributed-412-code.ipynb b/docs/notebooks/distributed-412-code.ipynb index 2745afbb..90f19ffa 100644 --- a/docs/notebooks/distributed-412-code.ipynb +++ b/docs/notebooks/distributed-412-code.ipynb @@ -95,11 +95,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:29:41.334534\n", + " 2025-09-05T12:03:16.012191\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -124,177 +124,177 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p5d3882d49e)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p76c1da9424)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -966,33 +966,7 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1019,10 +993,10 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1030,10 +1004,25 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1041,21 +1030,21 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1063,10 +1052,21 @@ " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1075,10 +1075,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1088,7 +1088,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1138,11 +1138,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:29:41.730876\n", + " 2025-09-05T12:03:16.272006\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -1167,432 +1167,432 @@ "L 727.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p92ee55e2a3)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdd7031ab32)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2879,9 +2879,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2933,10 +2916,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2944,9 +2927,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2955,9 +2938,26 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2966,10 +2966,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2977,9 +2977,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2988,10 +2988,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3001,7 +3001,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3056,11 +3056,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:29:42.212828\n", + " 2025-09-05T12:03:16.543667\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -3085,477 +3085,477 @@ "L 734.027344 7.2 \n", "L 14.027344 7.2 \n", "z\n", - "\" clip-path=\"url(#p8da11b260c)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2c47e3be9a)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -5028,9 +5028,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5093,9 +5093,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5104,10 +5104,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -5115,9 +5115,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5126,10 +5126,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -5137,7 +5137,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5148,9 +5148,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5159,9 +5159,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5170,9 +5170,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5181,7 +5181,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5194,7 +5194,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5381,11 +5381,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:29:43.302457\n", + " 2025-09-05T12:03:17.430226\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -5410,437 +5410,437 @@ "L 655.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pfcc497947d)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2ce01842b3)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -6686,9 +6686,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6832,21 +6798,57 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -6854,10 +6856,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -6865,10 +6867,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -6876,10 +6878,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -6887,9 +6889,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6898,10 +6900,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -6911,7 +6913,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7000,11 +7002,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:29:44.103991\n", + " 2025-09-05T12:03:18.050743\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -7029,767 +7031,767 @@ "L 871.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p7cc8611014)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa042edee39)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9531,35 +9533,7 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9584,10 +9558,38 @@ " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9596,10 +9598,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9607,9 +9609,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9618,10 +9620,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9629,10 +9631,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9640,9 +9642,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9651,10 +9653,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9662,21 +9664,23 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9684,23 +9688,21 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9708,9 +9710,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9719,10 +9721,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9730,9 +9732,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9741,10 +9743,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9754,7 +9756,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9826,7 +9828,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Calculated fidelity a whole round of error detection: 0.9882393885826845\n" + "Calculated fidelity a whole round of error detection: 0.9882393885826843\n" ] } ], @@ -9866,11 +9868,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:29:47.744302\n", + " 2025-09-05T12:03:21.059183\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -9895,767 +9897,767 @@ "L 871.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pcfc0359537)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6772539195)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12397,35 +12399,7 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12450,10 +12424,38 @@ " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12462,10 +12464,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12473,9 +12475,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12484,10 +12486,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12495,10 +12497,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12506,9 +12508,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12517,10 +12519,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12528,21 +12530,23 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12550,23 +12554,21 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12574,9 +12576,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12585,10 +12587,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12596,9 +12598,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12607,10 +12609,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12620,7 +12622,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12664,11 +12666,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:29:47.893587\n", + " 2025-09-05T12:03:21.206357\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -12693,217 +12695,217 @@ "L 349.089844 7.2 \n", "L 25.089844 7.2 \n", "z\n", - "\" clip-path=\"url(#p6b3ceb8940)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7570221545)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -14029,7 +14031,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -14057,9 +14059,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -14094,9 +14096,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -14105,10 +14107,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -14118,7 +14120,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -14184,11 +14186,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:29:48.447391\n", + " 2025-09-05T12:03:21.739934\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -14213,472 +14215,472 @@ "L 673.089844 7.2 \n", "L 25.089844 7.2 \n", "z\n", - "\" clip-path=\"url(#pcbc89b7eb8)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pf6cd864429)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -16259,9 +16261,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16334,10 +16314,32 @@ " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16346,10 +16348,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -16357,9 +16359,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16368,9 +16370,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16379,9 +16381,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16390,10 +16392,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -16403,7 +16405,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -16463,7 +16465,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Calculated fidelity a whole round of error detection: 0.49714692979130937\n" + "Calculated fidelity a whole round of error detection: 0.4971469297913094\n" ] }, { @@ -16477,11 +16479,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:29:51.793757\n", + " 2025-09-05T12:03:24.263381\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -16506,912 +16508,912 @@ "L 997.089844 7.2 \n", "L 25.089844 7.2 \n", "z\n", - "\" clip-path=\"url(#p4d967017a8)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8eaeb740ab)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -19654,35 +19656,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19719,9 +19721,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19730,10 +19732,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -19741,10 +19743,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -19752,9 +19754,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19763,10 +19765,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -19774,10 +19776,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -19785,9 +19787,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19796,21 +19798,23 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -19818,10 +19822,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -19829,22 +19833,20 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19853,10 +19855,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -19864,7 +19866,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19875,9 +19877,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19886,9 +19888,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19899,7 +19901,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19946,7 +19948,7 @@ { "data": { "text/plain": [ - "0.49714692979130937" + "0.4971469297913094" ] }, "execution_count": 21, @@ -20006,11 +20008,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:30:21.627149\n", + " 2025-09-05T12:03:48.086171\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -20041,12 +20043,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -20122,7 +20124,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -20164,7 +20166,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -20201,7 +20203,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -20249,7 +20251,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -20306,7 +20308,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -20620,12 +20622,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -20667,7 +20669,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -20682,7 +20684,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -20709,7 +20711,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -20724,7 +20726,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -20739,7 +20741,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -20860,7 +20862,7 @@ "L 350.49436 267.82537 \n", "L 367.581441 267.871483 \n", "L 384.668523 267.969689 \n", - "\" clip-path=\"url(#p96fda2f31b)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#p2dea61452e)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2dea61452e)\" style=\"fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -21050,11 +21052,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:30:37.899271\n", + " 2025-09-05T12:03:59.392803\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -21085,12 +21087,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -21167,7 +21169,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -21210,7 +21212,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -21248,7 +21250,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -21297,7 +21299,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -21355,7 +21357,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -21670,12 +21672,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -21717,7 +21719,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -21732,7 +21734,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -21759,7 +21761,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -21774,7 +21776,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -21789,7 +21791,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -21900,7 +21902,7 @@ "L 312.523068 276.28471 \n", "L 348.595795 276.308247 \n", "L 384.668523 276.334125 \n", - "\" clip-path=\"url(#pecb106bf06)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#pe462f58ac2)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe462f58ac2)\" style=\"fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -22077,11 +22079,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:30:38.167212\n", + " 2025-09-05T12:03:59.616415\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -22106,437 +22108,437 @@ "L 655.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pebf91712c7)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p92d5ade48c)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -23480,9 +23482,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -23566,10 +23568,25 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -23577,7 +23594,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -23624,7 +23641,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -23635,10 +23652,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -23646,24 +23663,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -23672,9 +23674,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -23683,10 +23685,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -23694,10 +23696,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -23707,7 +23709,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -23742,11 +23744,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:30:38.494612\n", + " 2025-09-05T12:03:59.874984\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -23771,581 +23773,581 @@ "L 691.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p6ae9674246)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc5292ce265)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -24794,7 +24796,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -24829,11 +24831,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:30:39.784064\n", + " 2025-09-05T12:04:00.881265\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -24858,1337 +24860,1337 @@ "L 1411.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pc98929eb7a)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pbb085878b9)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -27323,7 +27325,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -27353,7 +27355,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": ".venv", "language": "python", "name": "python3" }, @@ -27367,7 +27369,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.12.3" } }, "nbformat": 5, diff --git a/docs/notebooks/distributed-422-code.ipynb b/docs/notebooks/distributed-422-code.ipynb index 7943c846..e27600c1 100644 --- a/docs/notebooks/distributed-422-code.ipynb +++ b/docs/notebooks/distributed-422-code.ipynb @@ -115,11 +115,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:35:04.888933\n", + " 2025-09-05T12:04:29.951463\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -144,327 +144,327 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p7541867604)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6f0eae8490)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1264,7 +1264,35 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1289,21 +1317,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1312,9 +1329,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1323,27 +1340,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1353,7 +1353,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1466,11 +1466,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:35:05.111307\n", + " 2025-09-05T12:04:30.160398\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -1495,297 +1495,297 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p8491d22340)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3366cb5728)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2327,21 +2327,23 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2374,27 +2376,25 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2402,10 +2402,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2413,10 +2413,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2424,10 +2424,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2435,9 +2435,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2446,10 +2446,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2459,7 +2459,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2519,11 +2519,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:35:05.693890\n", + " 2025-09-05T12:04:30.470019\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -2548,617 +2548,617 @@ "L 655.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p90879d5dca)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8a6655fc84)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4506,9 +4506,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4560,9 +4560,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4571,7 +4571,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4582,9 +4582,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4593,7 +4593,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4604,7 +4604,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4615,7 +4615,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4626,9 +4626,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4637,9 +4637,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4648,9 +4648,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4659,9 +4659,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4672,7 +4672,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4893,11 +4893,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:35:07.229968\n", + " 2025-09-05T12:04:31.651022\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -4922,447 +4922,447 @@ "L 655.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p2c9bac5a62)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9c34733634)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -6731,35 +6731,7 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6784,10 +6756,38 @@ " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -6796,9 +6796,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6807,20 +6807,18 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6831,9 +6829,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6842,10 +6840,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -6853,9 +6851,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6864,20 +6862,22 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7025,11 +7025,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:35:08.020075\n", + " 2025-09-05T12:04:32.282336\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -7054,612 +7054,612 @@ "L 853.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p18eae5633d)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9799408cf9)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9499,7 +9499,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9527,9 +9527,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9538,9 +9538,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9588,10 +9588,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9599,10 +9599,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9610,10 +9610,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9621,10 +9621,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9632,9 +9632,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9643,9 +9643,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9654,9 +9654,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9665,9 +9665,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9676,34 +9676,34 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9713,7 +9713,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9730,8 +9730,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "(0.9871372589170971-5.076891896713117e-20j)\n", - "(0.9694600839906556-1.5766360938009174e-19j)\n" + "(0.9871372589170974+1.7563410625340952e-21j)\n", + "(0.9694600839906559+0j)\n" ] } ], @@ -9812,11 +9812,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:35:09.728342\n", + " 2025-09-05T12:04:33.732547\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -9841,737 +9841,737 @@ "L 763.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#peaa3ab1534)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p436489bf60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12463,25 +12463,27 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12489,10 +12491,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12500,9 +12502,24 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12511,27 +12528,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12539,9 +12539,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12550,9 +12550,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12561,10 +12561,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12572,10 +12572,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12583,10 +12583,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12594,10 +12594,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12605,10 +12605,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12616,10 +12616,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12627,9 +12627,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12638,21 +12638,23 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12660,10 +12662,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -12671,22 +12673,20 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -12720,7 +12720,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Calculated fidelity for Z error detection: 0.9864120233027301\n" + "Calculated fidelity for Z error detection: 0.9864120233027304\n" ] } ], @@ -12758,7 +12758,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Calculated fidelity a whole round of error detection: 0.9732135897032679\n" + "Calculated fidelity a whole round of error detection: 0.973213589703268\n" ] } ], @@ -12797,11 +12797,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:35:13.938848\n", + " 2025-09-05T12:04:36.857360\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -12826,737 +12826,737 @@ "L 763.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pef8e46ea7a)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdcc6d71110)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -15448,25 +15448,27 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -15474,10 +15476,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -15485,9 +15487,24 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -15496,27 +15513,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -15524,9 +15524,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -15535,9 +15535,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -15546,10 +15546,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -15557,10 +15557,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -15568,10 +15568,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -15579,10 +15579,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -15590,10 +15590,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -15601,10 +15601,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -15612,9 +15612,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -15623,21 +15623,23 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -15645,10 +15647,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -15656,22 +15658,20 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -15772,11 +15772,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:35:14.955850\n", + " 2025-09-05T12:04:37.624928\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -15801,447 +15801,447 @@ "L 655.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p2c1bab663b)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: #f7f700; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46af2bcbca)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -17610,35 +17610,7 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -17663,10 +17635,38 @@ " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -17675,9 +17675,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -17686,20 +17686,18 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -17710,9 +17708,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -17721,10 +17719,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -17732,9 +17730,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -17743,20 +17741,22 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -17788,7 +17788,7 @@ { "data": { "text/plain": [ - "0.973213589703268" + "0.9732135897032678" ] }, "execution_count": 27, @@ -17863,11 +17863,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:35:47.385694\n", + " 2025-09-05T12:05:03.129092\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -17898,12 +17898,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -17979,7 +17979,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -18021,7 +18021,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -18058,7 +18058,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -18106,7 +18106,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -18163,7 +18163,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -18477,12 +18477,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -18498,7 +18498,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -18514,7 +18514,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -18530,7 +18530,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -18546,7 +18546,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -18562,7 +18562,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -18674,7 +18674,7 @@ "L 318.885568 58.353896 \n", "L 354.958295 57.155585 \n", "L 391.031023 57.205314 \n", - "\" clip-path=\"url(#pbd387c17d1)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#p7e4a5ffd57)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7e4a5ffd57)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #808080; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -18839,11 +18839,11 @@ " \n", " \n", " \n", - " 2025-07-01T15:35:47.466024\n", + " 2025-09-05T12:05:03.189628\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -18874,12 +18874,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -18955,7 +18955,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -18997,7 +18997,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19034,7 +19034,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19082,7 +19082,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19139,7 +19139,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19453,12 +19453,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19474,7 +19474,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19490,7 +19490,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19506,7 +19506,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19522,7 +19522,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19538,7 +19538,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19650,7 +19650,7 @@ "L 318.885568 81.963217 \n", "L 354.958295 79.660361 \n", "L 391.031023 79.781787 \n", - "\" clip-path=\"url(#pe1e3e10e75)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#pfaf86098dd)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pfaf86098dd)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #808080; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -19862,7 +19862,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": ".venv", "language": "python", "name": "python3" }, @@ -19876,7 +19876,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/docs/notebooks/feed_forward_example.ipynb b/docs/notebooks/feed_forward_example.ipynb index 1991706e..2a98f6a8 100644 --- a/docs/notebooks/feed_forward_example.ipynb +++ b/docs/notebooks/feed_forward_example.ipynb @@ -71,21 +71,18 @@ "outputs": [], "source": [ "from optyx import qmode\n", - "\n", + "from optyx.core.channel import Diagram, bit, qubit\n", "from optyx.photonic import (\n", " DualRail,\n", - " Swap,\n", " HadamardBS\n", ")\n", "\n", - "fusion = (\n", - " HadamardBS() @ HadamardBS() >>\n", - " qmode @ Swap(1, 1) @ qmode >>\n", - " qmode @ HadamardBS() @ qmode >>\n", - " Swap(1, 1) @ qmode @ qmode >>\n", - " qmode @ Swap(1, 1) @ qmode >>\n", - " qmode @ qmode @ HadamardBS()\n", - ")" + "@Diagram.from_callable(dom=qmode**4, cod=qmode**4)\n", + "def fusion(*a):\n", + " b = (HadamardBS() @ HadamardBS())(*a)\n", + " c1, c2 = HadamardBS()(b[2], b[1])\n", + " d1, d2 = HadamardBS()(b[0], b[3])\n", + " return c1, c2, d1, d2" ] }, { @@ -234,16 +231,16 @@ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-07-11T08:58:10.336908\n", + " 2025-09-04T14:54:28.447721\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -254,393 +251,616 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p796930fa07)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "Q 79.2 17.2 79.2 17.2 \n", + "\" clip-path=\"url(#p796930fa07)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\" clip-path=\"url(#p796930fa07)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -884,7 +1104,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -894,7 +1114,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -904,7 +1124,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -914,7 +1134,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -924,7 +1144,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -934,7 +1154,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -944,7 +1164,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -954,7 +1174,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -964,7 +1184,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -974,7 +1194,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -984,7 +1204,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -994,7 +1214,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1004,7 +1224,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1014,7 +1234,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1024,7 +1244,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1034,7 +1254,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1044,7 +1264,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1054,7 +1274,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1064,7 +1284,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1074,7 +1294,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1083,60 +1303,172 @@ " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1144,9 +1476,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1154,9 +1486,55 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1164,9 +1542,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1613,9 +1991,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1629,9 +2007,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1644,9 +2022,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1659,9 +2037,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1674,9 +2052,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", " \n", " \n", " \n", @@ -1992,6 +2344,46 @@ " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2002,54 +2394,18 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "\n" ], "text/plain": [ - "
" + "
" ] }, "metadata": {}, @@ -2152,7 +2552,7 @@ } ], "source": [ - "teleportation.foliation().draw()" + "teleportation.foliation().draw(figsize=(8, 10))" ] }, { @@ -2161,7 +2561,7 @@ "metadata": {}, "outputs": [], "source": [ - "array_teleportation = teleportation.double().to_tensor().eval().array" + "array_teleportation = teleportation.eval().tensor.array" ] }, { @@ -2173,7 +2573,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -2186,7 +2586,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -2195,7 +2595,7 @@ "True" ] }, - "execution_count": 10, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -2216,7 +2616,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": ".venv", "language": "python", "name": "python3" }, @@ -2230,7 +2630,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/docs/notebooks/optyx-compilation.ipynb b/docs/notebooks/optyx-compilation.ipynb deleted file mode 100644 index b22db722..00000000 --- a/docs/notebooks/optyx-compilation.ipynb +++ /dev/null @@ -1,279 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Transpilation to Linear Optics via ZX Dual-Rail Encoding" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Start with a simple qubit quantum circuit." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from discopy.quantum import CX, H, Id\n", - "\n", - "circuit = CX >> H @ Id(1) >> CX\n", - "circuit.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Convert to ZX using `circuit2zx`" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from discopy.quantum.zx import circuit2zx\n", - "\n", - "diagram = circuit2zx(circuit)\n", - "diagram.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Convert to QPath using `zx_to_path`" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "ename": "TypeError", - "evalue": "can only concatenate tuple (not \"Z\") to tuple", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[4], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01moptyx\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mzx\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m zx_to_path\n\u001b[0;32m----> 3\u001b[0m circ \u001b[38;5;241m=\u001b[39m \u001b[43mzx_to_path\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdiagram\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 4\u001b[0m circ\u001b[38;5;241m.\u001b[39mdraw(draw_box_labels\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m, draw_type_labels\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n", - "File \u001b[0;32m~/Documents/optyx/dist_merge_gates/optyx/optyx/core/zx.py:634\u001b[0m, in \u001b[0;36mzx_to_path\u001b[0;34m(diagram)\u001b[0m\n\u001b[1;32m 630\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21mzx_to_path\u001b[39m(diagram: diagram\u001b[38;5;241m.\u001b[39mDiagram) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m diagram\u001b[38;5;241m.\u001b[39mDiagram:\n\u001b[1;32m 631\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 632\u001b[0m \u001b[38;5;124;03m Dual-rail encoding of any ZX diagram as a QPath diagram.\u001b[39;00m\n\u001b[1;32m 633\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 634\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m zx2path(\u001b[43mdecomp\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdiagram\u001b[49m\u001b[43m)\u001b[49m)\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/symmetric.py:355\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 353\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, Swap):\n\u001b[1;32m 354\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcod\u001b[38;5;241m.\u001b[39mar\u001b[38;5;241m.\u001b[39mswap(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom[\u001b[38;5;241m0\u001b[39m]), \u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom[\u001b[38;5;241m1\u001b[39m]))\n\u001b[0;32m--> 355\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/balanced.py:213\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 211\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, Trace):\n\u001b[1;32m 212\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m traced\u001b[38;5;241m.\u001b[39mFunctor\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, other)\n\u001b[0;32m--> 213\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mbraided\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mFunctor\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/braided.py:259\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 257\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, Braid) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m other\u001b[38;5;241m.\u001b[39mis_dagger:\n\u001b[1;32m 258\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcod\u001b[38;5;241m.\u001b[39mar\u001b[38;5;241m.\u001b[39mbraid(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom[\u001b[38;5;241m0\u001b[39m]), \u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom[\u001b[38;5;241m1\u001b[39m]))\n\u001b[0;32m--> 259\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/traced.py:275\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 273\u001b[0m n \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39marg\u001b[38;5;241m.\u001b[39mdom)) \u001b[38;5;241m-\u001b[39m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom))\n\u001b[1;32m 274\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcod\u001b[38;5;241m.\u001b[39mar\u001b[38;5;241m.\u001b[39mtrace(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39marg), n, left\u001b[38;5;241m=\u001b[39mother\u001b[38;5;241m.\u001b[39mleft)\n\u001b[0;32m--> 275\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/monoidal.py:1115\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 1113\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, Bubble) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcod\u001b[38;5;241m.\u001b[39mar \u001b[38;5;129;01mis\u001b[39;00m Drawing:\n\u001b[1;32m 1114\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m other\u001b[38;5;241m.\u001b[39mto_drawing()\n\u001b[0;32m-> 1115\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/cat.py:912\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 910\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcod\u001b[38;5;241m.\u001b[39mar\u001b[38;5;241m.\u001b[39mid(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom))\n\u001b[1;32m 911\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m box \u001b[38;5;129;01min\u001b[39;00m other\u001b[38;5;241m.\u001b[39minside:\n\u001b[0;32m--> 912\u001b[0m result \u001b[38;5;241m=\u001b[39m result \u001b[38;5;241m>>\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mbox\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 913\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/symmetric.py:355\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 353\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, Swap):\n\u001b[1;32m 354\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcod\u001b[38;5;241m.\u001b[39mar\u001b[38;5;241m.\u001b[39mswap(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom[\u001b[38;5;241m0\u001b[39m]), \u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom[\u001b[38;5;241m1\u001b[39m]))\n\u001b[0;32m--> 355\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/balanced.py:213\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 211\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, Trace):\n\u001b[1;32m 212\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m traced\u001b[38;5;241m.\u001b[39mFunctor\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, other)\n\u001b[0;32m--> 213\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mbraided\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mFunctor\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/braided.py:259\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 257\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, Braid) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m other\u001b[38;5;241m.\u001b[39mis_dagger:\n\u001b[1;32m 258\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcod\u001b[38;5;241m.\u001b[39mar\u001b[38;5;241m.\u001b[39mbraid(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom[\u001b[38;5;241m0\u001b[39m]), \u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom[\u001b[38;5;241m1\u001b[39m]))\n\u001b[0;32m--> 259\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/traced.py:275\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 273\u001b[0m n \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39marg\u001b[38;5;241m.\u001b[39mdom)) \u001b[38;5;241m-\u001b[39m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom))\n\u001b[1;32m 274\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcod\u001b[38;5;241m.\u001b[39mar\u001b[38;5;241m.\u001b[39mtrace(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39marg), n, left\u001b[38;5;241m=\u001b[39mother\u001b[38;5;241m.\u001b[39mleft)\n\u001b[0;32m--> 275\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/monoidal.py:1111\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 1109\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m(head)\n\u001b[1;32m 1110\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m box_or_typ \u001b[38;5;129;01min\u001b[39;00m tail:\n\u001b[0;32m-> 1111\u001b[0m result \u001b[38;5;241m=\u001b[39m result \u001b[38;5;241m@\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mbox_or_typ\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1112\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result\n\u001b[1;32m 1113\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, Bubble) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcod\u001b[38;5;241m.\u001b[39mar \u001b[38;5;129;01mis\u001b[39;00m Drawing:\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/symmetric.py:355\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 353\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, Swap):\n\u001b[1;32m 354\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcod\u001b[38;5;241m.\u001b[39mar\u001b[38;5;241m.\u001b[39mswap(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom[\u001b[38;5;241m0\u001b[39m]), \u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom[\u001b[38;5;241m1\u001b[39m]))\n\u001b[0;32m--> 355\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/balanced.py:213\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 211\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, Trace):\n\u001b[1;32m 212\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m traced\u001b[38;5;241m.\u001b[39mFunctor\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, other)\n\u001b[0;32m--> 213\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mbraided\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mFunctor\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/braided.py:259\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 257\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, Braid) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m other\u001b[38;5;241m.\u001b[39mis_dagger:\n\u001b[1;32m 258\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcod\u001b[38;5;241m.\u001b[39mar\u001b[38;5;241m.\u001b[39mbraid(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom[\u001b[38;5;241m0\u001b[39m]), \u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom[\u001b[38;5;241m1\u001b[39m]))\n\u001b[0;32m--> 259\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/traced.py:275\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 273\u001b[0m n \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39marg\u001b[38;5;241m.\u001b[39mdom)) \u001b[38;5;241m-\u001b[39m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom))\n\u001b[1;32m 274\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcod\u001b[38;5;241m.\u001b[39mar\u001b[38;5;241m.\u001b[39mtrace(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39marg), n, left\u001b[38;5;241m=\u001b[39mother\u001b[38;5;241m.\u001b[39mleft)\n\u001b[0;32m--> 275\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/monoidal.py:1115\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 1113\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, Bubble) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcod\u001b[38;5;241m.\u001b[39mar \u001b[38;5;129;01mis\u001b[39;00m Drawing:\n\u001b[1;32m 1114\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m other\u001b[38;5;241m.\u001b[39mto_drawing()\n\u001b[0;32m-> 1115\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__call__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/cat.py:908\u001b[0m, in \u001b[0;36mFunctor.__call__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 905\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mar[other]\n\u001b[1;32m 906\u001b[0m \u001b[38;5;66;03m# This allows some nice syntactic sugar for the ar mapping.\u001b[39;00m\n\u001b[1;32m 907\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(result, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcod\u001b[38;5;241m.\u001b[39mar)\\\n\u001b[0;32m--> 908\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcod\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mar\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresult\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdom\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcod\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 909\u001b[0m assert_isinstance(other, Arrow)\n\u001b[1;32m 910\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcod\u001b[38;5;241m.\u001b[39mar\u001b[38;5;241m.\u001b[39mid(\u001b[38;5;28mself\u001b[39m(other\u001b[38;5;241m.\u001b[39mdom))\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/monoidal.py:522\u001b[0m, in \u001b[0;36mDiagram.__init__\u001b[0;34m(self, inside, dom, cod, _scan)\u001b[0m\n\u001b[1;32m 520\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m layer \u001b[38;5;129;01min\u001b[39;00m inside:\n\u001b[1;32m 521\u001b[0m assert_isinstance(layer, Layer)\n\u001b[0;32m--> 522\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__init__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43minside\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdom\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m_scan\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m_scan\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.local/lib/python3.10/site-packages/discopy/cat.py:235\u001b[0m, in \u001b[0;36mArrow.__init__\u001b[0;34m(self, inside, dom, cod, _scan)\u001b[0m\n\u001b[1;32m 233\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m box \u001b[38;5;129;01min\u001b[39;00m inside:\n\u001b[1;32m 234\u001b[0m assert_isinstance(box, Box)\n\u001b[0;32m--> 235\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m f, g \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(\u001b[43m(\u001b[49m\u001b[43mId\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdom\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43minside\u001b[49m, inside \u001b[38;5;241m+\u001b[39m (Id(cod), )):\n\u001b[1;32m 236\u001b[0m assert_iscomposable(f, g)\n", - "\u001b[0;31mTypeError\u001b[0m: can only concatenate tuple (not \"Z\") to tuple" - ] - } - ], - "source": [ - "from optyx.core.zx import zx_to_path\n", - "\n", - "circ = zx_to_path(diagram)\n", - "circ.draw(draw_box_labels=False, draw_type_labels=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the dual rail encoding, each qubit gets mapped to 2 linear optical modes.\n", - "Specifically $\\ket{0}$ and $\\ket{1}$ get mapped to $\\ket{1, 0}$ and $\\ket{0, 1}$ respectively.\n", - "\n", - "Here are all the $n$ qubit dual rail states." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[[1, 0, 1, 0, 1, 0],\n", - " [1, 0, 1, 0, 0, 1],\n", - " [1, 0, 0, 1, 1, 0],\n", - " [1, 0, 0, 1, 0, 1],\n", - " [0, 1, 1, 0, 1, 0],\n", - " [0, 1, 1, 0, 0, 1],\n", - " [0, 1, 0, 1, 1, 0],\n", - " [0, 1, 0, 1, 0, 1]]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def dual_rail_states(n_qubits):\n", - " strings = []\n", - " def genbin(n, bs=[]):\n", - " if len(bs) == 2*n:\n", - " strings.append(bs)\n", - " else:\n", - " genbin(n, bs + [1, 0])\n", - " genbin(n, bs + [0, 1])\n", - " genbin(n_qubits)\n", - " return strings\n", - "\n", - "dual_rail_states(3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then we calculate amplitudes of input output pair by sampling the permenant of the unitary associated with the QPath diagram (For details see https://arxiv.org/abs/1011.3245)." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def evaluate(circ, x, y):\n", - " \"\"\" Evaluate the probability of \"\"\"\n", - " from optyx import Id, Create, Select\n", - " inp = Id().tensor(*[Create(i) for i in x])\n", - " out = Id().tensor(*[Select(i) for i in y])\n", - "\n", - " return ((inp >> circ >> out).eval().array.flatten().item())" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 0.707-0.j, -0. +0.j, 0. +0.j, 0.707+0.j],\n", - " [-0. +0.j, 0.707+0.j, 0.707+0.j, 0. -0.j],\n", - " [-0. -0.j, 0.707-0.j, -0.707+0.j, -0. -0.j],\n", - " [ 0.707-0.j, -0. -0.j, -0. -0.j, -0.707+0.j]])" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import numpy as np\n", - "\n", - "states = dual_rail_states(len(circuit.cod))\n", - "array = np.array([[evaluate(circ, x, y) for x in states] for y in states])\n", - "np.round(array, decimals=3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "which is equal to the direct simulation of the original quantum circuit." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 0.707+0.j, 0. +0.j, 0. +0.j, 0.707+0.j],\n", - " [ 0. +0.j, 0.707+0.j, 0.707+0.j, 0. +0.j],\n", - " [ 0. +0.j, 0.707+0.j, -0.707+0.j, 0. +0.j],\n", - " [ 0.707+0.j, 0. +0.j, 0. +0.j, -0.707+0.j]])" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.round(circuit.eval().array.reshape(4, 4), decimals=3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "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.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/docs/notebooks/optyx-vqe-experiment.ipynb b/docs/notebooks/optyx-vqe-experiment.ipynb index 67cb55b4..6d1f9176 100644 --- a/docs/notebooks/optyx-vqe-experiment.ipynb +++ b/docs/notebooks/optyx-vqe-experiment.ipynb @@ -32,7 +32,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] @@ -72,7 +72,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] @@ -93,12 +93,88 @@ "metadata": {}, "outputs": [], "source": [ - "from optyx.qubits import Circuit" + "from optyx.qubits import Circuit\n", + "from optyx.core.backends import DiscopyBackend" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, + "id": "28b96946", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from optyx.qubits import Z\n", + "\n", + "Z(1, 1).dagger().draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "26ece567", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdkAAAl0CAYAAABcKg1VAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAA6SdJREFUeJzs3XtclHXe//H3xWFEQkAEFztMpnlAUVEoFhQldfOwoW3enVyzlM21zaxWzFrr1q1tl9VM67Y1KwvvrJ+btSqVxywsdbVCyVRMY/VWCw8goAjK6fr9YU1OYHng63B4PR8PHw+45prr+lxAvbhmrhks27ZtAQCAWufl6QEAAGioiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWdSq/fv3y8/PT+vXr7/k+37xxRfldDp16tSpS75vAKgJkcVPGjFihPz8/LRr165qt6WmpsqyLL333nuuZU8++aRiY2PVs2dPt3W/+eYb3XbbbQoODlZgYKCGDh2q//znP+c8x4YNG9SrVy/5+/srPDxc48ePV3Fxsds699xzj8rKyjR37tzzPEoAMMOybdv29BCouw4fPqyOHTsqKipKH374oWv5nj171LlzZw0ePFhvv/22JOnIkSO64oorNH/+fN15552udYuLi9WjRw8VFRVpwoQJ8vX11cyZM2VXVSlz40aFXX65LK+z/76XlZWluLg4RUREaMyYMTpw4ICeeeYZ3XDDDVq+fLnbupMmTdI///lP7dmzR5Zl1fJXAwDOkw38jJdeesmWZKelpbmWDRw40A4MDLQPHDjgWvbss8/aTZs2tY8fP+52/7///e+2JPvTTz+1K06csI9t2WKvmzXL9vbysscPGWIfWrTIPrZli11x4kSN+x80aJDdqlUru6ioyLXs5ZdftiXZK1eudFv3888/tyXZa9asqY1DB4CLwsPF+Fm/+93v1LNnT6WkpCg/P18LFy7UihUr9Je//EVXXHGFa70lS5YoNjZWAQEBbvd/++23dd111ynqmmuU//77KsnO1rVhYUro3FnpmzbJLitTSXa28t9/X+X5+W73PXbsmFavXq0RI0YoMDDQtXzkyJEKCAjQW2+95bZ+dHS0QkJCtHTpUgNfCQA4P0QWP8uyLM2dO1dFRUW677779PDDDysmJkb333+/a53y8nJ99tln6tGjh9t9q6qqtHXrVkVHRango49kl5dL3z1D0b1tW+09dEjFpaWSbcuuqFDBhx+qsqTEdf8vv/xSFRUViomJcduuw+FQVFSUtmzZUm3eHj16eOTCKwD4MSKLc9K5c2elpKRo0aJFOnLkiObOnSuvM55H3bdvn0pLS3XNNde43e/o0aM6deqUWvj4yK6ocLutZXCwJOlgQcHpBd+FtnT3btc6ubm5kqRWrVpVm6lVq1b69ttvqy1v06aNduzYcUHHCQC1icjinIWGhkqSLr/8ckVGRrrdlv/dw7zNmzd3W15aWipJ8jp+3HUG+70mvr6SpJNlZT8stG2V7N4tu6rK7f5NmjSpNo+fn5/r9jM1b95cpaWlKjnjjBgAPIHI4pzs379fU6ZMUWRkpPbv369p06bVuJ79o5A2bdpUknTq5Mlq654qL5ck+Tkc7tsoK1PVd691dd2/hte+njx50nV7TTNwdTEATyOyOCfjxo2TJC1fvly33nqrnn76abfXubZo0UKSVPD9Q7/fCQkJUZMmTXSosLDaNg9/tyz8R2e/Z/r+YeLvHzY+U25uri6//PJqywsKCuTv719jgAHgUiKy+FmLFy9Wenq6nnrqKV155ZWaNWuWHA6H24VPTqdTTZs21Z49e9zu6+XlpS5duuiLHy2XpM1ff62rW7ZUwI9iaDkc8vru4eHIyEj5+Pjo888/d1unrKxMWVlZioqKqrbdPXv2KCIi4kIPFwBqDZHFTzp+/LjGjx+v7t2764EHHpB0+jnZp556SitWrNCiRYskSb6+voqJiakWQ0n6r//6L2Xl5CjrjNB+/e23Wrdjh5JiY93W3f3tt8oPCHC9OUVQUJD69++vBQsW6Pjx4671Xn/9dRUXF+vWW2+ttr/NmzcrPj7+4g8eAC4S7/iEn/Tggw9q9uzZ2rhxo6677jrX8srKSl1//fU6ePCgdu7cqWbNmmnGjBmaPHmyDh8+7Paa1uPHj6t7VJSK8vN13+DB8vX21tzly1VZVaUP/vpXhX6/rmUpfPhw9U5I0NqPP3bd//todurUyfWOTzNmzFDv3r21cuVKt3kzMzMVExOjDz74QP369TP7xQGAn8GZLM4qMzNTL7zwgv7whz+4BVaSvL299eKLL+rgwYN6/PHHJUl33XWXKisrlZ6e7rZus2bNlLF2rXr36aNZS5bo72+/rU5OpxY//rhbYC0fn9Mf/ugtFnv06KEPPvhATZs21cMPP6yXXnpJycnJrrdzPNOiRYvkdDrVt2/f2voyAMAF40wWtSo5OVm7du3SJ598UuPtlSUlKtm1S6Vffy37u5fuWA6H/Nu1U9N27eTt73/B+z516pRat26tRx99VA8++OAFbwcAaguRRa3at2+f2rdvrzVr1lT7SzxnsquqNPKOOyRJ/7tw4U/+gYBz9eKLL+qvf/2rdu/eXePragHgUiOy8JghQ4ZIUrWHlwGgoeA5WQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwatL1798qyLGVlZZ11nYyMDFmWpcLCwks2F4DGgcii0YuPj1dubq6CgoIkSWlpaQoODvbsUAAaBB9PDwB4msPhUHh4uKfHANAAcSaLOu3EiRMaOXKkAgIC1KpVK82YMUOJiYl66KGHJEmWZWnJkiVu9wkODlZaWprbsp07dyo+Pl5+fn6KjIzU2rVrXbed+XBxRkaGRo0apaKiIlmWJcuyNHXqVLMHCaDBIrKo0yZOnKi1a9dq6dKlWrVqlTIyMrR58+YL2s6ECRO0ZcsWxcXFKSkpSfn5+dXWi4+P16xZsxQYGKjc3Fzl5uYqJSWlNg4FQCNEZFFnFRcXa968eXrmmWfUr18/denSRfPnz1dFRcV5b2vcuHEaNmyYIiIiNGfOHAUFBWnevHnV1nM4HAoKCpJlWQoPD1d4eLgCAgJq43AANEJEFnVWTk6OysrKFBsb61oWEhKiDh06nPe24uLiXB/7+PgoJiZG2dnZtTInAJwNkUW9ZlmWbNt2W1ZeXu6haQDAHZFFndW2bVv5+vpq06ZNrmUFBQXatWuX6/OwsDDl5ua6Pt+9e7dKSkqqbWvjxo2ujysqKpSZmamIiIga9+twOFRZWVkbhwCgkeMlPKizAgIClJycrIkTJ6pFixZq2bKlJk+eLC+vH3437Nu3r2bPnq24uDhVVlZq0qRJ8vX1rbatF154Qe3atVNERIRmzpypgoICjR49usb9tm7dWsXFxVqzZo26desmf39/+fv7GztOAA0XZ7Ko06ZPn66EhAQlJSWpf//+6tWrl6Kjo123z5gxQ1dddZUSEhI0fPhwpaSk1BjE1NRUpaamqlu3blq3bp3S09MVGhpa4z7j4+M1duxY3X777QoLC9O0adOMHR+Ahs2yf/yEFnCJDBkyRJKUnp5+XvdLTExUVFSUZs2aZWAqAKg9nMkCAGAIkQUAwBAufEK9k5GR4ekRAOCccCYLAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQB1Hn79++Xn5+f1q9ff8n3/eKLL8rpdOrUqVOXfN+o/4gsgEtuxIgR8vPz065du6rdlpqaKsuy9N5777mWPfnkk4qNjVXPnj3d1v3mm2902223KTg4WIGBgRo6dKj+85//nPMcGzZsUK9eveTv76/w8HCNHz9excXFbuvcc889Kisr09y5c8/zKAHJsm3b9vQQaJyGDBkiSUpPT/fwJLjUDh8+rI4dOyoqKkoffviha/mePXvUuXNnDR48WG+//bYk6ciRI7riiis0f/583Xnnna51i4uL1aNHDxUVFWnChAny9fXVzJkzZVdVKXPjRoVdfrksr7OfR2RlZSkuLk4REREaM2aMDhw4oGeeeUY33HCDli9f7rbupEmT9M9//lN79uyRZVm1/NVAg2YDHpKUlGQnJSV5egx4yEsvvWRLstPS0lzLBg4caAcGBtoHDhxwLXv22Wftpk2b2sePH3e7/9///ndbkv3pp5/aFSdO2Me2bLHXzZple3t52eOHDLEPLVpkH9uyxa44caLG/Q8aNMhu1aqVXVRU5Fr28ssv25LslStXuq37+eef25LsNWvW1MahoxHh4WIAHvG73/1OPXv2VEpKivLz87Vw4UKtWLFCf/nLX3TFFVe41luyZIliY2MVEBDgdv+3335b1113naKuuUb577+vkuxsXRsWpoTOnZW+aZPssjKVZGcr//33VZ6f73bfY8eOafXq1RoxYoQCAwNdy0eOHKmAgAC99dZbbutHR0crJCRES5cuNfCVQENGZAF4hGVZmjt3roqKinTffffp4YcfVkxMjO6//37XOuXl5frss8/Uo0cPt/tWVVVp69atio6KUsFHH8kuL5e+e+are9u22nvokIpLSyXbll1RoYIPP1RlSYnr/l9++aUqKioUExPjtl2Hw6GoqCht2bKl2rw9evTwyIVXqN+ILACP6dy5s1JSUrRo0SIdOXJEc+fOldcZz6Pu27dPpaWluuaaa9zud/ToUZ06dUotfHxkV1S43dYyOFiSdLCg4PSC70Jbunu3a53c3FxJUqtWrarN1KpVK3377bfVlrdp00Y7duy4oONE40VkAXhUaGioJOnyyy9XZGSk22353z3M27x5c7flpaWlkiSv48ddZ7Dfa+LrK0k6WVb2w0LbVsnu3bKrqtzu36RJk2rz+Pn5uW4/U/PmzVVaWqqSM86IgZ9DZAF4zP79+zVlyhRFRkZq//79mjZtWo3r2T8KadOmTSVJp06erLbuqfJySZKfw+G+jbIyVX33WlfX/Wt47evJkyddt9c0A1cX43wQWQAeM27cOEnS8uXLdeutt+rpp592e51rixYtJEkF3z/0+52QkBA1adJEhwoLq23z8HfLwn909num7x8m/v5h4zPl5ubq8ssvr7a8oKBA/v7+NQYYOBsiC8AjFi9erPT0dD311FO68sorNWvWLDkcDrcLn5xOp5o2bao9e/a43dfLy0tdunTRFz9aLkmbv/5aV7dsqYAfxdByOOT13cPDkZGR8vHx0eeff+62TllZmbKyshQVFVVtu3v27FFERMSFHi4aKSIL4JI7fvy4xo8fr+7du+uBBx6QdPo52aeeekorVqzQokWLJEm+vr6KiYmp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LVq0UEBAgIYNG6ZDhw797Laio6NlWZbr38CBA123hYaGauTIkZoyZYqR4zgbn0u6NwCAccOGDVNZWZnmz5+vNm3a6NChQ1qzZo3y8/M9PZokybZtVVZWysfHR88//7xGjRolL68fzvkefvhhvf/++1q0aJGCgoI0btw43XLLLT/7S0J8fLzeeecd1+dNmjRxu33UqFGKjo7W9OnTFRISUrsHdRacyQJAA1JYWKhPPvlEf//733XDDTfo6quv1vXXX6/HHntMQ4YMca3z+9//Xr/61a8kSbfddpvee+89SVJ+fr7uvPNOXXHFFfL391eXLl30//7f//vJfb7++uuKiYlRs2bNFB4eruHDh+vw4cOu2zMyMmRZlpYvX67o6Gg1adJE69at05EjR/Thhx8qKSnJtW5RUZHmzZunZ599Vn379lV0dLRee+01bdiwQRs3bvzJOXx9fRUeHu7617x5c7fbO3furMsvv1yLFy8+9y/oRSKyANCABAQEKCAgQEuWLNGpU6eq3V5VVaVBgwZp/fr1euqppyRJ48aNk7e3t6TTD9VGR0fr/fff17Zt2zRmzBjddddd+vTTT8+6z/Lycj311FP64osvtGTJEu3du1f33HNPtfUeffRRpaamKjs7W127dtW6devk7++viIgI1zqZmZkqLy9X//79Xcs6duwop9Opf//73z957JmZmWrZsqU6dOig++67r8Yz9+uvv16ffPLJT26nNvFwMQA0ID4+PkpLS9O9996rF198UT169FCfPn10xx13qGvXrvrggw/06aefKjs7W8XFxZJOX3jUo0cPSdIVV1yhlJQU1/YeeOABrVy5Um+99Zauv/76Gvc5evRo18dt2rTR888/r+uuu07FxcUKCAhw3fbkk0+6zp4l6f/+7//0i1/8wu2h4oMHD8rhcCg4ONhtH7/4xS908ODBnzz2J598Uv3791dOTo7+9Kc/adCgQfr3v//t+gVCki6//HJt2bLlJ7dTmziTBYAGZtiwYfr222+Vnp6ugQMHKiMjQz169FBaWpqysrJ05ZVXqn379jXet7KyUk899ZS6dOmikJAQBQQEaOXKldq3b99Z95eZmamkpCQ5nU41a9ZMffr0kaRq94mJiXH7vLS0VH5+fhd5tD/o06ePunTpoptvvlnvvfeePvvsM2VkZLit07RpU5WUlNTaPn8OkQWA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erVyc3MVEhKiFi1auB4mtizrUhweAFwwIotzkpeXp+3bt2vHjh3avn27tm/frgMHDujo0aM6evSoa70TJ05o2LBhkiSHw6EWLVqoTfs26vfbfpKkosIit+0GhQTJ0cShIwePuC1ft36dvsj8QpL0yCOP1DjTHXfcoZYtW+rKK69U586d1blzZ3Xq1EmdO3dWaGhorR07AFwoIgs35eXl+vTTT7V161ZXTHfs2KHDhw9Lknx8fNSuXTt17txZMTExatGihVauXKmMjAyNGzdOv/vd79SiRQuFhISoadOmsixLtm0r+0S2/Jr66cDeA2778/LyUvvI9tq2+Yd3cfKSlz756BMNGDBAOTk5+vLLL11nxUePHtXLL7+shQsX6uGHH9aJEye0d+9effjhh5o7d64qKiokSS1btnQFt3PnzuratatiY2Pl48OPPIBLx7J//PgdGp2CggKtWLFC7777rpYvX67CwkK3mJ55htiuXTs5HD88f7p48WLdcsstGjJkyE++rOZIxRENThwsSVqwZoHbbS8/87JmPD5Di9YvUpfoLgrxDtHRnKPq3LmzUlJSlJqa6rb+Lbfcoq+//lpbt251W15WVqbdu3e7/XKwfft27d69WxUVFQoODtagQYOUlJSkgQMHup7bRcMyZMgQSVJ6erqHJwGIbKO1a9cuvfvuu3r33Xe1bt06VVZWqnv37rrpppt00003KSoqyi2mNcnNzVXnzp117NgxPfvsswoJCalxvbZt2yrmlzF6YtoTmjllpjbs36CAwADX7cXHi3VL7C06UXxCyQ8lq6VfSz038zlVVlYqKytLYWFhrnXLy8sVHh6uP/zhD3rqqafO6VjLysqUlZWl9957T++++66ysrLk7e2thIQE3XTTTUpKSnK7Ehr1G5FFnWKj0aisrLTfeustu2vXrrYku0mTJvbgwYPtOXPm2Pv37z/v7X300Ue2pJ/9d/fdd9u2bdt7c/faPj4+9rRXp9k7T+50+5fxdYY98JaBdmBgoB0QEGDfdNNN9u7du6vtc/ny5bakGm87V/v27bPnzJljDx482G7SpIktye7atav91ltv2ZWVlRe8XdQNSUlJdlJSkqfHAGzbtm3OZBuBqqoqvfPOO/rzn/+s7du368Ybb9Qf/vAH9e/fX5dddtklnWXU6FHK3pWt19e87nrXJy95Kdg7WMHewfK1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9ElQuco1f9V8t/Vv7XWrJOmdde/oSt8r1dSrqSRpwIABysnJ0ddff+22/i233KKcnBx98cUXFzTf/v379d577+ndd9/Vhx9+qFOnTqlbt26aPHkyZ66o9/jpBTzEy8tLt956q7KysrRr1y799a9/VWlpqR544AE5nU51795dTzzxhDZt2qSysrIL2kdJSYluu+02eXt7a+HCha7AlpSV6PPPPldE9wi39auqqvTVl18pskekqlSlA+UHVG6XS5Kuv/565eTk6Pjx4273iY6O1rZt23Ts2LFzmqmsrEybNm3SE088oaioKDmdTj3wwAM6efKk/vrXv2rXrl3KysrSrbfeSmBR7/GcLFAHtGvXTn/84x/1xz/+UQUFBVq5cqXeffddvfDCC/rLX/4ib29vtWvXTp07d1bnzp3VqVMnde7cWe3bt5fD4Tjrdh944AHt2LFD8+fPV/v27V3Lt+3ZppOlJ3Vla/c/bl50tEhlp8oUFh4mSapSlQorCxXmE6ZWrVpJkr799lt16NDBdZ82bdqoqqpKO3fu1PXXX+9aXlZWpl27dmn79u3asWOHtm/fru3bt2v37t2qrKxU8+bNNWjQID366KMaOHCggoODa+NLCdQpRBaoY5o3b6477rhDd9xxhyoqKvTpp5/qiy++cIXqxRdf1OHDhyXJLb7XXHONQkJCFBISohYtWmjLli169dVXdcstt2jYsGGybVuWZcm2be07sk+SFBQc5Lbvk6UnJUmOJj+Eu7CyUKHeofLz85MkHT16VPv371d+fr6OHj3qegnPP/7xDy1atEh79uxxi6kk/eIXv1CnTp3Uv39/Pfjgg+ratauuv/56+fjwvyA0bPyEA3WYj4+P4uPjq12BnJeXpx07dridIW7dulVHjx5VQUGBqqqqXOv+61//0r/+9S85HA6FhISobYe2evAvD0qSfnxJhl/T0yEtO/XDw9NVqlLCDQn6csuXknTWq6H/9a9/KTw8XFdeeaUrpt+fcZ95RTLQmBBZoB4KDQ1V79691bt372q3lZaW6pe//KV27typV155RWFhYTp69KjrzLO0rFTBIcGSpKLCIrf7BoUEydHEoSMHj7gt79Wzl7xtb3388cd65ZVXdMUVV7jOmD/88EONGTNGa9as0XXXXWfsmIH6iMgCDcwjjzyirVu36rnnntNdd91V7XbbtpV9Ilt+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at26tSzL0qxZs6ptf86cOeratasCAwMVGBiouLg4LV++3G2dxMREWZbl9m/s2LHVtpWWlqauXbsqLi7OdfznM++//vUvxcTEKDg42LXO66+/7rbOj+f4/t/06dNd6wwZMkROp1N+fn5q1aqV7rrrLn377bdu29m6dasSEhLk5+enq666StOmTXO7vby8XE8++aTatm0rPz8/devWTStWrHBbZ+rUqdXm6Nixo9s6P/e9Dg0N1ciRIzVlypRqX8+fQmQBaNiwYSoqKlL37t21a9cupaenKzExUfn5+Z4eTZJk27YqKiokSc8//7xGjRolL68f/vdVUlKigQMH6k9/+tN5b/uzzz7T3Llz1bVr12q3nc92H3nkEV1++eXVlm/YsEFdu3bVO++8o61bt2rUqFEaOXKk3nvvPbf9tGnTRqmpqQoPD69x+1deeaVSU1OVmZmpzz//XH379tXQoUO1fft2t/Xuvfde5ebmuv79OErPPvusJk+erEcffVRvvfWWJLlie67zhoSEaPLkyfr3v//tWmfUqFFauXKla50zZ8jNzdWrr74qy7I0bNgw1zo33HCD3nrrLX311Vd65513lJOTo//6r/9y3X7s2DHdeOONuvrqq5WZmanp06dr6tSpeumll1zrPP7445o7d67+53/+Rzt27NDYsWP1m9/8Rlu2bHE77s6dO7vNs27dOrfbz+V7PWrUKL3xxhs6evToWdepxka9k5SUZCclJXl6DDQQBQUFtiQ7Li7urD9XBQUF9pgxY+yWLVvaTZo0sTt37my/++67tm3bdl5enn3HHXfYl19+ud20aVM7MjLSfvPNN93u36dPH/vBBx90ff6///u/dnR0tB0QEGD/4he/sO+880770KFDrts/+ugjW5K9bNkyu0ePHravr6/90Ucf2YcPH7Yty7K3bdtW45zf36+goOCcjv348eN2u3bt7NWrV1eb8ae2m5mZaUuyMzMzbdu27WXLltkdO3a0t2/fbkuyt2zZ8pP7HTx4sD1q1Kgab7v66qvtmTNnntP8zZs3t1955RXX5z91DLZt20ePHrWbNm1qf/DBBzUex4XM+73u3bvbjz/++FlvHzp0qN23b9+f3MbSpUtty7LssrIy27Zt+x//+IfdvHlz+9SpU651Jk2aZHfo0MH1eatWrezZs2e7beeWW26xf/vb37o+nzJlit2tW7ef3Pf3fu5n6JprrnH7mv8czmSBRi4gIEABAQE6ePCgKisrq91eVVWlQYMGaf369VqwYIF27Nih1NRUeXt7S5JOnjyp6Ohovf/++9q2bZvGjBmju+66S59++ulZ91leXq6nnnpKX3zxhZYsWaK9e/fqnnvuqbbeo48+qtTUVGVnZ6tr165at26d/P39FRERUSvHfv/99+vXv/61+vfvf8HbOHTokO699169/vrr8vf3P6f7FBUVKSQk5IL3WVlZqYULF+rEiRNuZ6GS9MYbbyg0NFSRkZF67LHHVFJS4rpt9erVqqqq0jfffKOIiAgNGjRIknTw4MELnte2ba1Zs0ZfffWVevfuXeM6hw4d0vvvv6/k5OSz7uPo0aN64403FB8fL19fX0nSv//9b/Xu3VsOh8O13oABA/TVV1+poKBA0umH6f38/Ny21bRp02pnqrt379bll1+uNm3a6Le//a327dv3k8d8Ntdff70++eSTc7/DOecYdQZnsqhtb7/9tu3r62t7eXnZ8fHx9mOPPWZ/8cUXtm3b9sqVK20vLy/7q6++Ouft/frXv7YnTJjg+vznzrA+++wzW5J9/Phx27Z/OJtYsmSJ23ozZ86027Rpc9btnM+Z7P/7f//PjoyMtEtLS392xrOdyX7++ef2wIED7aeeesq2bdves2fPz57J/vOf/7QdDsdZz8Z/6kx269at9mWXXWZ7e3vbQUFB9vvvv+92+9y5c+0VK1bYW7dutRcsWGBfccUV9m9+8xvX7X/7299sX19fu0OHDvaKFSvstLQ0W5J99dVXu50tnsu8hYWF9mWXXWb7+PjYTZo0sefNm3fWY/773/9uN2/e3PW1PtMjjzxi+/v725LsX/7yl3ZeXp7rtl/96lf2mDFj3Nb//tGCHTt22LZt23feeafdqVMne9euXXZlZaW9atUqu2nTprbD4XDdZ9myZfZbb71lf/HFF/aKFSvsuLg42+l02seOHas2z8/9DD388MN2YmLiWY/1xziTBaBhw4bpV7/6la6//noNHDhQGRkZ6tGjh9LS0pSVlaUrr7xS7du3r/G+lZWVeuqpp9SlSxeFhIQoICBAK1eu/MkzhczMTCUlJcnpdKpZs2bq06ePJFW7T0xMjNvnpaWl1c5aLsT+/fv14IMP6o033rio7S1cuFDHjx/XY489dk7rf/TRRxo1apRefvllde7c+bz316FDB2VlZWnTpk267777dPfdd2vHjh2u28eMGaMBAwaoS5cu+u1vf6v//d//1eLFi5WTkyPp9KMS5eXlev75513rSae/Hh999NF5zdusWTNlZWXps88+09NPP60//vGPysjIqHHuV199Vb/97W9r/FpPnDhRW7Zs0apVq+Tt7a2RI0fKtu1z/po899xzateunTp27CiHw6Fx48ZVe85+0KBBuvXWW9W1a1cNGDBAy5YtU2Fhoes56fPRtGlTt0cHfg6RBSBJ8vb2VlhYmJ544glt2LBB99xzj6ZMmaKmTZv+5P2mT5+u5557TpMmTdJHH32krKwsDRgwQGVlZTWuf+LECQ0YMECBgYF644039Nlnn2nx4sWSVO0+l112mdvnoaGhrocJL0ZmZqYOHz6sHj16yMfHRz4+Plq7dq2ef/55+fj41PiweU0+++wz/fvf/1aTJk3k4+Oja6+9VtLpXw7uvvtut3XXrl2rpKQkzZw5UyNHjryguR0Oh6699lpFR0frb3/7m7p166bnnnvurOvHxsZKkr7++mtJUqtWrSRJnTp1clsvODi42i84Pzevl5eXrr32WkVFRWnChAn6r//6L/3tb3+rtt4nn3yir776Sr/73e9qnDE0NFTt27fXr371Ky1cuFDLli3Txo0bJUnh4eE6dOiQ2/rff/79BWJhYWFasmSJTpw4of/7v//Tzp07FRAQoDZt2pz16xIcHKz27du7vi7n4+jRowoLCzvn9YksgBp16tRJJ06cUNeuXXXgwAHt2rWrxvXWr1+voUOHasSIEerWrZvatGlz1nUlaefOncrPz1dqaqoSEhLUsWNHHT58+Jxm6t69uw4ePHjRoe3Xr5++/PJLZWVluf7FxMTot7/9rbKyslzPN/+ciRMn6osvvnBtY9myZZKkf/7zn3r66add62VkZOjXv/61/v73v2vMmDEXNfuZqqqqdOrUqbPe/v1Lib6Pa8+ePSVJX331ldt6hYWFuvrqqy9q3rPNMm/ePEVHR6tbt27ntA1Jru3ExcXp448/Vnl5uWud1atXq0OHDmrevLnbff38/HTFFVeooqJC77zzjoYOHXrW/RQXFysnJ8f1dTkf27ZtU/fu3c95fZ/z3gOABiU/P1+33nqrCgsLFRgYqD179ujzzz/XtGnTNHToUPXp00e9e/fWsGHD9Oyzz+raa6/Vzp07ZVmWBg4cqHbt2untt9/Whg0b1Lx5cz377LM6dOhQtbOl7zmdTjkcDv3P//yPxo4dq23btumpp546p1m7d++u0NBQrV+/XjfddJNr+cGDB3Xw4EHXmcmXX36pZs2ayel0ui7Y6devn37zm99o3LhxatasmSIjI922fdlll6lFixZuy8+23aKiIkmn43Xm+gEBAZKktm3b6sorr5R0+iHXm266SQ8++KCGDRvmusjI4XC4ZisrK3M97FtWVqZvvvlGWVlZCggIcJ0dP/bYYxo0aJCcTqeOHz+uN998UxkZGa6XzeTk5OjNN9/U4MGD1aJFC23dulUPP/ywevfu7Xp5Uvv27TV06FA9+OCDeumll1xvrNC6dWvdcMMN5zzv3/72N8XExKht27Y6deqUli1bptdff11z5sxx+5oeO3ZMixYt0owZM6p9Lzdt2qTPPvtMvXr1UvPmzZWTk6MnnnhCbdu2dV3MNXz4cP35z39WcnKyJk2apG3btum5557TzJkz3bbzzTffKCoqSt98842mTp2qqqoqPfLII651UlJSlJSUpKuvvlrffvutpkyZIm9vb915553n9TNUUlKizMxM/fWvf612PGd1zs/eos7gwifUppMnT9qPPvqoHRQUZPv4+Nj+/v52hw4d7Mcff9wuKSmxbdu28/Pz7VGjRtktWrSw/fz87MjISPu9995z3TZ06FA7ICDAbtmypf3444/bI0eOtIcOHerax48vKnrzzTft1q1b202aNLHj4uLs9PR0twuGfurik0ceecS+44473JZNmTLFllTt32uvveZa5+qrr7anTJly1q9DTRc+nW273y//8Utfarrw6e67765xG3369Kl2v59aZ/To0fbVV19tOxwOOywszO7Xr5+9atUq1+379u2ze/fubYeEhNhNmjSxr732WnvixIl2UVGR24xFRUX26NGj7eDgYDsoKMiW5HYB1bnMO3nyZPvaa6+1/fz87ObNm9txcXH2woULq31N586dazdt2tQuLCysdtvWrVvtG264wTVv69at7bFjx9oHDhxwW++LL76we/XqZTdp0sS+4oor7NTUVLfbMzIy7IiICLtJkyZ2ixYt7Lvuusv+5ptv3Na5/fbb7VatWtkOh8O+4oor7Ntvv93++uuv3dY5l5+hN9980+3lQ+fCsu3zeIYZdcKQIUMk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GfL08tT+Pfsdjufi4qKWES21deMv7+LkIhd9tfIr9e7dW5mZmdqyZYv9qvjo0aN68803NX/+fD399NM6ceKE9uzZoy+++EKzZ89WSUmJJKlRo0b24IaHh6tdu3aKiYmRmxv/VADgctms8x+HxCXLzc3Vp59+qo8++khLly5VXl6eQ0zPvUJs0aKFPDx+ef504cKFuuuuu9SvX7+LvqzmSMkR9Y3vK0mat2Kew7o3X3lTU56fogVrFqhtVFsFuAboaOZRhYeHKzExUUlJSQ7j77rrLv3www/avHmzw/KioiLt2rXL4ZeDbdu2adeuXSopKZG/v7/69OmjhIQE3X777fbndlG79OvXT5KUkpLi5JkAtQeRvUw7d+7URx99pI8++kirV69WaWmpOnTooDvuuEN33HGHIiMjHWJakaysLIWHh+vYsWOaOnWqAgICKhwXGhqq6N9E64VJL2ja+Glau2+tfHx97OsLjhforpi7dKLghIY+NVSNPBvp1WmvqrS0VOnp6QoKCrKPLS4uVnBwsJ588klNnDjxks61qKhI6enp+vjjj/XRRx8pPT1drq6u6tq1q+644w4lJCQ43AmNmo3IAgZY+FWlpaXW+++/b7Vr186SZNWrV8/q27evNWvWLGvfvn2Xvb+VK1dakn7145FHHrEsy7L2ZO2x3NzcrElvT7J2nNrh8JH6Q6p1+123W76+vpaPj491xx13WLt27Sp3zKVLl1qSKlx3qfbu3WvNmjXL6tu3r1WvXj1LktWuXTvr/ffft0pLS694v6geEhISrISEBGdPA6hVuJK9iLKyMn344Yd68cUXtW3bNt1222168skn1atXL11zzTVVOpfBQwYrY2eG3lnxjv1dn1zkIn9Xf/m7+svd5n7R7e+8807ZbDYtXLiwUuZz4sQJff755/rXv/6l5cuXKzw8XOPHj9eAAQPk4sIrw2oirmSBysf/DStQVlamBQsWqF27drr33nvVpEkTrVmzRsuWLVP//v2rPLCS9OKEF5X+bboObTikUI9QhXqE6iaPmxTkFvSrgc3IyNDHH398yQ8TX4prrrlG/fv317Jly7RmzRo1adJE9957r9q1a6cFCxaorKzs13cCALUckT3P9u3bFRkZWS6ucXFxTp1XSEiITp06pS5dusjN5iY3m9slv941LCxMJSUlioiIMDK3uLi4crGNjIzU9u3bjRwPAGoKInuOpUuXKjY2VpZlVZu41iTnxrasrEyxsbFaunSps6cFAE5DZHXm3ZSmTZumO+64Q926ddPatWuJ61WIi4vT2rVr1a1bN91xxx2aPn16uXesAoC6oM5HtqioSMOGDdMf//hHjRkzRosWLVL9+vWdPa0az9fXV4sWLdKYMWP09NNPa9iwYSoqKvr1DQGgFqnTb+NTVlam3/3ud/rss8/073//W48++qizp1SruLq6atKkSWrTpo2GDRumAwcO6KOPPuLuYwB1Rp3+v93s2bO1ZMkSLVq0iMAa9Oijj2rRokVasmSJ3njjDWdPBwCqTJ2N7O7duzV27Fj9/ve/V9++fZ09nVqvb9++GjZsmMaOHas9e/Y4ezoAUCXqZGTLyso0dOhQNWzYUJMmTXL2dOqMyZMnKyAgQEOHDuV1tADqhDoZ2dmzZ2vlypWaM2eOfH19nT2dOsPX11dvvfWWvvjiCx42BlAn1Lm3VSwqKlKjRo1077338j96J3n88ce1YMECHTlyRO7uF3+3KlQd3lYRqHx17kp27dq1ys/P1/Dhw509lTpr+PDhys/P19q1a509FQAwqs5FdsmSJbr22msVGRnp7KnUWR06dFCjRo20ZMkSZ08FAIyqc5FdunSp+vTpw2s1ncjFxUV9+vThLRcB1Hp1qjT79u3T1q1b1adPH2dPpc7r06ePtmzZov379zt7KgBgTJ2K7LJly+Ti4qJbb73V2VOp82699Va5uLjo008/dfZUAMCYOhXZXbt2qXnz5mrQoIGzp1LnBQQE6MYbb9QPP/zg7KkAgDF1KrK5ubkEthpp0KCBcnNznT0NADCmTkX2+PHj8vf3d/Y08DN/f38dP37c2dMAAGPqVGRPnDihevXqOXsa+Jmnp6cKCgqcPQ0AMKZORVaSbDabs6eAn/GzAFDb1bnIAgBQVYgsAACGEFkAAAwhsgAAGEJkK9mePXtks9mUnp5+wTGpqamy2WzKy8ursnnVVfw8ADgTkXWCuLg4ZWVlyc/PT5KUnJzM63ediJ8HAFPcnD2BusjDw0PBwcHOngZ+xs8DgClcyZ7nxIkTGjRokHx8fNS4cWNNmTJF8fHxeuqppySdeW3nokWLHLbx9/dXcnKyw7IdO3YoLi5Onp6eioiI0KpVq+zrzn14MjU1VYMHD1Z+fr5sNptsNpsmTJhg9iRrEH4eAGoyInuesWPHatWqVVq8eLGWL1+u1NRUbdy48Yr2M2bMGG3atEmxsbFKSEhQTk5OuXFxcXGaPn26fH19lZWVpaysLCUmJlbGqdQK/DwA1GRE9hwFBQWaM2eOXnnlFfXs2VNt27bV3LlzVVJSctn7GjFihAYMGKCwsDDNmjVLfn5+mjNnTrlxHh4e8vPzk81mU3BwsIKDg+Xj41MZp1Pj8fMAUNMR2XNkZmaqqKhIMTEx9mUBAQFq1arVZe8rNjbW/rmbm5uio6OVkZFRKfOsK/h5AKjpiOxlstlssizLYVlxcbGTZgN+HgCqMyJ7jtDQULm7u2v9+vX2Zbm5udq5c6f966CgIGVlZdm/3rVrlwoLC8vta926dfbPS0pKlJaWprCwsAqP6+HhodLS0so4hVqFnweAmo6X8JzDx8dHQ4cO1dixY9WwYUM1atRI48aNk4vLL7+L9OjRQzNmzFBsbKxKS0v17LPPyt3dvdy+Zs6cqRYtWigsLEzTpk1Tbm6uhgwZUuFxmzVrpoKCAq1YsULt27eXt7e3vL29jZ1nTcHPA0BNx5XseSZPnqyuXbsqISFBvXr1UpcuXRQVFWVfP2XKFF1//fXq2rWrHnzwQSUmJlb4P+CkpCQlJSWpffv2Wr16tVJSUhQYGFjhMePi4jR8+HDdd999CgoK0qRJk4ydX03DzwNATWazzn9Cqxbr16+fJCklJeWytouPj1dkZKSmT59uYFZ1Fz+P6uVKfx4ALowrWQAADCGyAAAYwo1PlyA1NdXZU8A5+HkAqCm4kgUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIa4OXsCqL727t2r7OxsY/vPy8uTJG3cuNHYMSQpMDBQISEhRo8BABUhsqjQ3r17FRbWSoWFp4wfKyoqyuj+vb09lZHxPaEFUOWILCqUnZ2twsJTevttqXVrZ8/myu3YIQ0ZckrZ2dlEFkCVI7K4qNatpQ4dnD0LAKiZuPEJAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFlXq8cele+4pv/zLLyUvLykvr8qnBADGEFkAAAwhsgAAGEJkAQAwxM3ZE0Dds3SpFBjouKy01DlzAQCTiCyqXPfu0muvOS775htpyBDnzAcATCGyqHLe3lJoqOOyn35yzlwAwCSekwUAwBAiCwCAIUQWAABDeE4WVerNNyte3q2bdPJk1c4FAEzjShYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADHFz9gRQve3Y4ewZXJ2aPn8ANRuRRYUCAwPl7e2pIUNOOXsqV83b21OBgYHOngaAOojIokIhISHKyPhe2dnZxo7x1FNPSZKmT59u7BjSmV8YQkJCjB4DACpCZHFBISEhRuPk7+8vSerYsaOxYwCAM3HjEwAAhhBZAAAMIbIAABhCZFGr7dmzRzabTenp6Rcck5qaKpvNpry8vCqbF4C6gciizouLi1NWVpb8/PwkScnJyfabsgDganB3Meo8Dw8PBQcHO3saAGohrmRRrZ04cUKDBg2Sj4+PGjdurClTpig+Pt7+GlubzaZFixY5bOPv76/k5GSHZTt27FBcXJw8PT0VERGhVatW2ded+3BxamqqBg8erPz8fNlsNtlsNk2YMMHsSQKotYgsqrWxY8dq1apVWrx4sZYvX67U1FRt3LjxivYzZswYbdq0SbGxsUpISFBOTk65cXFxcZo+fbp8fX2VlZWlrKwsJSYmVsapAKiDiCyqrYKCAs2ZM0evvPKKevbsqbZt22ru3LkqKSm57H2NGDFCAwYMUFhYmGbNmiU/Pz/NmTOn3DgPDw/5+fnJZrMpODhYwcHB8vHxqYzTAVAHEVlUW5mZmSoqKlJMTIx9WUBAgFq1anXZ+4qNjbV/7ubmpujoaGVkZFTKPAHgQogsajSbzSbLshyWFRcXO2k2AOCIyKLaCg0Nlbu7u9avX29flpubq507d9q/DgoKUlZWlv3rXbt2qbCwsNy+1q1bZ/+8pKREaWlpCgsLq/C4Hh4eKi0trYxTAFDH8RIeVFs+Pj4aOnSoxo4dq4YNG6pRo0YaN26cXFx++d2wR48emjFjhmJjY1VaWqpnn31W7u7u5fY1c+ZMtWjRQmFhYZo2bZpyc3M1ZMiQCo/brFkzFRQUaMWKFWrfvr28vb3l7e1t7DwB1F5cyaJamzx5srp27aqEhAT16tVLXbp0UVRUlH39lClTdP3116tr16568MEHlZiYWGEQk5KSlJSUpPbt22v16tVKSUm54N+YjYuL0/Dhw3XfffcpKChIkyZNMnZ+AGo3m3X+E1q1WL9+/SRJKSkpTp4JpCv/ecTHxysyMtL436Gta/jvA6h8XMkCAGAIkQUAwBBufEKNk5qa6uwpAMAl4UoWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmThVGVlZc6eAn7GzwKofEQWTnPNNdeoqKjI2dPAz06fPi0fHx9nTwOoVYgsnKZ+/frKy8tz9jTws7y8PNWvX9/Z0wBqFSILp2nQoIFyc3OdPQ38LDc3Vw0aNHD2NIBahcjCaVq0aKEff/yR0FYDR48e1e7du3XTTTc5eypArUJk4TS33367ysrK9Nlnnzl7KnXeZ599prKyMt1+++3OngpQqxBZOE3Tpk0VERGhpUuXOnsqdd7SpUvVtm1bNW3a1NlTAWoVIgun6tOnj5YuXcrLR5yorKxMS5cuVZ8+fZw9FaDWIbJwqr59++rQoUNKT0939lTqrE2bNunw4cPq27evs6cC1DpEFk7VuXNn+fn56fXXX3f2VOqs119/XX5+foqLi3P2VIBah8jCqdzd3fX3v/9db775pj7//HNnT6fO+eyzz/TWW28pKSlJ7u7uzp4OUOvYLMuynD2JqtKvXz9JUkpKipNngnOVlZWpV69eyszM1JYtW+Tr6+vsKdUJx44dU0REhFq0aKHPPvtMLi78zg1UNv6rgtO5uLhozpw5ysnJ0TPPPOPs6dQZY8eOVW5urubMmUNgAUP4LwvVwo033qjJkydr9uzZWrJkibOnU+stWbJEb7zxhiZPnqxmzZo5ezpArUVkUW38/ve/V9++fXXnnXcqOTnZ2dOptf7973/rzjvvVN++fTVs2DBnTweo1Ygsqg0XFxctXLhQjzzyiAYPHqyxY8eqtLTU2dOqNUpLSzV27FgNGTJEjz76qBYuXMjDxIBhbs6eAHAuDw8PvfHGGwoPD9eYMWO0Y8cOvfvuu9wMdZWOHTumhx56SEuWLNH06dM1atQo2Ww2Z08LqPX4NRbVjs1m01NPPaWPP/5YX375pTp37qy1a9c6e1oO9u3bJ09PT61Zs+ayt92+fbvc3Ny0detWAzMrb+3atYqLi9OXX36pTz75RKNHjyawQBUhsqi2+vTpo6+//lo2m02dO3dW7969jcXWZrP96seECRPs41966SXFxMSoc+fODvv56aefdO+998rf31++vr7q37+/fvzxR4cxbdq00W9/+1v95S9/MXIuZ61du1a9e/dW586d5eLionXr1vEHAIAqxsPFqNbatGmj9PR0ffjhh3rxxRfVuXNn3XbbbRo/fnylvkPRO++8c8F1EyZMUGZmpmJiYiRJR44c0dy5czV37lxZlqVSnXne+GTBSd1yyy3Kz8/Xn//8Z7m7u2vatGnq3r270tPT1bBhQ/s+hw8frr59+yozM1OhoaGVdh7Smbi++OKLWr58ucLDw/X+++9rwIABPP8KOINVhyQkJFgJCQnOngauUGlpqfX+++9b4eHhliTrtttusxYuXGgVFBQYO+abb75pSbJGjhxpXzZ16lTLy8vL+jH3R2vnqZ3WjlM7rB2ndlhj/zbWkmStXb/WPjYjI8NydXW1/vSnPznst6ioyGrQoIH1wgsvVMo8CwoKrIULF1q33XabJckKDw+33n//fau0tLRS9g/gyvCOT6hxysrK9OGHH+pvf/ubvvvuO9WrV089evRQQkKC7rjjDl1//fWVcpxt27bp5ptvVuvWrfX111+rXr16kqSu3buqWMWau3yuw/h7utwjSfpw9Ydq6t5UXi5ekqTevXsrMzNTP/zwg8P4u+66S5mZmfruu++uaH779u3Txx9/rI8++khffPGFTp8+rfbt22vcuHFcuQLVBP8VosZxcXHRPffco/T0dO3cuVMvv/yyTp48qZEjRyokJEQdOnTQCy+8oPXr16uoqOiKjlFYWKh7771Xrq6umj9/vj2whUWF+nbDtwrrEOYwvqysTN9v+V4RHSNUpjLtL96vYqtYktSpUydlZmbq+PHjDttERUVp69atOnbs2CXNqaioSOvXr9cL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SiRJr732mgYPHiwXl1/+sy8sLNTtt9+uP//5z5e97w0bNmj27Nlq165duXWXs99nnnlG1113Xbnla9euVbt27fThhx9q8+bNGjx4sAYNGqSPP/7Y4TjNmzdXUlKSgoODK9x/06ZNlZSUpLS0NH377bfq0aOH+vfvr23btjmMe/zxx5WVlWX/OD9KU6dO1bhx4/Tcc8/p/ffflyR7bC91vgEBARo3bpy+/vpr+5jBgwdr2bJl9jHnziErK0tvv/22bDabBgwYYB9zyy236P3339f333+vDz/8UJmZmbr77rvt648dO6bbbrtNN9xwg9LS0jR58mRNmDBBb7zxhn3M888/r9mzZ+uf//yntm/fruHDh+t3v/udNm3a5HDe4eHhDvNZvXq1w/pL+VkPHjxY7777ro4ePXrBMbWWVYckJCRYCQkJzp4Gaonc3FxLkhUbG3vBf1e5ubnWsGHDrEaNGln16tWzwsPDrY8++siyLMvKzs627r//fuu6666zvLy8rIiICOu9995z2L579+7W6NGj7V//3//9nxUVFWX5+PhY1157rfXAAw9Yhw4dsq9fuXKlJclasmSJ1bFjR8vd3d1auXKldfjwYctms1lbt26tcJ5nt8vNzb2kcz9+/LjVokUL67PPPis3x4vtNy0tzZJkpaWlWZZlWUuWLLFat25tbdu2zZJkbdq06aLH7du3rzV48OAK191www3WtGnTLmn+DRo0sN566y371xc7B8uyrKNHj1peXl7W559/XuF5XMl8z+rQoYP1/PPPX3B9//79rR49elx0H4sXL7ZsNptVVFRkWZZl/etf/7IaNGhgnT592j7m2WeftVq1amX/unHjxtaMGTMc9nPXXXdZDz30kP3r8ePHW+3bt7/osc/6tX9DN954o8P3vK7gSha4Qj4+PvLx8dHBgwdVWlpabn1ZWZn69OmjNWvWaN68edq+fbuSkpLk6uoqSTp16pSioqL0ySefaOvWrRo2bJgefvhhffPNNxc8ZnFxsSZOnKjvvvtOixYt0p49e/Too4+WG/fcc88pKSlJGRkZateunVavXi1vb2+FhYVVyrn/4Q9/0G9/+1v16tXrivdx6NAhPf7443rnnXfk7e19Sdvk5+crICDgio9ZWlqq+fPn68SJEw5XoZL07rvvKjAwUBEREfrTn/6kwsJC+7rPPvtMZWVl+umnnxQWFqY+ffpIkg4ePHjF87UsSytWrND333+vbt26VTjm0KFD+uSTTzR06NALHuPo0aN69913FRcXJ3d3d0nS119/rW7dusnDw8M+rnfv3vr++++Vm5sr6czD9J6eng778vLyKnelumvXLl133XVq3ry5HnroIe3du/ei53whnTp10ldffXVF29Zozq58VeJKFpXtgw8+sNzd3S0XFxcrLi7O+tOf/mR99913lmVZ1rJlyywXFxfr+++/v+T9/fa3v7XGjBlj//rXrrA2bNhgSbKOHz9uWdYvVxOLFi1yGDdt2jSrefPmF9zP5VzJ/r//9/+siIgI6+TJk786xwtdyX777bfW7bffbk2cONGyLMvavXv3r17J/uc//7E8PDwueDV+sSvZzZs3W9dcc43l6upq+fn5WZ988onD+tmzZ1uffvqptXnzZmvevHlWkyZNrN/97nf29X//+98td3d3q1WrVtann35qJScnW5KsG264weFq8VLmm5eXZ11zzTWWm5ubVa9ePWvOnDkXPOd//OMfVoMGDezf63M988wzlre3tyXJ+s1vfmNlZ2fb1916663WsGHDHMaffbRg+/btlmVZ1gMPPGC1adPG2rlzp1VaWmotX77c8vLysjw8POzbLFmyxHr//fet7777zvr000+t2NhYKyQkxDp27Fi5+fzav6Gnn37aio+Pv+C51lZcyQJXYcCAAbr11lvVqVMn3X777UpNTVXHjh2VnJys9PR0NW3aVC1btqxw29LSUk2cOFFt27ZVQECAfHx8tGzZsoteKaSlpSkhIUEhISGqX7++unfvLknltomOjnb4+uTJk+WuWq7Evn37NHr0aL377rtXtb/58+fr+PHj+tOf/nRJ41euXKnBgwfrzTffVHh4+GUfr1WrVkpPT9f69ev1xBNP6JFHHtH27dvt64cNG6bevXurbdu2euihh/R///d/WrhwoTIzMyWdeVSiuLhYr732mn2cdOb7sXLlysuab/369ZWenq4NGzbob3/7m/74xz8qNTW1wnm//fbbeuihhyr8Xo8dO1abNm3S8uXL5erqqkGDBsmyrEv+nrz66qtq0aKFWrduLQ8PD40YMaLcc/Z9+vTRPffco3bt2ql3795asmSJ8vLy7M9JXw4vLy+HRwfqCiILXCVXV1cFBQXphRde0Nq1a/Xoo49q/Pjx8vLyuuh2kydP1quvvqpnn31WK1euVHp6unr37q2ioqIKx584cUK9e/eWr6+v3n33XW3YsEELFy6UpHLbXHPNNQ5fBwYG2h8mvBppaWk6fPiwOnbsKDc3N7m5uWnVqlV67bXX5ObmVuHD5hXZsGGDvv76a9WrV09ubm666aabJJ355eCRRx5xGLtq1SolJCRo2rRpGjRo0BXN28PDQzfddJOioqL097//Xe3bt9err756wfExMTGSpB9++EGS1LhxY0lSmzZtHMb5+/uX+wXn1+br4uKim266SZGRkRozZozuvvtu/f3vfy837quvvtL333+vxx57rMI5BgYGqmXLlrr11ls1f/58LVmyROvWrZMkBQcH69ChQw7jz3599gaxoKAgLVq0SCdOnND//vc/7dixQz4+PmrevPkFvy/+/v5q2bKl/ftyOY4ePaqgoKDL3q6mI7JAJWvTpo1OnDihdu3aaf/+/dq5c2eF49asWaP+/ftr4MCBat++vZo3b37BsZK0Y8cO5eTkKCkpSV27dlXr1q11+PDhS5pThw4ddPDgwasObc+ePbVlyxalp6fbP6Kjo/XQQw8pPT3d/nzzrxk7dqy+++47+z6WLFkiSfrPf/6jv/3tb/Zxqamp+u1vf6t//OMfGjZs2FXN/VxlZWU6ffr0BdeffSnR2bh27txZkvT99987jMvLy9MNN9xwVfO90FzmzJmjqKgotW/f/pL2Icm+n9jYWH355ZcqLi62j/nss8/UqlUrNWjQwGFbT09PNWnSRCUlJfrwww/Vv3//Cx6noKBAmZmZ9u/L5di6das6dOhw2dvVdG7OngBQU+Xk5Oiee+5RXl6efH19tXv3bn377beaNGmS+vfvr+7du6tbt24aMGCApk6dqptuukk7duyQzWbT7bffrhYtWuiDDz7Q2rVr1aBBA02dOlWHDh0qd7V0VkhIiDw8PPTPf/5Tw4cP19atWzVx4sRLmmuHDh0UGBioNWvW6I477rAvP3jwoA4ePGi/MtmyZYvq16+vkJAQ+w07PXv21O9+9zuNGDFC9evXV0REhMO+r7nmGjVs2NBh+YX2m5+fL+lMvM4d7+PjI0kKDQ1V06ZNJZ15yPWOO+7Q6NGjNWDAAPtNRh4eHva5FRUV2R/2LSoq0k8//aT09HT5+PjYr47/9Kc/qU+fPgoJCdHx48f13nvvKTU11f6ymczMTL333nvq27evGjZsqM2bN+vpp59Wt27d7C9Patmypfr376/Ro0frjTfesL+xQrNmzXTLLbdc8nz//ve/Kzo6WqGhoTp9+rSWLFmid955R7NmzXL4nh47dkwLFizQlClTyv0s169frw0bNqhLly5q0KCBMjMz9cILLyg0NNR+M9eDDz6oF198UUOHDtWzzz6rrVu36tVXX9W0adMc9vPTTz8pMjJSP/30kyZMmKCysjI988wz9jGJiYlKSEjQDTfcoAMHDmj8+PFydXXVAw88cFn/hgoLC5WWlqaXX3653PnUes5+UrgqceMTKtOpU6es5557zvLz87Pc3Nwsb29vq1WrVtbzzz9vFRYWWpZlWTk5OdbgwYOthg0bWp6enlZERIT18ccf29f179/f8vHxsRo1amQ9//zz1qBBg6z+/fvbj3H+TUXvvfee1axZM6tevXpWbGyslZKS4nDD0MVuPnnmmWes+++/32HZ+PHjLUnlPv7973/bx9xwww3W+PHjL/h9qOjGpwvt9+zy81/6UtGNT4888kiF++jevXu57S42ZsiQIdYNN9xgeXh4WEFBQVbPnj2t5cuX29fv3bvX6tatmxUQEGDVq1fPuummm6yxY8da+fn5DnPMz8+3hgwZYvn7+1t+fn6WJIcbqC5lvuPGjbNuuukmy9PT02rQoIEVGxtrzZ8/v9z3dPbs2ZaXl5eVl5dXbt3mzZutW265xT7fZs2aWcOHD7f279/vMO67776zunTpYtWrV89q0qSJlZSU5LA+NTXVCgsLs+rVq2c1bNjQevjhh62ffvrJYcx9991nNW7c2PLw8LCaNGli3XfffdYPP/zgMOZS/g299957Di8fqktslnUZz5TXcP369ZN05p1vgMpSU/5dHTx4UOHh4dq4caPDQ5xVaePGjYqKilJaWpo6duzolDlUhtpyHlXlN7/5jUaNGqUHH3zQ2VOpcjwnC9QRwcHBmjNnzhW/zhG4EtnZ2brrrrscHmKuS3hOFqhD7rzzTmdPAXVMYGCgw/O8dQ1XsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAM4Y+2A6hyGRkZzp7CVanp80fVIbIAqkxgYKC8vb01cOBAZ0/lqnl7eyswMNDZ00A1R2QBVJmQkBBlZGQoOzvb2VO5aoGBgQoJCXH2NFDNEVkAVSokJIQ4oc7gxicAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILHAB+/btk6enp9asWVOlx3399dcVEhKi06dPV+lxAVQ+Ios6w2az/erHhAkT7ONfeuklxcTEqHPnzpVy/P/85z8aOHCgWrRoIZvNpvj4+ArHPfrooyoqKtLs2bMr5bgAnMfN2RMAqso777xzwXUTJkxQZmamYmJiJElHjhzR3LlzNXfu3Ivu07Is1fevb//cZrNdcOysWbOUlpamm2++WTk5ORcc5+npqUceeURTp07VyJEjL7pPANUbkUWdMXDgwAqXv/XWW8rMzNTIkSPVp08fSdK8efPk5uamhISECrcptoqVV5qnvNI8/eXNv0iSfij6Qf6u/vJ39Ze7zb3cNu+8846aNGkiFxcXRUREXHSu9957ryZNmqSVK1eqR48el3OaAKoRHi5GnbZt2zaNGjVKHTp00OTJk+3LFy1apJiYGPn4+JTb5mTZSe0p2qOjpUdVpjJJ0pa0LRp8x2C1DG6p+t711ezGZhoyZIjDdtdff71cXC7tP7moqCgFBARo8eLFV3F2AJyNK1nUWYWFhbr33nvl6uqq+fPnq169epKk4uJibdiwQU888US5bYqtYu0v3m+PqyTlHM7RY3c8pgaBDfR44uPy9fPVgf8d0MqUlVc1v44dO1b5TVcAKheRRZ01cuRIbd++XXPnzlXLli3ty/fu3auTJ0/qxhtvLLdNXmmeQ2AladO6TcrPzddbH7+ltlFt7ctf/OuLVzW/5s2bX/R5ZADVHw8Xo05677339Pbbb+vhhx/WoEGDHNadvSmpQYMGDssty1JeaV65fdX3O3PjU+qSVBUXF9uX55XmybKsK55jgwYNdPLkSRUWFl7xPgA4F5FFnbNr1y4NHz5cLVu21L/+9a8Ljjs/kPkF+Tp08JCOHDyiIweP6OiRo5KkTt066bbf3aaZf5up2CaxevLuJ/Xh3A916vQplar0iud59vjcXQzUXEQWdcrp06d13333qaioSPPnz6/wxqaGDRtKknJzcx2WT31lqro262r/uLvz3ZLORPC1//ea5q+ar4eGP6RDBw5p3O/HaUDsABUUFFzxXHNzc+Xt7S0vL68r3gcA5+I5WdQpiYmJ2rRpk1599VV16NChwjEhISHy8vLS7t27HZY/MugRNY9pLktnrjA9vTwd1kfGRCoyJlJPv/S0Ppr/kcY+OlYL5i/Q448/fkVz3b17t8LCwq5oWwDVA5FFnbFw4ULNmDFD/fr106hRoy44zt3dXdHR0fr2228dloeGhsr3Bl8dLT3qsDw/N1++/r4OD+uGtT8Tx6Kioiue78aNG/XQQw9d8fYAnI/Iok7IysrS0KFD5erqqp49e2revHkVjgsNDVVsbKz69++vcePG6dixY/L19bWv93f1L3eH8aJ5i/Te7Pd0a/9bdf2N1+tEwQkteHuBfH191bdvX/u4L7/8Ul9++aWkM+8odeLECf31r3+VJHXr1k3dunWzj01LS9PRo0fVv3//Sv0+AKhaRBZ1wvfff29/jnX06NEXHPfII48oNjZWDz/8sJ577jmlpKQ4vFOUu81dTd2bOrxW9uauN2vzhs1a8v4SZR/OVn2/+up0cydNfG+iw8uAvvjiC734ouPLel544QVJ0vjx4x0iu2DBAoWEhPBuT0ANZ7Ou5jUGNUy/fv0kSSkpKU6eCWqCoUOHaufOnfrqq6/KrTv3bRXPxtZFLhd9W8VLdfr0aTVr1kzPPffcRX8hAFD9cSULXMD48ePVsmVLrVmzptxf4nG3uSvILUiBroEa+MiZK915c+dVystt/v3vf8vd3V3Dhw+/6n0BcC4iC1xASEiITp06ddExNptNx/OO2z+vDMOHDyewQC3B62QBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyQA2wZ88e2Ww2paenX3BMamqqbDab8vLyqmxeAC6OyAK1RFxcnLKysuTn5ydJSk5Olr+/v3MnBdRxbs6eAIDK4eHhoeDgYGdPA8A5uJIFqsCJEyc0aNAg+fj4qHHjxpoyZYri4+P11FNPSZJsNpsWLVrksI2/v7+Sk5Mdlu3YsUNxcXHy9PRURESEVq1aZV937sPFqampGjx4sPLz82Wz2WSz2TRhwgSzJwmgHCILVIGxY8dq1apVWrx4sZYvX67U1FRt3LjxivYzZswYbdq0SbGxsUpISFBOTk65cXFxcZo+fbp8fX2VlZWlrKwsJSYmVsapALgMRBYwrKCgQHPmzNErr7yinj17qm3btpo7d65KSkoue18jRozQgAEDFBYWplmzZsnPz09z5swpN87Dw0N+fn6y2WwKDg5WcHCwfHx8KuN0AFwGIgsYlpmZqaKiIsXExNiXBQQEqFWrVpe9r9jYWPvnbm5uio6OVkZGRqXME0DlI7JANWCz2WRZlsOy4uJiJ80GQGUhsoBhoaGhcnd31/r16+3LcnNztXPnTvvXQUFBysrKsn+9a9cuFRYWltvXunXr7J+XlJQoLS1NYWFhFR7Xw8NDpaWllXEKAK4QL+EBDPPx8dHQoUM1duxYNWzYUI0aNdK4cePk4vLL77g9evTQjBkzFBsbq9LSUj377LNyd3cvt6+ZM2eqRYsWCgsL07Rp05Sbm6shQ4ZUeNxmzZqpoKBAK1asUPv27eXt7S1vb29j5wmgPK5kgSowefJkde3aVQkJCerVq5e6dOmiqKgo+/opU6bo+uuvV9euXfXggw8qMTGxwiAmJSUpKSlJ7du31+rVq5WSkqLAwMAKjxkXF6fhw4frvvvuU1BQkCZNmmTs/ABUzGad/0RQLdavXz9JUkpKipNngtrkSv9dxcfHKzIyUtOnTzcwKwDVAVeyAAAYQmQBADCEG58AJ0lNTXX2FAAYxpUsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgSK2I7L59++Tp6ak1a9ZU6XGfe+45xcTEVOkxAQA1R7WMrM1m+9WPCRMm2Me/9NJLiomJUefOnSttDikpKerYsaM8PT0VEhKi8ePHq6SkxGHMU089pe+++04pKSmVdlwAQO3h5uwJVOSdd9654LoJEyYoMzPTfgV55MgRzZ07V3Pnzr3oPi3LUn3/+vbPbTbbBccuXbpUd955p+Lj4/XPf/5TW7Zs0V//+lcdPnxYs2bNso8LDg5W//799corr6hfv36Xc4oAgDqgWkZ24MCBFS5/6623lJmZqZEjR6pPnz6SpHnz5snNzU0JCQkVblNsFSuvNE95pXn6y5t/kST9UPSD/F395e/qL3ebe7ltEhMT1a5dOy1fvlxubme+Rb6+vnr55Zc1evRotW7d2j723nvv1T333KMff/xRzZs3v6rzBgDULtXy4eKKbNu2TaNGjVKHDh00efJk+/JFixYpJiZGPj4+5bY5WXZSe4r26GjpUZWpTJK0JW2LBt8xWC2DW6q+d301u7GZhgwZYt9m+/bt2r59u4YNG2YPrCQ9+eSTsixLH3zwgcMxevXqJUlavHhxpZ4vAKDmqxGRLSws1L333itXV1fNnz9f9erVkyQVFxdrw4YN6tixY7ltiq1i7S/eb4+rJOUcztFjdzymn/73kx5PfFzPT31efe/rq6/XfW0fs2nTJklSdHS0w/6uu+46NW3a1L7+LD8/P4WGhlb5TVcAgOqvWj5cfL6RI0dq+/btmjt3rlq2bGlfvnfvXp08eVI33nhjuW3ySvMcAitJm9ZtUn5uvt76+C21jWprX/7iX1+0f56VlSVJaty4cbl9Nm7cWAcOHCi3vHnz5tq+ffvlnxgAoFar9ley7733nt5++209/PDDGjRokMO6nJwcSVKDBg0clluWpbzSvHL7qu935san1CWpKi4uti/PK82TZVmSpJMnT0qS/Wr5XJ6envb152rQoIGys7Mv46wAAHVBtY7srl27NHz4cLVs2VL/+te/LjjubCDPyi/I16GDh3Tk4BEdOXhER48clSR16tZJt/3uNs3820zFNonVk3c/qQ/nfqhTp0+pVKWSJC8vL0nS6dOnyx3n1KlT9vXnH/9idysDAOqmahvZ06dP67777lNRUZHmz59f4Y1NDRs2lCTl5uY6LJ/6ylR1bdbV/nF357slnXn97Wv/7zXNXzVfDw1/SIcOHNK434/TgNgBKigokPTLw8RnHzY+V1ZWlq677rpyy3NzcxUYGHh1JwwAqHWq7XOyiYmJ2rRpk1599VV16NChwjEhISHy8vLS7t27HZY/MugRNY9pLktnrnA9vTwd1kfGRCoyJlJPv/S0Ppr/kcY+OlYL5i/Q448/rsjISEnSt99+q06dOtm3OXDggPbv369hw4aVm8fu3bvVvn37qzldAEAtVC0ju3DhQs2YMUP9+vXTqFGjLjjO3d1d0dHR+vbbbx2Wh4aGyvcGXx0tPeqwPD83X77+vg4P7Ya1D5MkFRUVSZLCw8PVunVrvfHGG/r9738vV1dXSdKsWbNks9l09913O+4zP1+ZmZl64oknrvyEAQC1UrWLbFZWloYOHSpXV1f17NlT8+bNq3BcaGioYmNj1b9/f40bN07Hjh2Tr6+vfb2/q3+5O4wXzVuk92a/p1v736rrb7xeJwpOaMHbC+Tr66u+ffvax02ePFn9+vXTbbfdpvvvv19bt27VjBkz9NhjjyksLMxhHp9//rksy1L//v0r+TsBAKjpbNb5dw05WWpqqm655ZZfHffII48oOTlZhw8fVpMmTfTvf/+73DtFnSw76fBa2e3p2zVn6hxt+nqTsg9nq75ffXW6uZMmvjhRUVFRDtsuWrRIL774ojIyMhQUFKRHH31Uf/nLX+Tu7vgOUffff79++uknffXVV1d55qipzr6lJu9hDeB81S6yV2Lo0KHauXNnhaE7920Vz8bWRS4XfVvFS3Xw4EHdeOONmj9/PleydRiRBXAh1e7h4isxfvx4tWzZUmvWrCn3l3jcbe4KcgtSoGugBj5y5kp33tx5lfKSm+nTp6tt27YEFgBQoVoR2ZCQEJ06deqiY2w2m47nHbd/XhmSkpIqZT8AgNqp2r5OFgCAmo7IAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbKVbM+ePbLZbEpPT7/gmNTUVNlsNuXl5VXZvAAAVY/IOkFcXJyysrLk5+cnSUpOTpa/v79zJwUAqHRuzp5AXeTh4aHg4GBnTwMAYBhXsuc5ceKEBg0aJB8fHzVu3FhTpkxRfHy8nnrqKUmSzWbTokWLHLbx9/dXcnKyw7IdO3YoLi5Onp6eioiI0KpVq+zrzn24ODU1VYMHD1Z+fr5sNptsNpsmTJhg9iQBAFWCyJ5n7NixWrVqlRYvXqzly5crNTVVGzduvKL9jBkzRps2bVJsbKwSEhKUk5NTblxcXJymT58uX19fZWVlKSsrS4mJiZVxKgAAJyOy5ygoKNCcOXP0yiuvqGfPnmrbtq3mzp2rkpKSy97XiBEjNGDAAIWFhWnWrFny8/PTnDlzyo3z8PCQn5+fbDabgoODFRwcLB8fn8o4HQCAkxHZc2RmZqqoqEgxMTH2ZQEBAWrVqtVl7ys2Ntb+uZubm6Kjo5WRkVEp8wQA1AxE9jLZbDZZluWwrLi42EmzAQBUZ0T2HKGhoXJ3d9f69evty3Jzc7Vz507710FBQcrKyrJ/vWvXLhUWFpbb17p16+yfl5SUKC0tTWFhYRUe18PDQ6WlpZVxCgCAaoSX8JzDx8dHQ4cO1dixY9WwYUM1atRI48aNk4vLL7+L9OjRQzNmzFBsbKxKS0v17LPPyt3dvdy+Zs6cqRYtWigsLEzTpk1Tbm6uhgwZUuFxmzVrpoKCAq1YsULt27eXt7e3vL29jZ0nAKBqcCV7nsmTJ6tr165KSEhQr1691KVLF0VFRdnXT5kyRddff726du2qBx98UImJiRUGMSkpSUlJSWrfvr1Wr16tlJQUBQYGVnjMuLg4DR8+XPfdd5+CgoI0adIkY+cHAKg6Nuv8JxhrsX79+kmSUlJSLmu7+Ph4RUZGavr06QZmhZruSv9dAaj9uJIFAMAQIgsAgCHc+HQJUlNTnT0FAEANxJUsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwxM3ZEwBM27t3r7Kzs43tPy8vT5K0ceNGY8eQpMDAQIWEhBg9BoDKRWRRq+3du1dhYa1UWHjK+LGioqKM7t/b21MZGd8TWqAGIbKo1bKzs1VYeEpvvy21bu3s2Vy5HTukIUNOKTs7m8gCNQiRRZ3QurXUoYOzZwGgruHGJwAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFngCjz+uHTPPeWXf/ml5OUl5eVV+ZQAVENEFgAAQ4gsAACGEFkAAAxxc/YEgJpq6VIpMNBxWWmpc+YCoHoissAV6t5deu01x2XffCMNGeKc+QCofogscIW8vaXQUMdlP/3knLkAqJ54ThYAAEOILAAAhhBZAAAM4TlZ4Aq8+WbFy7t1k06erNq5AKi+uJIFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEPcnD0BoCrs2OHsGVydmj5/oK4isqjVAgMD5e3tqSFDTjl7KlfN29tTgYGBzp4GgMtAZFGrhYSEKCPje2VnZxs7xlNPPSVJmj59urFjSGd+YQgJCTF6DACVi8ii1gsJCTEaJ39/f0lSx44djR0DQM3EjU8AABhCZAEAMITIAgBgCJEFaoA9e/bIZrMpPT39gmNSU1Nls9mUl5dXZfMCcHFEFqgl4uLilJWVJT8/P0lScnKy/aYsAM7B3cVALeHh4aHg4GBnTwPAObiSBarAiRMnNGjQIPn4+Khx48aaMmWK4uPj7a+xtdlsWrRokcM2/v7+Sk5Odli2Y8cOxcXFydPTUxEREVq1apV93bkPF6empmrw4MHKz8+XzWaTzWbThAkTzJ4kgHKILFAFxo4dq1WrVmnx4sVavny5UlNTtXHjxivaz5gxY7Rp0ybFxsYqISFBOTk55cbFxcVp+vTp8vX1VVZWlrKyspSYmFgZpwLgMhBZwLCCggLNmTNHr7zyinr27Km2bdtq7ty5Kikpuex9jRgxQgMGDFBYWJhmzZolPz8/zZkzp9w4Dw8P+fn5yWazKTg4WMHBwfLx8amM0wFwGYgsYFhmZqaKiooUExNjXxYQEKBWrVpd9r5iY2Ptn7u5uSk6OloZGRmVMk8AlY/IAtWAzWaTZVkOy4qLi500GwCVhcgChoWGhsrd3V3r16+3L8vNzdXOnTvtXwcFBSkrK8v+9a5du1RYWFhuX+vWrbN/XlJSorS0NIWFhVV4XA8PD5WWllbGKQC4QryEBzDMx8dHQ4cO1dixY9WwYUM1atRI48aNk4vLL7/j9ujRQzNmzFBsbKxKS0v17LPPyt3dvdy+Zs6cqRYtWigsLEzTpk1Tbm6uhgwZUuFxmzVrpoKCAq1YsULt27eXt7e3vL29jZ0ngPK4kgWqwOTJk9W1a1clJCSoV69e6tKli6Kiouzrp0yZouuvv15du3bVgw8+qMTExAqDmJSUpKSkJLVv316rV69WSkrKBf/GbFxcnIYPH6777rtPQUFBmjRpkrHzA1Axm3X+E0G1WL9+/SRJKSkpTp4JapMr/XcVHx+vyMhI43+HFoDzcCULAIAhRBYAAEO48QlwktTUVGdPAYBhXMkCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABD3Jw9gXPt3btX2dnZxvafl5cnSdq4caOxY0hSYGCgQkJCjB4DAFD9VZvI7t27V2FhrVRYeMr4saKioozu39vbUxkZ3xNaAKjjqk1ks7OzVVh4Sm+/LbVu7ezZXLkdO6QhQ04pOzubyAJAHVdtIntW69ZShw7OngUAAFePG58AADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGFLrI/v449I995Rf/uWXkpeXlJdX5VMCANQRtT6yAAA4C5EFAMAQIgsAgCFuzp5AVVi6VAoMdFxWWuqcuQAA6o46Ednu3aXXXnNc9s030pAhzpkPAKBuqBOR9faWQkMdl/30k3PmAgCoO3hOFgAAQ4gsAACGEFkAAAyp9c/Jvvlmxcu7dZNOnqzauQAA6hauZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAEDdnT+B8O3Y4ewZXp6bPHwBQeapNZAMDA+Xt7akhQ045eypXzdvbU4GBgc6eBgDAyapNZENCQpSR8b2ys7ONHeOpp56SJE2fPt3YMaQzvzCEhIQYPQYAoPqrNpGVzoTWZJz8/f0lSR07djR2DAAAzuLGJwAADCGyAAAYQmQBADCEyFayPXv2yGazKT09/YJjUlNTZbPZlJeXV2XzAgBUPSLrBHFxccrKypKfn58kKTk52X5TFgCg9qhWdxfXFR4eHgoODnb2NAAAhnEle54TJ05o0KBB8vHxUePGjTVlyhTFx8fbX2Nrs9m0aNEih238/f2VnJzssGzHjh2Ki4uTp6enIiIitGrVKvu6cx8uTk1N1eDBg5Wfny+bzSabzaYJEyaYPUkAQJUgsucZO3asVq1apcWLF2v58uVKTU3Vxo0br2g/Y8aM0aZNmxQbG6uEhATl5OSUGxcXF6fp06fL19dXWVlZysrKUmJiYmWcCgDAyYjsOQoKCjRnzhy98sor6tmzp9q2bau5c+eqpKTksvc1YsQIDRgwQGFhYZo1a5b8/Pw0Z86ccuM8PDzk5+cnm82m4OBgBQcHy8fHpzJOBwDgZET2HJmZmSoqKlJMTIx9WUBAgFq1anXZ+4qNjbV/7ubmpujoaGVkZFTKPAEANQORvUw2m02WZTksKy4udtJsAADVGZE9R2hoqNzd3bV+/Xr7stzcXO3cudP+dVBQkLKysuxf79q1S4WFheX2tW7dOvvnJSUlSktLU1hYWIXH9fDwUGlpaWWcAgCgGuElPOfw8fHR0KFDNXbsWDVs2FCNGjXSuHHj5OLyy+8iPXr00IwZMxQbG6vS0lI9++yzcnd3L7evmTNnqkWLFgoLC9O0adOUm5urIUOGVHjcZs2aqaCgQCtWrFD79u3l7e0tb29vY+cJAKgaXMmeZ/LkyeratasSEhLUq1cvdenSRVFRUfb1U6ZM0fXXX6+uXbvqwQcfVGJiYoVBTEpKUlJSktq3b6/Vq1crJSXlgn9jNi4uTsOHD9d9992noKAgTZo0ydj5AQCqjs06/wnGWqxfv36SpJSUlMvaLj4+XpGRkcb/Di1qpiv9dwWg9uNKFgAAQ4gsAACGcOPTJUhNTXX2FAAANRBXsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCE1PrL79u2Tp6en1qxZU+XHfv311xUSEqLTp09X+bEBANVftYvswIED5enpqZ07d5Zbl5SUJJvNpo8//ti+7KWXXlJMTIw6d+7sMPann37SvffeK39/f/n6+qp///46ceLEJc9j7dq16tKli7y9vRUcHKxRo0apoKDAYcyjjz6qoqIizZ49+zLPEgBQF1S7yE6dOlXe3t4aPny4w/Ldu3frpZde0oABA3THHXdIko4cOaK5c+eWG1tQUKBbbrlFq1at0p///Ge9+OKL2rRpk9Z9/bU8bTZZZWUXnUN6erp69uypwsJCTZ06VY899pjeeOMN3XPPPQ7jPD099cgjj2jq1KmyLKsSzh4AUKtY1dAbb7xhSbKSk5Pty26//XbL19fX2r9/v33Z1KlTLS8vL+v48eMO2//jH/+wJFnffPONVXLihHVs0yZr9fTplquLizWqXz/r0IIF1rFNm6ySEycqPH6fPn2sxo0bW/n5+fZlb775piXJWrZsmcPYb7/91pJkrVixojJOHTVQQkKClZCQ4OxpAKiGqt2VrCQ99thj6ty5sxITE5WTk6P58+fr008/1V//+lc1adLEPm7RokWKiYmRj4+Pw/YffPCBbr75ZkXeeKNyPvlEhRkZuikoSF3Dw5Wyfr2soiIVZmQo55NPVJyT47DtsWPH9Nlnn2ngwIHy9fW1Lx80aJB8fHz0/vvvO4yPiopSQECAFi9ebOA7AQCoyaplZG02m2bPnq38/Hw98cQTevrppxUdHa0//OEP9jHFxcXasGGDOnbs6LBtWVmZNm/erKjISOWuXCmruFj6+aHcDqGh2nPokApOnpQsS1ZJiXK/+EKlhYX27bds2aKSkhJFR0c77NfDw0ORkZHatGlTufl27NjRKTdeAQCqt2oZWUkKDw9XYmKiFixYoCNHjmj27Nlycfllunv37tXJkyd14403Omx39OhRnT59Wg3d3GSVlDisa+TvL0k6mJt7ZsHPoT25a5d9TFZWliSpcePG5ebUuHFjHThwoNzy5s2ba/v27Vd0ngCA2qvaRlaSAgMDJUnXXXedIiIiHNbl/Pwwb4MGDRyWnzx5UpLkcvy4/Qr2rHru7pKkU0VFvyy0LBXu2mW/Gers9vXq1Ss3H09PT/v6czVo0EAnT55U4TlXxAAAVNvI7tu3T+PHj1dERIT27dunSZMmVTjOOi+kXl5ekqTTp06VG3u6uFiS5Onh4biPoiKV/fxaV/v2Fbz29dSpU/b1Fc3BZrNd9JwAAHVLtY3siBEjJElLly7VPffco7/97W/68ccf7esbNmwoSco9+9DvzwICAlSvXj0dyssrt8/DPy8LPu/q91xnHyY++7DxubKysnTdddeVW56bmytvb+8KAwwAqLuqZWQXLlyolJQUTZw4UU2bNtX06dPl4eHhcONTSEiIvLy8tHv3bodtXVxc1LZtW3133nJJ2vjDD7qhUSP5nBdDm4eHXH5+eDgiIkJubm769ttvHcYUFRUpPT1dkZGR5fa7e/duhYWFXenpAgBqqWoX2ePHj2vUqFHq0KGDRo4cKenMc7ITJ07Up59+qgULFkiS3N3dFR0dXS6GknT33XcrPTNT6eeE9ocDB7R6+3YlxMQ4jN114IByfHxk+/mmKj8/P/Xq1Uvz5s3T8ePH7ePeeecdFRQUlHtDCknauHGj4uLirv7kAQC1is06/0lNJxs9erRmzJihdevW6eabb7YvLy0tVadOnXTw4EHt2LFD9evX15QpUzRu3DgdPnzY4TWtx48fV4fISOXn5OiJvn3l7uqq2UuXqrSsTJ+//LICz4612RT84IPq1rWrVn35pX37s9Fs06aNhg0bpv3792vKlCnq1q2bli1b5jDftLQ0RUdH6/PPP1fPnj3NfnNQLfXr10+SlJKS4uSZAKhuqtWVbFpammbOnKknn3zSIbCS5Orqqtdff10HDx7U888/L0l6+OGHVVpaWu5/bvXr11fqqlXq1r27pi9apH988IHahIRo4fPPOwTW5uZ25lMXx29Dx44d9fnnn8vLy0tPP/203njjDQ0dOlQffPBBuTkvWLBAISEh6tGjR2V9GwAAtUS1u5K9XEOHDtXOnTv11VdfVbi+tLBQhTt36uQPP8j6+aU7Ng8PebdoIa8WLeTq7X3Fxz59+rSaNWum5557TqNHj77i/aBm40oWwIW4OXsCV2v8+PFq2bKl1qxZU+4v8UiSq7e36kdGyqddO/vLdFzq1St39Xol/v3vf8vd3b3cHygAAECqBVeygLNxJQvgQqrVc7IAANQmRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFmgAvv27ZOnp6fWrFlT5cd+/fXXFRISotOnT1f5sQFULiKLOmHgwIHy9PTUzp07y61LSkqSzWbTxx9/bF/20ksvKSYmRp07d3YY+9NPP+nee++Vv7+/fH191b9/f504ceKS57F27Vp16dJF3t7eCg4O1qhRo1RQUOAw5tFHH1VRUZFmz559mWcJoLqxWZZlOXsSgGmHDx9W69atFRkZqS+++MK+fPfu3QoPD1ffvn31wQcfSJKOHDmiJk2aaO7cuXrggQfsYwsKCtSxY0fl5+drzJgxcnd317Rp05STna3f3nqr/rNwoWwuF/69NT09XbGxsQoLC9OwYcO0f/9+vfLKK7rlllu0dOlSh7HPPvus/vOf/2j37t2y2WyV/N0AUGUsoI544403LElWcnKyfdntt99u+fr6Wvv377cvmzp1quXl5WUdP37cYft//OMfliTrm2++sUpOnLCObdpkrZ4+3XJ1cbFG9etnHVqwwDq2aZNVcuJEhcfv06eP1bhxYys/P9++7M0337QkWcuWLXMY++2331qSrBUrVlTGqQNwEh4uRp3x2GOPqXPnzkpMTFROTo7mz5+vTz/9VH/961/VpEkT+7hFixYpJiZGPj4+Dtt/8MEHuvnmmxV5443K+eQTFWZk6KagIHUND1fK+vWyiopUmJGhnE8+UXFOjsO2x44d02effaaBAwfK19fXvnzQoEHy8fHR+++/7zA+KipKAQEBWrx4sYHvBICqQmRRZ9hsNs2ePVv5+fl64okn9PTTTys6Olp/+MMf7GOKi4u1YcMGdezY0WHbsrIybd68WVGRkcpduVJWcbH08zMtHUJDtefQIRWcPClZlqySEuV+8YVKCwvt22/ZskUlJSWKjo522K+Hh4ciIyO1adOmcvPt2LGjU268AlB5iCzqlPDwcCUmJmrBggU6cuSIZs+eLZdznkfdu3evTp48qRtvvNFhu6NHj+r06dNq6OYmq6TEYV0jf39J0sHc3DMLfg7tyV277GOysrIkSY0bNy43p8aNG+vAgQPlljdv3lzbt2+/ovMEUD0QWdQ5gYGBkqTrrrtOERERDutyfn6Yt0GDBg7LT548KUlyOX7cfgV7Vj13d0nSqaKiXxZalgp37ZJVVuawfb169crNx9PT077+XA0aNNDJkydVeM4VMYCahciiTtm3b5/Gjx+viIgI7du3T5MmTapwnHVeSL28vCRJp0+dKjf2dHGxJMnTw8NxH0VFKvv5ta727St47eupU6fs6yuaA3cXAzUXkUWdMmLECEnS0qVLdc899+hvf/ubfvzxR/v6hg0bSpJyzz70+7OAgADVq1dPh/Lyyu3z8M/Lgs+7+j3X2YeJzz5sfK6srCxdd9115Zbn5ubK29u7wgADqBmILOqMhQsXKiUlRRMnTlTTpk01ffp0eXh4ONz4FBISIi8vL+3evdthWxcXF7Vt21bfnbdckjb+8INuaNRIPufF0ObhIZefHx6OiIiQm5ubvv32W4cxRUVFSk9PV2RkZLn97t69W2FhYVd6ugCqASKLOuH48eMaNWqUOnTooJEjR0o685zsxIkT9emnn2rBggWSJHd3d0VHR5eLoSTdfffdSs/MVPo5of3hwAGt3r5dCTExDmN3HTigHB8f+5tT+Pn5qVevXpo3b56OHz9uH/fOO++ooKBA99xzT7njbdy4UXFxcVd/8gCchnd8Qp0wevRozZgxQ+vWrdPNN99sX15aWqpOnTrp4MGD2rFjh+rXr68pU6Zo3LhxOnz4sMNrWo8fP64OkZHKz8nRE337yt3VVbOXLlVpWZk+f/llBZ4da7Mp+MEH1a1rV6368kv79mej2aZNG/s7Pk2ZMkXdunXTsmXLHOablpam6Ohoff755+rZs6fZbw4AY7iSRa2XlpammTNn6sknn3QIrCS5urrq9ddf18GDB/X8889Lkh5++GGVlpYqJSXFYWz9+vWVumqVunXvrumLFukfH3ygNiEhWvj88w6Btbm5nfn0vLdY7Nixoz7//HN5eXnp6aef1htvvKGhQ4fa387xXAsWLFBISIh69OhRWd8GAE7AlSxQgaFDh2rnzp366quvKlxfWliowp07dfKHH2T9/NIdm4eHvFu0kFeLFnL19r7iY58+fVrNmjXTc889p9GjR1/xfgA4H5EFKrB37161bNlSK1asKPeXeM5llZXZX6bjUq/eRf9AwKV6/fXX9fLLL2vXrl0Vvq4WQM1BZAEAMITnZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYIibsydwrr179yo7O9vZ07hqgYGBCgkJcfY0AABOVm0iu3fvXoWFhamwsNDZU7lq3t7eysjIILQAUMdVm8hmZ2ersLBQ8+bNU1hYmLOnc8UyMjI0cOBAZWdnE1kAqOOqTWTPCgsLU8eOHZ09DQAArho3PgEAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwpMZHNj4+Xk899VSl7a9bt2567733Km1/FcnOzlajRo20f/9+o8cBADiX8cgeOXJETzzxhEJCQlSvXj0FBwerd+/eWrNmjelDX7aUlBQdOnRI999/v33ZqVOn9Ic//EENGzaUj4+PBgwYoEOHDv3qvqKiomSz2ewft99+u31dYGCgBg0apPHjxxs5DwBA9eBm+gADBgxQUVGR5s6dq+bNm+vQoUNasWKFcnJyTB/6kliWpdLSUrm5uem1117T4MGD5eLyy+8eTz/9tD755BMtWLBAfn5+GjFihO66665f/SUhLi5OH374of3revXqOawfPHiwoqKiNHnyZAUEBFTuSQEAqgfLoNzcXEuSlZqaetExw4YNswICAixJVmhoqPXRRx9ZlmVZ2dnZ1v33329dd911lpeXlxUREWG99957Dtt3797dGj16tP3r//u//7OioqIsHx8f69prr7UeeOAB69ChQ/b1K1eutCRZS5YssTp27Gi5u7tbK1eutA4fPmzZbDZr69at9rF5eXmWu7u7tWDBAvuyjIwMS5L19ddfV3g+aWlpliSre/fuv/r9ufHGG6233nrrV8cBAGomow8X+/j4yMfHR4sWLdLp06fLrS8rK1OfPn20Zs0aTZw4UZI0YsQIubq6SjrzUG1UVJQ++eQTbd26VcOGDdPDDz+sb7755oLHLC4u1sSJE/Xdd99p0aJF2rNnjx599NFy45577jklJSUpIyND7dq10+rVq+Xt7a2wsDD7mLS0NBUXF6tXr172Za1bt1ZISIi+/vrri557WlqaGjVqpFatWumJJ56o8Mq9U6dO+uqrry66HwBAzWX04WI3NzclJyfr8ccf1+uvv66OHTuqe/fuuv/++9WuXTt9/vnn+uabb5SRkaGCggJJZ2486tixoySpSZMmSkxMtO9v5MiRWrZsmd5//3116tSpwmMOGTLE/nnz5s312muv6eabb1ZBQYF8fHzs61566SXdeuut9q//97//6dprr3V4qPjgwYPy8PCQv7+/wzGuvfZaHTx48KLn/tJLL6lXr17KzMzUn//8Z/Xp00dff/21/RcISbruuuu0adOmi+4HAFBzGb/xacCAATpw4IBSUlJ0++23KzU1VR07dlRycrLS09PVtGlTtWzZssJtS0tLNXHiRLVt21YBAQHy8fHRsmXLtHfv3gseLy0tTQkJCQoJCVH9+vXVvXt3SSq3TXR0tMPXJ0+elKen51We7S+6d++utm3b6s4779THH3+sDRs2KDU11WGMl5eXCgsLK+2YAIDqpUpewuPp6albb71VL7zwgtauXatHH31U48ePl5eX10W3mzx5sl599VU9++yzWrlypdLT09W7d28VFRVVOP7EiRPq3bu3fH199e6772rDhg1auHChJJXb5pprrnH4OjAwULm5uQ7LgoODVVRUpLy8PIflhw4dUnBw8KWcuqQzV9SBgYH64YcfHJYfPXpUQUFBl7wfAEDN4pTXybZp00YnTpxQu3bttH//fu3cubPCcWvWrFH//v01cOBAtW/fXs2bN7/gWEnasWOHcnJylJSUpK5du6p169Y6fPjwJc2pQ4cOOnjwoENoo6Ki5O7urhUrVtiXff/999q7d69iY2Mv8Wyl/fv3KycnR40bN3ZYvnXrVnXo0OGS9wMAqFmMRjYnJ0c9evTQvHnztHnzZu3evVsLFizQpEmT1L9/f3Xv3l3dunXTgAEDtG7dOklnwvrpp59Kklq0aKHPPvtMa9euVUZGhn7/+99f9DWqISEh8vDw0D//+U/9+OOPSklJsd9Q9Ws6dOigwMBAh5fm+Pn5aejQofrjH/+olStXKi0tTYMHD1ZsbKx+85vf2Me1bt3afsV89uHfLVu2aM+ePVqxYoX69++vm266Sb1797ZvU1hYqLS0NN12222X+N0EANQ0xu8ujomJ0bRp09StWzdFRETohRde0OOPP64ZM2ZIkj788EPdfPPN+vOf/yxJevXVV1VaWipJev7559WxY0f17t1b8fHxCg4O1p133nnB4wUFBSk5OVkLFixQmzZtlJSUpFdeeeWS5urq6qrBgwfr3XffdVg+bdo03XHHHRowYIC6deum4OBg/fe//3UY8/333ys/P1+S7DdOPf3002rZsqWGDh2qqKgoffXVVw6vlV28eLFCQkLUtWvXS5ofAKDmsVmWZTl7EpK0ceNGRUVFKS0tzX53cVU7ePCgwsPDtXHjRt1www1XtI9LPY/f/OY3GjVqlB588MErnS4AoJqr8e9dXJmCg4M1Z86ci969XBmys7N111136YEHHjB6HACAcxl/W8Wa5mIPR1eWwMBAPfPMM8aPAwBwLq5kAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhS7f5oe0ZGhrOncFVq+vwBAJWn2kQ2MDBQ3t7eGjhwoLOnctW8vb0VGBjo7GkAAJzMZlmW5exJnLV3715lZ2c7expXLTAwUCEhIc6eBgDAyapVZAEAqE248QkAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCH/H6k1EygoCBGFAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Circuit(exp).decomp().draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "768b5f7e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABu0AABX0CAYAAACqx9j2AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3XmQVuWdL/BvQyNLIzrQIKACArIEF2zigoqKuCc4jrkkxIXABSQTlxhBo6NR1BivO6MxaG4MuDBDXLJdEw0KQwaMSmwiorTiBiRGQjqIiqhgw/3D8q28gwuL5oh8PlVd9b6/8zzP+Z3TVJflt55zKtatW7cuAAAAAAAAQGEaFd0AAAAAAAAAbO2EdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMEqi24AAAAA2HotWbIk9fX1Rbex2aqrq9OpU6ei2wAAYAsmtAMAAAAKsWTJkvTu3TurVq0qupXN1qJFi9TV1QnuAADYZEI7AAAAoBD19fVZtWpV7rjjjvTu3bvodjZZXV1dTjrppNTX1wvtAADYZEI7AAAAoFC9e/dOTU1N0W0AAEChGhXdAAAAAAAAAGzthHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAGzVTj755Hzve98rqz3zzDNp3759Xn/99U1et76+Pu3atcuf/vSnsvrQoUNzzTXXbPK6AAB8NgntAAAAgI/F0qVLc/rpp6dr165p2rRpdt555wwePDjTp0//RM87efLkbL/99ps0d968efn1r3+dM844o6x+3nnn5fTTT8+2226bJHnrrbcyfPjw7L777qmsrMxxxx33kWtXV1dn2LBhueiii8rqF1xwQS677LK8+uqrm9QzAACfTUI7AAAAYLMtWrQo/fr1y4wZM3LVVVdl/vz5uf/++zNw4MCceuqp7ztnzZo1/+Au13fDDTdkyJAhadmyZam2ZMmS3HvvvRk+fHip1tDQkObNm+eMM87IYYcdtsHrjxgxIlOmTMny5ctLtd122y3dunXLHXfc8bFcAwAAnw1COwAAAGCzfeMb30hFRUXmzJmTL33pS+nRo0f69OmTs846K4888kiSpKKiIhMnTsyxxx6bqqqq/PjHP06SzJw5MzU1NWnWrFm6du2aiy++OO+8805p7WuvvTa77757qqqqsvPOO+cb3/hGVq5cWZo7YsSIvPrqq6moqEhFRUXGjx+fJHn77bczbty47Ljjjqmqqsq+++6bmTNnltZtaGjI3XffncGDB5ddy5133pk999wzO+64Y6lWVVWViRMnZvTo0Wnfvv0G35c+ffqkY8eO+dnPflZWHzx4cKZOnbrB6wAA8NkntAMAAAA2y/Lly3P//ffn1FNPTVVV1XrH//7RlePHj8+//Mu/ZP78+Tn22GOTJBdeeGG++c1vZsGCBbn55pszefLkXHbZZaU5jRo1yvXXX5+nnnoqt956a2bMmJFzzjknSbL//vtnwoQJadWqVV5++eW8/PLLGTduXJLktNNOy8MPP5ypU6fmiSeeyJAhQ3LUUUfl2WefTZI88cQTefXVV/P5z3++rN9Zs2atV9sc++yzT2bNmrVebc6cOXn77bc/tvMAALBlE9oBAAAAm+W5557LunXr0qtXr48ce8IJJ2TEiBHp2rVrOnTokCQZPnx4vva1r6Vr1645/PDDc+mll+bmm28uzTnzzDMzcODAdOnSJYceemi++93v5s4770ySbLPNNtluu+1SUVGR9u3bp3379mnZsmWWLFmSSZMm5a677sqAAQPSrVu3jBs3LgceeGAmTZqUJFm8eHEaN26cdu3alfW4ePHidOzY8eO6PenYsWMWL168Xm316tVZunTpx3YeAAC2bJVFNwAAAABs2datW7fBY99vB9uPfvSjTJ48ufS9oaEhb731VlatWpUWLVrkwQcfzOWXX56nn346r732Wt55552y4+9n/vz5aWhoSI8ePcrqb7/9dtq0aZMkefPNN9O0adNUVFSUjXnzzTfTrFmzDb6mj9K8efOsWrVqvVqS9eoAAGy9hHYAAADAZtl1111TUVGRp59++iPHvt/jM8eMGZPTTz99vXqzZs2yaNGifPGLX8y//uu/5rLLLkvr1q0ze/bsjBw5MqtXr/7A0G7lypVp3Lhxamtr07hx47JjLVu2TJJUV1dn1apVWb16dbbZZpvS8erq6rzyyisfeS0bavny5Wnbtu16tSTr1QEA2HoJ7QAAAIDN0rp16xx55JG58cYbc8YZZ6wXzK1YsaLsvXb/0+LFi9O9e/f3PVZbW5u1a9fmmmuuSaNG777l471HY75nm222SUNDQ1ltr732SkNDQ5YtW5YBAwa879p9+/ZNkixYsKD0+b25CxYs+MB+N9aTTz6ZQw45ZL3aTjvtlOrq6o/tPAAAbNm80w4AAADYbDfeeGMaGhqyzz775J577smzzz6burq6XH/99enfv/+Hzr333ntz8cUX56mnnkpdXV2mTp2aCy64IEnSvXv3rFmzJjfccENeeOGF3H777bnpppvK5nfp0iUrV67M9OnTU19fn1WrVqVHjx458cQTM2zYsPz0pz/Niy++mDlz5uTyyy/Pr371qyTv7nKrqanJ7Nmzy9Y78sgj8/DDD68XBC5YsCCPP/54li9fnldffTWPP/54Hn/88Q+9tlWrVqW2tjZHHHFEWX3WrFnr1QAA2LoJ7QAAAIDN1rVr18ydOzcDBw7M2LFjs9tuu+Xwww/P9OnTM3HixA+dO2HChEybNi1777139ttvv1x33XXp3LlzkmTPPffMtddemyuuuCK77bZbpkyZkssvv7xs/v7775+vf/3r+cpXvpK2bdvmyiuvTJJMmjQpw4YNy9ixY9OzZ88cd9xx+f3vf59OnTqV5o4aNSpTpkwpW+/oo49OZWVlHnzwwbL6Mccck7322iv/7//9v8ycOTN77bVX9tprr9LxP//5z6moqMjMmTNLtV/84hfp1KlT2W6/t956Kz//+c8zevToDbizAABsLSrWbczbogEAAAA+JnPnzk2/fv1SW1ubmpqaQnp4880307Nnz/zkJz8p2xF4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qaqqyr777puZM2eW1m1oaMjdd9+dwYMHl13LnXfemT333DM77rhjqTZlypSsXr06P/7xj9OnT58MHTo0Z5xxxnq76P6nww8/PMuXL89vf/vbUq1x48Y55phjMnXq1I2/0QBsNKEdAAAAALBVWL58ee6///6ceuqpqaqqWu/43z+6cvz48fmXf/mXzJ8/P8cee2yS5MILL8w3v/nNLFiwIDfffHMmT56cyy67rDSnUaNGuf766/PUU0/l1ltvzYwZM3LOOeckSfbff/9MmDAhrVq1yssvv5yXX34548aNS5KcdtppefjhhzN16tQ88cQTGTJkSI466qg8++yzSd593OWrr76az3/+82X9zpo1a73aww8/nIMOOijbbLNNqXbkkUfmmWeeyWuvvfaB92abbbZJ3759M2vWrLL6Pvvss14NgE+G0A4AAAAA2Co899xzWbduXXr16vWRY0844YSMGDEiXbt2TYcOHZIkw4cPz9e+9rV07do1hx9+eC699NLcfPPNpTlnnnlmBg4cmC5duuTQQw/Nd7/73dx5551J3g3Ftttuu1RUVKR9+/Zp3759WrZsmSVLlmTSpEm56667MmDAgHTr1i3jxo3LgQcemEmTJiVJFi9enMaNG6ddu3ZlPS5evDgdO3Ysqy1dujQ77LBDWe2973/7298+9Jo7duyYxYsXr1f74x//6L12AP8AlUU3AAAAAADwj7Bu3boNHvs/d7AlyY9+9KNMnjy59L2hoSFvvfVWVq1alRYtWuTBBx/M5ZdfnqeffjqvvfZa3nnnnbLj72f+/PlpaGhIjx49yupvv/122rRpkyR5880307Rp01RUVJSNefPNN9OsWbMNvqaP0rx586xatWq92tq1a/P222+nefPmH9u5AFif0A4AAAAA2CrsuuuuqaioyNNPP/2RY9/v8ZljxozJ6aefvl69WbNmWbRoUb74xS/mX//1X3PZZZeldevWmT17dkaOHJnVq1d/YGi3cuXKNG7cOLW1tWncuHHZsZYtWyZJqqurs2rVqqxevbrssZfV1dV55ZVXyua0b98+f/nLX8pq731/LwT8IMuXL0+3bt3Wq1VVVQnsAP4BhHYAAAAAwFahdevWOfLII3PjjTfmjDPOWC+YW7FiRdl77f6nxYsXp3v37u97rLa2NmvXrs0111yTRo3efSvRe4/GfM8222yThoaGstpee+2VhoaGLFu2LAMGDHjftfv27ZskWbBgQenze3MXLFhQNrZ///45//zzs2bNmjRp0iRJ8sADD6Rnz55p1arVB15bkjz55JP5X//rf61X22uvvT50HgAfD++0AwAAAAC2GjfeeGMaGhqyzz775J577smzzz6burq6XH/99enfv/+Hzr333ntz8cUX56mnnkpdXV2mTp2aCy64IEnSvXv3rFmzJjfccENeeOGF3H777bnpppvK5nfp0iUrV67M9OnTU19fn1WrVqVHjx458cQTM2zYsPz0pz/Niy++mDlz5uTyyy/Pr371qyRJ27ZtU1NTk9mzZ5etd+SRR+bhhx8uCwJPOOGEbLPNNhk5cmSeeuqp/OQnP8m///u/56yzzvrQa1u0aFFeeumlHHbYYWX1WbNm5YgjjvjwmwrAx0JoBwAAAABsNbp27Zq5c+dm4MCBGTt2bHbbbbccfvjhmT59eiZOnPihcydMmJBp06Zl7733zn777ZfrrrsunTt3TpLsueeeufbaa3PFFVdkt912y5QpU3L55ZeXzd9///3z9a9/PV/5ylfStm3bXHnllUmSSZMmZdiwYRk7dmx69uyZ4447Lr///e/TqVOn0txRo0ZlypQpZesdffTRqayszIMPPliqbbfddpk2bVpefPHF9OvXL2PHjs2FF16YU045pTTmscceS0VFRRYtWlSq/ed//meOOOKI0vUkyUsvvZTf/e53GTFixAbeXQA2R8W6jXn7KgAAAMAW5KCDDkqXLl1y2223Fd0KsAWbO3du+vXrl9ra2tTU1BTSw5tvvpmePXvmJz/5SdmOwBtvvDG//OUv85vf/OYj13jvOi666KJMmTIlCxYsSJMmTbJ69ersuuuu+Y//+I8ccMABpfHf/va388orr+SHP/zhJ3JNAJTzTjsAAAAAgE+55s2b57bbbkt9fX1ZfcyYMVmxYkVef/31bLvtthu01uzZs/O9732v9M67JUuW5N/+7d/KArskadeu3Uc+VhOAj4/QDgAAAABgC3DIIYesV6usrMz555+/UetceeWVZTsGu3fvnu7du683buzYsRvdIwCbzjvtAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAA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OzU1NUW3AfCxaVR0AwAAAAAAALC1E9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAsJX47//+7wwePDgdO3ZMRUVFfv7zn2/w3IceeiiVlZXp27fvZq359a9/PRUVFZkwYUKptmjRoowcOTK77LJLmjdvnm7duuWiiy7K6tWrS2PeeuutDB8+PF/+8peTJGedddZ6a8+ePTsHHHBA2rRpk+bNm6dXr1657rrrysaMHz8+FRUVZT+9evVab62HH344hx56aKqqqtKqVascdNBBefPNNze432eeeSYDBw7MDjvskGbNmqVr16654IILsmbNmrLz9OvXb71+vvCFL5T126tXr1RVVeWf/umfcthhh+XRRx8tW2P58uU58cQT06pVq2y//fYZOXJkVq5cWTbmzjvvTN++fdOiRYt07tw5V111VdnxmTNnrtdHRUVFli5dWhqzOf9+gI9WWXQDAAAAAAD8Y7zxxhvZc88987//9//O8ccfv8HzVqxYkWHDhmXQoEH5y1/+sslr/uxnP8sjjzySjh07ltWffvrprF27NjfffHO6d++eJ598MqNHj84bb7yRq6++OknS0NCQ5s2bZ+jQobnsssved/2qqqqcdtpp2WOPPVJVVZXZs2dnzJgxqaqqyimnnFIa16dPnzz44IOl75WV5f+r/OGHH85RRx2V8847LzfccEMqKyszb968NGrUaIP7bdKkSYYNG5aamppsv/32mTdvXkaPHp21a9fme9/7Xulcv/nNb7LHHnskSf72t79lzz33zJAhQ0rHe/Toke9///vp2rVr3nzzzVx33XU54ogj8txzz6Vt27ZJkhNPPDEvv/xyHnjggaxZsyYjRozIKaeckv/4j/9Iktx333058cQTc8MNN+SII45IXV1dRo8enebNm+e0004ru/ZnnnkmrVq1Kn1v165d6fOm/vsBNkzFunXr1hXdBAAAAMAn4aCDDkqXLl1y2223Fd0KwIcq4u9VRUVFfvazn+W44477yLFDhw7NrrvumsaNG+fnP/95Hn/88Y1e86WXXsq+++6b3/zmN/nCF76QM888M2eeeeYHnvOqq67KxIkT88ILL5TV586dm379+uXggw/OzJkzP7L3448/PlVVVbn99tuTvLtz7cOuIUn222+/HH744bn00ks/cv2P6vfvnXXWWfn973+fWbNmla6jtrY2NTU1SZIJEybkwgsvzMsvv5yqqqr3XeO1117LdtttlwcffDCDBg1KXV1dPve5z+X3v/99Pv/5zydJ7r///hxzzDH505/+lI4dO+aEE07ImjVrctddd5XWueGGG3LllVdmyZIlqaioyMyZMzNw4MC88sor2X777T/yejfm3w+wYTweEwAAAACADzRp0qS88MILueiiizZ5jbVr1+bkk0/O2WefnT59+mzQnFdffTWtW7fe5HMmyR/+8If87ne/y8EHH1xWf/bZZ9OxY8d07do1J554YpYsWVI6tmzZsjz66KNp165d9t9//+ywww45+OCDM3v27M3q97nnnsv999+/Xi9/75ZbbsnQoUM/MLBbvXp1fvjDH2a77bbLnnvumeTdXYHbb799KbBLksMOOyyNGjUqPUbz7bffTrNmzcrWat68ef70pz9l8eLFZfW+ffumQ4cOOfzww/PQQw996DUDHy+hHQAAAAAA7+vZZ5/NueeemzvuuGO9R0hujCuuuCKVlZU544wzNmj8c889lxtuuCFjxozZpPPttNNOadq0aT7/+c/n1FNPzahRo0rH9t1330yePDn3339/Jk6cmBdffDEDBgzI66+/niSlnXLjx4/P6NGjc//996empiaDBg3Ks88+u9H97r///mnWrFl23XXXDBgwIJdccsn7rjFnzpw8+eSTZb2+5957703Lli3TrFmzXHfddXnggQdSXV2dJFm6dGnZIyyTdx/32bp169L76I488sj89Kc/zfTp07N27dosXLgw11xzTZLk5ZdfTpJ06NAhN910U+65557cc8892XnnnXPIIYdk7ty5H3yjgY+Vd9oBAAAAALCehoaGnHDCCbn44ovTo0ePTV6ntrY2//7v/565c+emoqLiI8e/9NJLOeqoozJkyJCMHj16k845a9asrFy5Mo888kjOPffcdO/ePV/96leTJEcffXRp3B577JF99903nTt3zp133pmRI0dm7dq1SZIxY8ZkxIgRSZK99tor06dPz49//ONcfvnlG9XvT37yk7z++uuZN29ezj777Fx99dU555xz1ht3yy23ZPfdd88+++yz3rGBAwfm8ccfT319ff7v//2/+fKXv1zaDbghRo8eneeffz5f/OIXs2bNmrRq1Srf/OY3M378+NJ7+nr27JmePXuW5uy///55/vnnc91115UeLQp8suy0AwAAAABgPa+//noee+yxnHbaaamsrExlZWUuueSSzJs3L5WVlZkxY8YGrTNr1qwsW7YsnTp1Kq2zePHijB07Nl26dCkb++c//zkDBw7M/vvvnx/+8Ieb3Psuu+yS3XffPaNHj863vvWtjB8//gPHbr/99unRo0eee+65JO/uOEuSz33uc2XjevfuXfYYzQ3td+edd87nPve5fPWrX83/+T//J+PHj09DQ0PZmDfeeCNTp07NyJEj33eNqqqqdO/ePfvtt19uueWWVFZW5pZbbkmStG/fPsuWLSsb/84772T58uVp3759knffP3fFFVdk5cqVWbx4cZYuXVoKB7t27fqB92afffYp3Rfgk2enHQAAAAAA62nVqlXmz59fVvvBD36QGTNm5O67784uu+yyQeucfPLJOeyww8pqRx55ZE4++eTSTrbk3R1rAwcOTL9+/TJp0qTSDrDNtXbt2rz99tsfeHzlypV5/vnnc/LJJydJunTpko4dO+aZZ54pG7dw4cKyXXqb0u/atWuzZs2a0m6+99x11115++23c9JJJ230NfXv3z8rVqxIbW1t+vXrlySZMWNG1q5dm3333bdsXuPGjbPjjjsmSf7zP/8z/fv3T9u2bT/wPI8//ngpxAQ+eUI7AAAAAICtxMqVK8t2Tr344ot5/PHH07p163Tq1CnnnXdeXnrppdx2221p1KhRdtttt7L57dq1S7NmzcrqH7VmmzZt0qZNm7J1mjRpkvbt25cex/jSSy/lkEMOSefOnXP11Vfnr3/9a2nse7vFkmTBggWlMG3lypV5/PHHkyR9+/ZNktx4443p1KlTevXqlST57//+71x99dVl79IbN25cBg8enM6dO+fPf/5zLrroojRu3Lj0+MyKioqcffbZueiii7Lnnnumb9++ufXWW/P000/n7rvv3uB+p0yZkiZNmmT33XdP06ZN89hjj+W8887LV77ylTRp0qTsftxyyy057rjj1rtPb7zxRi677LIce+yx6dChQ+rr63PjjTfmpZdeypAhQ5K8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VNttt93SrVu33HHHHR/LNQCfPkI7AAAAAAAK8Y1vfCMVFRWZM2dOvvSlL6VHjx7p06dPzjrrrDzyyCNJkoqKikycODHHHntsqqqq8uMf/zhJMnPmzNTU1KRZs2bp2rVrLr744rzzzjulta+99trsvvvuqaqqys4775xvfOMbWblyZWnuiBEj8uqrr6aioiIVFRUZP358kuTtt9/OuHHjsuOOO6aqqir77rtvZs6cWVq3oaEhd999dwYPHlx2LXfeeWf23HPP7LjjjqVaVVVVJk6cmNGjR6d9+/YbfF/69OmTjh075mc/+1lZffDgwZk6deoGrwNsWYR2AAAAAAD8wy1fvjz3339/Tj311FRVVa13/O8fXTl+/Pj8y7/8S+bPn59jjz02SXLhhRfmm9/8ZhYsWJCbb745kydPzmWXXVaa06hRo1x//fV56qmncuutt2bGjBk555xzkiT7779/JkyYkFatWuXll1/Oyy+/nHHjxiVJTjvttDz88MOZOnVqnnjiiQwZMiRHHXVUnn322STJE088kVdffTWf//zny/qdNWvWerXNsc8++2TWrFnr1ebMmZO33377YzsP8OkhtAMAAAAA4B/uueeey7p169KrV6+PHHvCCSdkxIgR6dq1azp06JAkGT58eL72ta+la9euOfzww3PppZfm5ptvLs0588wzM3DgwHTp0iWHHnpovvvd7+bOO+9MkmyzzTbZbrvtUlFRkfbt26d9+/Zp2bJllixZkkmTJuWuu+7KgAED0q1bt4wbNy4HHnhgJk2alCRZvHhxGjdunHbt2pX1uHjx4nTs2PHjuj3p2LFjFi9evF5t9erVWbp06cd2HuDTo7LoBgAAAAAA2PqsW7dug8e+3w62H/3oR5k8eXLpe0NDQ956662sWrUqLVq0yIMPPpjLL788Tz/9dF577bW88847Zcffz/z589PQ0JAePXqU1d9+++20adMmSfLmm2+madOmqaioKBvz5ptvplmzZht8TR+lefPmWbVq1Xq1JOvVgc8GoR0AAAAAAP9wu+66ayoqKvL0009/5Nj3e3zmmDFjcvrpp69Xb9asWRYtWpQvfvGL+dd//ddcdtllad26dWbPnp2RI0dm9erVHxjarVy5Mo0bN05tbW0aN25cdqxly5ZJkurq6qxatSqrV6/ONttsUzpeXV2dV1555SOvZUMtX748bdu2Xa+WZL068NkgtAMAAAAA4B+udevWOfLII3PjjTfmjDPOWC+YW7FiRdl77f6nxYsXp3v37u97rLa2NmvXrs0111yTRo3efUvUe4/GfM8222yThoaGstpee+2VhoaGLFu2LAMGDHjftfv27ZskWbBgQenze3MXLFjwgf1urCeffDKHHHLIerWddtop1dXVH9t5gE8P77QDAAAAAKAQN954YxoaGrLPPvvknnvuybPPPpu6urpcf/316d+//4fOvffee3PxxRfnqaeeSl1dXaZOnZoLLrggSdK9e/esWbMmN9xwQ1544YXcfvvtuemmm8rmd+nSJStXrsz06dNTX1+fVatWpUePHjnxxBMzbNiw/PSnP82LL76YOXPm5PLLL8+vfvWrJO/ucqupqcns2bPL1jvyyCPz8MMPrxcELliwII8//niWL1+eV199NY8//ngef/zxD722VatWpba2NkcccURZfdasWevVgM8OoR0AAAAAAIXo2rVr5s6dm4EDB2bs2LHZbbfdcvjhh2f69OmZOHHih86dMGFCpk2blr333jv77bdfrrvuunTu3DlJsueee+baa6/NFVdckd122y1TpkzJ5ZdfXjZ///33z9e//vV85StfSdu2bXPllVcmSSZNmpRhw4Zl7Nix6dmzZ4477rj8/ve/T6dOnUpzR40alSlTppStd/TRR6eysjIPPvhgWf2YY47JXnvtlf/3//5fZs6cmb322it77bVX6fif//znVFRUZObMmaXaL37xi3Tq1Klst99bb72Vn//85xk9evQG3FlgS1SxbmPe9gkAAACwBTnooIPSpUuX3HbbbUW3AvCh/L3acHPnzk2/fv1SW1ubmpqaQnp4880307Nnz/zkJz8p2xF444035pe//GV+85vffOQa713HTTfdlHPPPTcvvPBC/umf/ilJst9+++WMM87ICSecUBo/ceLE/OxnP8u0adM+/gsCPhW80w4AAAAAADZC8+bNc9ttt6W+vr6sPmbMmKxYsSKvv/56tt122w1a66GHHsq//du/lQK7+vr6HH/88fnqV79aNq5Jkya54YYbPp4LAD6VhHYAAAAAALCRDjnkkPVqlZWVOf/88zdqnTPPPLNsx2B1dXXOOeec9caNGjVqo3sEtizeaQcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAA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HQAAAAAAsEnq6+uzatWq3HHHHendu3fR7Wyyurq6nHTSSamvrxfaURihHQAAAAAAsFl69+6dmpqaotuALVqjohsAAAAAAACArZ3QDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAIAt2sknn5zvfe97ZbVnnnkm7du3z+uvv77J6y5YsCA77bRT3njjjbL6fvvtl3vuuWeT14X3I7QDAAAAAACSJEuXLs3pp5+erl27pmnTptl5550zePDgTJ8+/RM97+TJk7P99ttv0tx58+bl17/+dc4444yy+nnnnZfTTz892267ban2xBNPZMCAAWnWrFl23nnnXHnllR+69uc+97nst99+ufbaa8vqF1xwQc4999ysXbt2k3qG9yO0AwAAAAAAsmjRovTr1y8zZszIVVddlfnz5+f+++/PwIEDc+qpp77vnDVr1vyDu1zfDTfckCFDhqRly5al2pIlS3Lvvfdm+PDhpdprr72WI444Ip07d05tbW2uuuqqjB8/Pj/84Q8/dP0RI0Zk4sSJeeedd0q1o48+Oq+//nruu+++j/162HoJ7QAAAAAAgHzjG99IRUVF5syZky996Uvp0aNH+vTpk7POOiuPPPJIkqSioiITJ07Msccem6qqqvz4xz9OksycOTM1NTVp1qxZunbtmosvvrgs5Lr22muz++67p6qqKjvvvHO+8Y1vZOXKlaW5I0aMyKuvvpqKiopUVFRk/PjxSZK3334748aNy4477piqqqrsu+++mTlzZmndhoaG3H333Rk8eHDZtdx5553Zc889s+OOO5ZqU6ZMyerVq/PjH/84ffr0ydChQ3PGGWest4vufzr88MOzfPny/Pa3vy3VGjdunGOOOSZTp07d+BsNH0BoBwAAAAAAW7nly5fn/vvvz6mnnpqqqqr1jv/9oyvHjx+ff/mXf8n8+fNz7LHHJkkuvPDCfPOb38yCBQty8803Z/LkybnssstKcxo1apTrr78+Tz31VG699dbMmDEj55xzTpJk//33z4QJE9KqVau8/PLLefnllzNu3LgkyWmnnZaHH344U6dOzRNPPJEhQ4bkqKOOyrPPPpvk3cddvvrqq/n85z9f1u+sWbPWqz388MM56KCDss0225RqRx55ZJ555pm89tprH3hvttlmm/Tt2zezZs0qq++zzz7r1WBzCO0AAAAAAGAr99xzz2XdunXp1avXR4494YQTMmLEiHTt2jUdOnRIkgwfPjxf+9rX0rVr1xx++OG59NJLc/PNN5fmnHnmmRk4cGC6dOmSQw89NN/97ndz5513Jnk3FNtuu+1SUVGR9u3bp3379mnZsmWWLFmSSZMm5a677sqAAQPSrVu3jBs3LgceeGAmTZqUJFm8eHEaN26cdu3alfW4ePHidOzYsay2dOnS7LDDDmW1977/7W9/+9Br7tixYxYvXrxe7Y9//KP32vGxqSy6AQAAAAAAoFjr1q3b4LH/cwdbkvzoRz/K5MmTS98bGhry1ltvZdWqVWnRokUefPDBXH755Xn66afz2muv5Z133ik7/n7mz5+fhoaG9OjRo6z+9ttvp02bNkmSN998M02bNk1FRUXZmDfffDPNmjXb4Gv6KM2bN8+qVavWq61duzZvv/12mjdv/rGdi62X0A4AAAAAALZyu+66ayoqKvL0009/5Nj3e3zmmDFjcvrpp69Xb9asWRYtWpQvfvGL+dd//ddcdtllad26dWbPnp2RI0dm9erVHxjarVy5Mo0bN05tbW0aN25cdqxly5ZJkurq6qxatSqrV68ue+xldXV1XnnllbI57du3z1/+8pey2nvf3wsBP8jy5cvTrVu39WpVVVUCOz42QjsAAAAAANjKtW7dOkceeWRuvPHGnHHGGesFcytWrCh7r93/tHjx4nTv3v19j9XW1mbt2rW55ppr0qjRu2/teu/RmO/ZZptt0tDQUFbba6+90tDQkGXLlmXAgAHvu3bfvn2TJAsWLCh9fm/uggULysb2798/559/ftasWZMmTZokSR544IH07NkzrVq1+sBrS5Inn3wy/+t//a/1anvttdeHzoON4Z12AAAAAABAbrzxxjQ0NGSfffbJPffck2effTZ1dXW5/vrr079//w+de++99+biiy/OU089lbq6ukydOjUXXHBBkqR79+5Zs2ZNbrjhhrzwwgu5/fbbc9NNN5XN79KlS1auXJnp06envr4+q1atSo8ePXLiiSdm2LBh+elPf5oXX3wxc+bMyeWXX55f/epXSZK2bdumpqYms2fPLlvvyCOPzMMPP1wWBJ5wwgnZZpttMnLkyDz11FP5yU9+kn//93/PWWed9aHXtmjRorz00ks57LDDyuqzZs3KEUcc8eE3FTaC0A4AAAAAAEjXrl0zd+7cDBw4MGPHjs1uu+2Www8/PNOnT8/EiRM/dO6ECRMybdq07L333tlvv/1y3XXXpXPnzkmSPffcM9dee22uuOKK7LbbbpkyZUouv/zysvn7779/vv71r+crX/lK2rZtmyuvvDJJMmnSpAwbNixjx45Nz549c9xxx+X3v/99OnXqVJo7atSoTJkypWy9o48+OpWVlXnwwQdLte222y7Tpk3Liy++mH79+mXs2LG58MILc8opp5TGPPbYY6moqMiiRYtKtf/8z//MEUccUbqeJHnppZfyu9/9LiNGjNjAuwsfrWLdxrxdEgAAAGALctBBB6VLly657bbbim4F4EP5e/Xp4vex4ebOnZt+/fqltrY2NTU1hfTw5ptvpmfPnvnJT35StiPwxhtvzC9/+cv85je/+cg13ruOiy66KFOmTMmCBQvSpEmTrF69Orvuumv+4z/+IwcccEBp/Le//e288sor+eEPf/iJXBNbJ++0AwAAAAAAtljNmzfPbbfdlvr6+rL6mDFjsmLFirz++uvZdtttN2it2bNn53vf+17pnXdLlizJv/3bv5UFdknSrl27j3ysJmwsoR0AAAAAALBFO+SQQ9arVVZW5vzzz9+oda688sqyHYPdu3dP9+7d1xs3duzYje4RPop32gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBKotuAAAAAAAA2LLV1dUV3cJm2dL757NBaAcAAAAAAGyS6urqtGjRIieddFLRrWy2Fi1apLq6uug22IoJ7QAAAAAAgE3SqVOn1NXVpb6+/hM7x6hRo9KhQ4dceumln9g5kncDyE6dOn2i54API7QDAAAAAAA2WadOnT7RsKtly5Zp06ZNampqPrFzwKdBo6IbAAAAAAAAgK2d0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAPiZdunTJhAkTim6DLZDQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAIAt2htvvJFhw4alZcuW6dChQ6655poccsghOfPMM5O8+8jK7373u6UxnTt3zi9/+cv89a9/zT//8z+nZcuW2WOPPfLYY4+VrXvPPfekT58+adq0abp06ZJrrrmm7PiyZcsyePDgNG/ePLvsskumTJmyXm8rVqzIqFGj0rZt27Rq1SqHHnpo5s2b94ndC7ZcQjsAAAAAAGCLdvbZZ+e3v/1tfvGLX2TatGmZOXNm5s6dWzbmuuuuywEHHJA//OEP+cIXvpCTTz45w4YNy0knnZS5c+emW7duGTZsWNatW5ckqa2tzZe//OUMHTo08+fPz/jx4/Od73wnkydPLq05fPjw/PGPf8x//dd/5e67784PfvCDLFu2rOy8Q4YMybJly3LfffeltrY2NTU1GTRoUJYvX/6J3xe2LJVFNwAAAAAAALCpVq5cmVtuuSV33HFHBg0alCS59dZbs9NOO5WNO+aYYzJmzJgkyYUXXpiJEydm7733zpAhQ5Ik3/72t9O/f//85S9/Sfv27XPttddm0KBB+c53vpMk6dGjRxYsWJCrrroqw4cPz8KFC3Pfffdlzpw52XvvvZMkt9xyS3r37l065+zZszNnzpwsW7YsTZs2TZJcffXV+fnPf5677747p5xyyid7c9ii2GkHAAAAAABssZ5//vmsXr06++67b6nWunXr9OzZs2zcHnvsUfq8ww47JEl233339Wrv7ZSrq6vLAQccULbGAQcckGeffTYNDQ2pq6tLZWVl+vXrVzreq1evbL/99qXv8+bNy8qVK9OmTZu0bNmy9PPiiy/m+eef38wr57PGTjsAAAAAAOAzr0mTJqXPFRUVH1hbu3btx3bOlStXpkOHDpk5c+Z6x/4+3IPETjsAAAAAAGAL1q1btzRp0iSPPvpoqfbKK69k4cKFm7Vu796989BDD5XVHnroofTo0SONGzdOr1698s4776S2trZ0/JlnnsmKFStK32tqarJ06dJUVlame/fuZT/V1dWb1R+fPUI7AAAAAABgi9WyZcuMHDkyZ599dmbMmJEnn3wyw4cPT6NGmxeBjB07NtOnT8+ll16ahQsX5tZbb833v//9jBs3LknSs2fPHHXUURkzZkweffTR1NbWZtSoUWnevHlpjcMOOyz9+/fPcccdl2nTpmXRokX53e9+l/PPPz+PPfbYZvXHZ4/QDgAAAAAA2KJdddVVGTBgQAYPHpzDDjssBx54YNm75jZFTU1N7rzzzkydOjW77bZbLrzwwlxyySUZPnx4acykSZPSsWPHHHzwwTn++ONzyimnpF27dqXjFRUV+fWvf52DDjooI0aMSI8ePTJ06NAsXry49A49eI932gEAAAAAAFu0li1b5vbbb8/tt99eqv3qV78qfV60aNF6c9atW1f2vUuXLuvVvvSlL+VLX/rSB563ffv2uffee8tqJ598ctn3bbfdNtdff32uv/76j7wOtm522gEAAAAAAEDBhHYAAAAAAABQMI/HBAAAAAAAPnNmzpxZdAuwUey0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAAClZZdAMAAAAAAAB8PJYsWZL6+vqi29hs1dXV6dSpU9Ft/EMJ7QAAAAAAAD4DlixZkt69e2fVqlVFt7LZWrRokbq6uq0quBPaAQAAAAAAfAbU19dn1apVueOOO9K7d++i29lkdXV1Oemkk1JfXy+0AwAAAAAAYMvUu3fv1NTUFN0GG6lR0Q0AAAAAAADA1k5oBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAACw1fvv//7vDB48OB07dkxFRUV+/vOfb/Dchx56KJWVlenbt+9mrfn1r389FRUVmTBhQqm2aNGijBw5MrvsskuaN2+ebt265aKLLsrq1atLY956660MHz48X/7yl5MkZ5111nprz549OwcccEDatGmT5s2bp1evXrnuuuvKxowfPz4VFRVlP7169VpvrYcffjiHHnpoqqqq0qpVqxx00EF58803N7jfZ555JgMHDswOO+yQZs2apWvXrrnggguyZs2asvP069dvvX6+8IUvlPXbq1evVFVV5Z/+6Z9y2GGH5dFHHy1bY/ny5TnxxBPTqlWrbL/99hk5cmRWrlxZNubOO+9M375906JFi3Tu3DlXXXVV2fGZM2eu10dFRUWWLl1aGrM5/37eU7nRMwAAAAAAAD5j3njjjey555753//7f+f444/f4HkrVqzIsGHDMmjQoPzlL3/Z5DV/9rOf5ZFHHknHjh3L6k8//XTWrl2bm2++Od27d8+TTz6Z0aNH54033sjVV1+dJGloaEjz5s0zdOjQXHbZZe+7flVVVU477bTsscceqaqqyuzZszNmzJhUVVXllFNOKY3r06dPHnzwwdL3ysryKOnhhx/OUUcdlfPOOy833HBDKisrM2/evDRq1GiD+23SpEmGDRuWmpqabL/99pk3b15Gjx6dtWvX5nvf+17pXL/5zW+yxx57JEn+9re/Zc8998yQIUNKx3v06JHvf//76dq1a958881cd911OeKII/Lcc8+lbdu2SZITTzwxL7/8ch544IGsWbMmI0aMyCmnnJL/+I//SJLcd999OfHEE3PDDTfkiCOOSF1dXUaPHp3mzZvntNNOK7v2Z555Jq1atSp9b9euXenzpv77+XtCOwAAAAAAYKt39NFH5+ijj97oeV//+tdzwgknpHHjxuvtrtrQNV966aWcfvrp+c1vflO2kyxJjjrqqBx11FGl7127ds0zzzyTiRMnlkKwqqqqTJw4MXPnzv3A0G6vvfbKXnvtVfrepUuX/PSnP82sWbPKQrvKysq0b9/+A3v91re+lTPOOCPnnntuqdazZ8+N6rdr167p2rVraUznzp0zc+bMzJo1q+xc1dXVpV6mTp2aFi1alIV2J5xwQtn4a6+9NrfcckueeOKJDBo0KHV1dbn//vvz+9//Pp///OeTJDfccEOOOeaYXH311enYsWNuv/32HHfccfn6179e6u28887LFVdckVNPPTUVFRWl9du1a5ftt9/+fe/Lpv77+XsejwkAAAAAALAJJk2alBdeeCEXXXTRJq+xdu3anHzyyTn77LPTp0+fDZrz6quvpnXr1pt8ziT5wx/+kN/97nc5+OCDy+rPPvtsOnbsmK5du+bEE0/MkiVLSseWLVuWRx99NO3atcv++++fHXbYIQcffHBmz569Wf0+99xzuf/++9fr5e/dcsstGTp0aKqqqt73+OrVq/PDH/4w2223Xfbcc88k7+4K3H777UuBXZIcdthhadSoUekxmm+//XaaNWtWtlbz5s3zpz/9KYsXLy6r9+3bNx06dMjhhx+ehx566EOveVMI7QAAAAAAADbSs88+m3PPPTd33HHHeo+Q3BhXXHFFKisrc8YZZ2zQ+Oeeey433HBDxowZs0nn22mnndK0adN8/vOfz6mnnppRo0aVju27776ZPHly7r///kycODEvvvhiBgwYkNdffz1J8sILLyR5911yo0ePzv3335+ampoMGjQozz777Eb3u//++6dZs2bZddddM2DAgFxyySXvu8acOXPy5JNPlvX6nnvvvTctW7ZMs2bNct111+WBBx5IdXV1kmTp0qVlj7BM3t1J2Lp169L76I488sj89Kc/zfTp07N27dosXLgw11xzTZLk5ZdfTpJ06NAhN910U+65557cc8892XnnnXPIIYdk7ty5H3yjN4HHYwIAAAAAAGyEhoaGnHDCCbn44ovTo0ePTV6ntrY2//7v/565c+eWPYbxg7z00ks56qijMmTIkIwePXqTzjlr1qysXLkyjzzySM4999x07949X/3qV5Ok7PGOe+yxR/bdd9907tw5d955Z0aOHJm1a9cmScaMGZMRI0Ykefexm9OnT8+Pf/zjXH755RvV709+8pO8/vrrmTdvXs4+++xcffXVOeecc9Ybd8stt2T33XfPPvvss96xgQMH5vHHH099fX3+7//9v/nyl79c2g24IUaPHp3nn38+X/ziF7NmzZq0atUq3/zmNzN+/PjSe/p69uxZ9gjQ/fffP88//3yuu+663H777Rt0ng1hpx0AAAAAAMBGeP311/PYY4/ltNNOS2VlZSorK3PJJZdk3rx5qayszIwZMzZonVmzZmXZsmXp1KlTaZ3Fixdn7Nix6dKlS9nYP//5zxk4cGD233///PCHP9zk3nfZZZfsvvvuGT16dL71rW9l/PjxHzh2++23T48ePfLcc88leXfHWZJ87nOfKxvXu3fvssdobmi/O++8cz73uc/lq1/9av7P//k/GT9+fBoaGsrGvPHGG5k6dWpGjhz5vmtUVVWle/fu2W+//XLLLbeksrIyt9xyS5Kkffv2WbZsWdn4d955J8uXLy+9K6+ioiJXXHFFVq5cmcWLF2fp0qWlcPDv37v3P+2zzz6l+/JxsdMOAAAAAABgI7Rq1Srz588vq/3gBz/IjBkzcvfdd2eXXXbZoHVOPvnkHHbYYWW1I488MieffHJpJ1vy7o61gQMHpl+/fpk0aVJpB9jmWrt2bd5+++0PPL5y5co8//zzOfnkk5MkXbp0SceOHfPMM8+UjVu4cGHZLr1N6Xft2rVZs2ZNaTffe+666668/fbbOemkkzb6mvr3758VK1aktrY2/fr1S5LMmDEja9euzb777ls2r3Hjxtlxxx2TJP/5n/+Z/v37p23bth94nscff7wUYn5chHYAAAAAAMBWb+XKlWU7p1588cU8/vjjad26dTp16pTzzjsvL730Um677bY0atQou+22W9n8du3apVmzZmX1j1qzTZs2adOmTdk6TZo0Sfv27UuPY3zppZdyyCGHpHPnzrn66qvz17/+tTT2vd1iSbJgwYJSmLZy5co8/vjjSZK+ffsmSW688cZ06tQpvXr1SpL893//d66++uqyd+mNGzcugwcPTufOnfPnP/85F110URo3blx6fGZFRUXOPvvsXHTRRdlzzz3Tt2/f3HrrrXn66adz9913b3C/U6ZMSZMmTbL77runadOmeeyxx3LeeeflK1/5Spo0aVJ2P2655ZYcd9xx692nN954I5dddlmOPfbYdOjQIfX19bnxxhvz0ksvZciQIUne3QF41FFHZfTo0bnpppuyZs2anHbaaRk6dGg6duyYJKmvr8/dd9+dQw45JG+99VYmTZqUu+66K7/97W9L55owYUJ22WWX9OnTJ2+99VZ+9KMfZcaMGZk2bdoG/643hNAOAAAAAADY6j322GMZOHBg6ftZZ52VJPna176WyZMn5+WXX17vEZCbu+aGeOCBB/Lcc8/lueeey0477VR2bN26daXPxxxzTBYvXpzk3Xfl7bXXXmVj1q5dm/POOy8vvvhiKisr061bt1xxxRUZM2ZMaY0//elP+epX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aXnqqady5513ZuXKlamtrd3sfFOnTs1VV12VRx99NM8//3xOPvnkzJw5M//2b/+We++9N3Pnzs2VV15Z2v6NN97IOeeck8WLF2fevHlp0aJFPvWpT2Xjxo3Njnv++efnq1/9aurr6zNy5MjMmDEjN910U2644YY88sgjefXVV/PTn/70Ha9FU1NTZs2alV69eqVz585Jkq5du+YXv/hFVq1a9V4vLQDwAdCq6AEAAAAAIEnuueeelJeXN1u2YcOG0uN99903kyZNKj3/yle+kgcffDC33357DjvssDQ1NeX666/PrFmzMnz48CTJzTffnP3226/ZMf/hH/6h9Lhnz5654oorcuihh6apqanZ+S+55JIMGTIkSXL66afn61//elasWJGePXsmST796U/n4YcfznnnnZckOemkk5qd54YbbkiXLl3y7LPPpl+/fqXlEydOzIknnlh6PnPmzHz9618vLbv22mvz4IMPvuP1eeONN1JZWZl77rknLVr86f8v/xvf+EZOPPHE9OjRI717987gwYNz7LHH5tOf/nRpGwDgg8v/WgMAAADwgXD00Ufnl7/8ZbO/H/7wh6X1GzZsyLRp09K/f//stddeKS8vz4MPPpiGhoYkyYoVK7Ju3bocfvjhpX322muv9OnTp9l56urqMnr06FRVVaVjx4456qijkqR0nD8bMGBA6fE+++yT9u3bl4Ldn5f95ddqLl++PJ/97GfTs2fP7L777unRo8dfPe4hhxxSevz666/nhRdeaDZzq1atmm3z167PokWLMnLkyHziE58o3VlXWVmZxx57LEuXLs1Xv/rVrF+/PqeeempGjRq12d1+AMAHjzvtAAAAAPhA6NChQ3r16tVs2e9+97vS4+nTp+e73/1uZs6cmf79+6dDhw6ZOHFi1q1b967P8cYbb2TkyJEZOXJkZs+enS5duqShoSEjR47c7DitW7cuPS4rK2v2/M/L/jKGjR49Ot27d891112Xbt26ZePGjenXr99mx+3QocO7nvf/3e8vr88Pf/jD7LHHHrnuuutyySWXlJb369cv/fr1y5e+9KV84QtfyJFHHpkFCxbk6KOP3qLzAgDvD3faAQAAALBDWLhwYY4//viMHTs2Bx10UHr27Jlly5aV1u+///5p3bp1Hn/88dKy1157rdk2v/71r/PKK6/kO9/5To488sj07du32d1yW+qVV17Jc889lwsvvDDDhw9PdXV1Xnvttb+53x577JHKyspmM69fvz51dXV/c9+ysrK0aNEib7755ttu85GPfCTJn2IlAPDB5k47AAAAAHYIBxxwQObMmZNHH300e+65Zy677LK89NJLpTBVXl6e008/PZMnT07nzp2z995754ILLmj2e25VVVVp06ZNrrzyynzhC1/IM888k2nTpm31bHvuuWc6d+6cH/zgB6msrExDQ0POP//8d7XvV7/61XznO9/JAQcckL59++ayyy7LmjVrNtvurbfeyosvvpjkTzHyqquuSlNTU0aPHp0k+eIXv5hu3brlmGOOyX777ZcXXnghl1xySbp06ZLBgwdv9WsEALYvd9oBAAAAsEO48MILU1NTk5EjR2bYsGHp2rVrTjjhhGbbTJ8+PUceeWRGjx6dESNG5IgjjsigQYNK67t06ZKbbropP/nJT/KRj3wk3/nOd3LppZdu9WwtWrTIbbfdlrq6uvTr1y//9E//lOnTp7+rfc8999yMGzcup556agYPHpyOHTvmU5/61GbbPfDAA6msrExlZWUOP/zwPPHEE/nJT36SYcOGJUlGjBiRX/ziFxkzZkx69+6dk046KbvttlvmzZuXzp07b/VrBAC2r7JNmzZtKnoIAAAAYNezZMmSDBo0KHV1dampqSl6HICdns/dd2/o0KHp0aNHbrnllqJHId4Pdh3utAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAArWqugBAAAAgF1bfX190SMA7BJ83gJ8sIl2AAAAQCEqKirSvn37jB07tuhRAHYZ7du3T0VFRdFjAPBXiHYAAABAIaqqqlJfX5/Gxsbtdo4JEyaksrIy06ZN227nANgW3q/Pq4qKilRVVW3XcwCwZUQ7AAAAoDBVVVXb9R+Py8vL07lz59TU1Gy3cwBsCz6vAGhR9AAAAAAAAACwqxPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAD4gOjRo0dmzpxZ9BgAf5PPK4BtT7QDAAAAAACAgol2AAAAAAAAUDDRDgAAANilvfHGGxk/fnzKy8tTWVmZGTNmZNiwYZk4cWKSP30F3CWXXFLapnv37rn77rvz8ssv5/jjj095eXkGDBiQxYsXNzvuHXfckQMPPDBt27ZNjx49MmPGjGbrV69endGjR6ddu3b58Ic/nNmzZ28225o1azJhwoR06dIlu+++e4455pg89dRT2+1aAB9sPq8Adm6iHQAAALBLmzx5chYsWJC77rorc+fOzfz587NkyZJm21x++eUZMmRInnzyyXzyk5/MuHHjMn78+IwdOzZLlizJ/vvvn/Hjx2fTpk1Jkrq6upx88sk55ZRTsnTp0kydOjUXXXRRbrrpptIxa2tr8/zzz+fhhx/OnDlzcvXVV2f16tXNzjtmzJisXr06999/f+rq6lJTU5Phw4fn1Vdf3e7XBfjg8XkFsHNrVfQAAAAAAEVpamrK9ddfn1mzZmX48OFJkptvvjn77bdfs+2OPfbYnHXWWUmSKVOm5Jprrsmhhx6aMWPGJEnOO++8DB48OC+99FK6du2ayy67LMOHD89FF12UJOndu3eeffbZTJ8+PbW1tVm2bFnuv//+LFq0KIceemiS5Prrr091dXXpnI888kgWLVqU1atXp23btkmSSy+9NHfeeWfmzJmTM888c/teHOADxecVwM7PnXYAAADALmvFihVZt25dDj/88NKyvfbaK3369Gm23YABA0qP99lnnyRJ//79N1v25ztP6uvrM2TIkGbHGDJkSJYvX54NGzakvr4+rVq1yqBBg0rr+/btm06dOpWeP/XUU2lqakrnzp1TXl5e+vvtb3+bFStWbOUrB3Y0Pq8Adn7utAMAAAD4G1q3bl16XFZW9rbLNm7cuM3O2dTUlMrKysyfP3+zdX/5j+UAf8nnFcCOy512AAAAwC5r//33T+vWrfP444+Xlr322mtZtmzZVh23uro6CxcubLZs4cKF6d27d1q2bJm+fftm/fr1qaurK61/7rnnsmbNmtLzmpqavPjii2nVqlV69erV7K+iomKr5gN2PD6vAHZ+oh0AAACwyyovL8/pp5+eyZMn56GHHsozzzyT2tratGixdf9kcu6552bevHmZNm1ali1blptvvjlXXXVVJk2alCTp06dPRo0albPOOiuPP/546urqMmHChLRr1650jBEjRmTw4ME54YQTMnfu3KxcuTKPPvpoLrjggixevHir5gN2PD6vAHZ+oh0AAACwS5s+fXqOPPLIjB49OiNGjMgRRxzR7LebtkRNTU1uv/323HbbbenXr1+mTJmSiy++OLW1taVtbrzxxnTr1i1HHXVUTjzxxJx55pnZe++9S+vLyspy3333ZejQoTnttNPSu3fvnHLKKVm1alXpN6mAXYvPK4CdW9mmTZs2FT0EAAAAwPYwdOjQ9OjRI7fccst72m/YsGE5+OCDM3PmzO0zGMD/w+fVB8uWvh9sH94PdhXutAMAAAAAAICCiXYAAAAAAABQsFZFDwAAAADwQTN//vyiRwB4V3xeAew83GkHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCtSp6AAAAAAAAeC8aGhrS2Ni43Y7f1NSUV155JUuWLNlu5+Dde7/ej4qKilRVVW3Xc8A7Ee0AAAAAANhhNDQ0pLq6OmvXrt2u53nyySdz3333bddz8O69H+9H+/btU19fL9xRGNEOAAAAAIAdRmNjY9auXZtZs2alurq66HHYSdTX12fs2LFpbGwU7SiMaAcAAAAAwA6nuro6NTU1RY8BsM20KHoAAAAAAAAA2NWJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAfAAMGzYsEydOLHqM96S2tjYnnHBC0WPATkG0AwAAAACAd+ntItX8+fNTVlaWNWvWvO8zfZDU1tamrKys9Ne5c+eMGjUqTz/9dLPtrrvuuhx00EEpLy9Pp06dMnDgwHz7298uaGr4YBDtAAAAAACAd/THP/7xXW87atSovPDCC3nhhRcyb968tGrVKscdd1xp/Q033JCJEyfm7LPPzi9/+cssXLgwX/va19LU1LQ9RocdhmgHAAAAAADb0CuvvJLPfvaz2XfffdO+ffv0798/P/rRj5pt88Ybb2T8+PEpLy9PZWVlZsyYsdlxbr311hxyyCHp2LFjunbtms997nNZvXp1af2f7+578MEHM3DgwLRr1y7HHHNMVq9enfvvvz/V1dXZfffd87nPfS5r164t7ffAAw/kiCOOSKdOndK5c+ccd9xxWbFiRWn9ypUrU1ZWlh//+Mc56qijsttuu2X27NnZsGFDzjnnnNJ+X/va17Jp06bN5m7btm26du2arl275uCDD87555+f559/Pi+//HKS5O67787JJ5+c008/Pb169cqBBx6Yz372s/nmN7+51dcedmSiHQAAAAAAbEN/+MMfMmjQoNx777155plncuaZZ2bcuHFZtGhRaZvJkydnwYIFueuuuzJ37tzMnz8/S5YsaXacP/7xj5k2bVqeeuqp3HnnnVm5cmVqa2s3O9/UqVNz1VVX5dFHH83zzz+fk08+OTNnzsy//du/5d57783cuXNz5ZVXlrZ/4403cs4552Tx4sWZN29eWrRokU996lPZuHFjs+Oef/75+epXv5r6+vqMHDkyM2bMyE033ZQbbrghjzzySF599dX89Kc/fcdr0dTUlFmzZqVXr17p3LlzkqRr1675xS9+kVWrVr3XSws7tVZFDwAAAAAAADuSe+65J+Xl5c2WbdiwofR43333zaRJk0rPv/KVr+TBBx/M7bffnsMOOyxNTU25/vrrM2vWrAwfPjxJcvPNN2e//fZrdsx/+Id/KD3u2bNnrrjiihx66KFpampqdv5LLrkkQ4YMSZKcfvrp+frXv54VK1akZ8+eSZJPf/rTefjhh3PeeeclSU466aRm57nhhhvSpUuXPPvss+nXr19p+cSJE3PiiSeWns+cOTNf//rXS8uuvfbaPPjgg+94fd54441UVlbmnnvuSYsWf7qP6Bvf+EZOPPHE9OjRI717987gwYNz7LHH5tOf/nRpG9gV+a8fAAAAAADeg6OPPjq//OUvm/398Ic/LK3fsGFDpk2blv79+2evvfZKeXl5HnzwwTQ0NCRJVqxYkXXr1uXwww8v7bPXXnulT58+zc5TV1eX0aNHp6qqKh07dsxRRx2VJKXj/NmAAQNKj/fZZ5+0b9++FOz+vOwvv1Zz+fLl+exnP5uePXtm9913T48ePf7qcQ855JDS49dffz0vvPBCs5lbtWrVbJu/dn0WLVqUkSNH5hOf+ETpzrrKyso89thjWbp0ab761a9m/fr1OfXUUzNq1KjN7vaDXYk77QAAAAAA4D3o0KFDevXq1WzZ7373u9Lj6dOn57vf/W5mzpyZ/v37p0OHDpk4cWLWrVv3rs/xxhtvZOTIkRk5cmRmz56dLl26pKGhISNHjtzsOK1bty49Lisra/b8z8v+MoaNHj063bt3z3XXXZdu3bpl48aN6dev32bH7dChw7ue9//d7y+vzw9/+MPsscceue6663LJJZeUlvfr1y/9+vXLl770pXzhC1/IkUcemQULFuToo4/eovPCjs6ddgAAAAAAsA0tXLgwxx9/fMaOHZuDDjooPXv2zLJly0rr999//7Ru3TqPP/54adlrr73WbJtf//rXeeWVV/Kd73wnRx55ZPr27dvsbrkt9corr+S5557LhRdemOHDh6e6ujqvvfba39xvjz32SGVlZbOZ169fn7q6ur+5b1lZWVq0aJE333zzbbf5yEc+kuRPsRJ2Ve60AwAAAACAbeiAAw7InDlz8uijj2bPPffMZZddlpdeeqkUpsrLy3P66adn8uTJ6dy5c/bee+9ccMEFzX7PraqqKm3atMmVV16ZL3zhC3nmmWcybdq0rZ5tzz33TOfOnfODH/wglZWVaWhoyPnnn/+u9v3qV7+a73znOznggAPSt2/fXHbZZVmzZs1m27311lt58cUXk/wpRl511VVpamrK6NGjkyRf/OIX061btxxzzDHZb7/98sILL+SSSy5Jly5dMnjw4K1+jbCjcqcdAAAAAABsQxdeeGFqamoycuTIDBs2LF27ds0JJ5zQbJvp06fnyCOPzOjRozNixIgcccQRGTRoUGl9ly5dctNNN+UnP/lJPvKRj+Q73/lOLr300q2erUWLFrnttttSV1eXfv365Z/+6Z8yffr0d7Xvueeem3HjxuXUU0/N4MGD07Fjx3zqU5/abLsHHngglZWVqayszOGH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jzzySH7xi1/kgAMOyLHHHpvf//73SZI77rgjl19+eb7//e9n+fLlufPOO9O/f//S/l/+8pfz2GOP5bbbbsvTTz+dMWPGZNSoUVm+fHmS5Omnn87rr7+eQw45pLTP4sWLc/bZZ+fiiy/Oc889lwceeCBDhw5N8qffq6urq8uIESNK27do8ad/Dl66dGmz13nYYYfl5z//+ba6bABsoVZFDwAAAAAA8EGyadOmzJs3Lw8++GC+8pWvlJZ//etfL0WzL3/5y7n44otL64455phmx/jBD36QTp06ZcGCBTnuuOPS0NCQrl27ZsSIEWndunWqqqpy2GGHJUkaGhpy4403pqGhId26dUuSTJo0KQ888EBuvPHGfOtb38qqVavSsmXL7L333qVzNDQ0pEOHDjnuuOPSsWPHdO/ePQMHDkySNDY2ZsOGDdlnn302e32NjY3Nnnfr1i2rVq3amksGwDbgTjsAAAAAgCT33HNPysvLs9tuu+UTn/hEPvOZz2Tq1Kml9R/60IdKjysrK7N69erS85deeilnnHFGDjjggOyxxx7Zfffd09TUlIaGhiTJmDFj8uabb6Znz54544wz8tOf/jTr169P8qc73zZs2JDevXunvLy89LdgwYKsWLEiSfLmm2+mbdu2KSsrK53z4x//eLp3756ePXtm3LhxmT17dtauXfueX3e7du22aD8Ati132gEAAAAAJDn66KNzzTXXpE2bNunWrVtatXr7fz4tKyvLpk2bSs9PPfXUvPLKK/nud7+b7t27p23bthk8eHDp6zU/9KEP5bnnnsvPfvaz/Od//me+9KUvZfr06VmwYEGamprSsmXL1NXVpWXLls3OU15eniSpqKjI2rVrs27durRp0yZJ0rFjxyxZsiTz58/P3LlzM2XKlEydOjVPPPFEKioq0rJly7z00kubzV5RUdHs+auvvpouXbps2UUDYJtxpx0AAAAAQJIOHTqkV69eqaqqesdg99csXLgwZ599do499tgceOCBadu27WZfQ9muXbuMHj06V1xxRebPn5/HHnssS5cuzcCBA7Nhw4asXr06vXr1avbXtWvXJMnBBx+cJHn22WebHbNVq1YZMWJE/vVf/zVPP/10Vq5cmYceeiht2rTJoEGDMm/evNK2GzduTJJmv6WXJM8880zpazUBKI477QAAAAAAttIBBxyQW2+9NYccckj+93//N5MnT067du1K62+66aZs2LAhhx9+eNq3b59Zs2alXbt26d69ezp37pzPf/7zGT9+fGbMmJGBAwfm5Zdfzrx58zJgwIB88pOfTJcuXVJTU5NHHnmkFPDuueee/OY3v8nQoUOz55575r777svGjRvTp0+fJMk555yTU089NYccckgOO+ywfPvb306S/P3f/32z2X/+859n2rRp78+FAuBtudMOAAAAAGArXX/99XnttddSU1OTcePG5eyzz87ee+9dWt+pU6dcd911GTJkSAYMGJCf/exn+Y//+I907tw5SXLjjTdm/PjxOffcc9OnT5+ccMIJeeKJJ1JVVVU6xoQJEzJ79uxmx/z3f//3HHPMMamurs61116bH/3oRznwwAOTJJ/5zGdy6aWXZsqUKTn44IPz3HPPJUnpnEny2GOP5fXXX8+nP/3p7Xp9APjbyjb95RcvAwAAAOxEhg4dmh49euSWW24pehRgB7ZkyZIMGjQodXV1qampKWyON998M3369MmPf/zjDB48+D3v/9dex2c+85kcdNBB+ed//udtPe4Ozf9+fLB4P9hVuNMOAAAAAGAH0K5du9xyyy2b/Vbellq3bl369++ff/qnf9omxwNg6/hNOwAAAACAHcSwYcO22bHatGmTCy+8cJsdD4Ct4047AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFaFT0AAAAAAMCOoL6+vugRtsqOPj/Azk60AwAAAAB4BxUVFWnfvn3Gjh1b9ChbrX379qmoqCh6DAD+CtEOAAAAAOAdVFVVpb6+Po2NjdvtHBMmTEhlZWWmTZu23c6R/ClAVlVVbddzALBlRDsAAAAAgL+hqqpqu8au8vLydO7cOTU1NdvtHAB8sLUoegAAAAAAAADY1Yl2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAA8J706NEjM2fOLHoMgJ2KaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAMAO4I033sj48eNTXl6eysrKzJgxI8OGDcvEiROT/OkrKy+55JLSNt27d8/dd9+dl19+Occff3zKy8szYMCALF68uNlx77jjjhx44IFp27ZtevTokRkzZjRbv3r16owePTrt2rXLhz/84cyePXuz2dasWZMJEyakS5cu2X333XPMMcfkqaee2m7XAmBnJNoBAAAAAOwAJk+enAULFuSuu+7K3LlzM3/+/CxZsqTZNpdffnmGDBmSJ598Mp/85Cczbty4jB8/PmPHjs2SJUuy//77Z/z48dm0aVOSpK6uLieffHJOOeWULF26NFOnTs1FF12Um266qXTM2traPP/883n44YczZ86cXH311Vm9enWz844ZMyarV6/O/fffn7q6utTU1GT48OF59dVXt/t1AdhZtCp6AAAAAAAA3llTU1Ouv/76zJo1K8OHD0+S3Hzzzdlvv/2abXfsscfmrLPOSpJMmTIl11xzTQ499NCMGTMmSXLeeedl8ODBeemll9K1a9dcdtllGT58eC666KIkSe/evfPss89m+vTpqa2tzbJly3L//fdn0aJFOfTQQ5Mk119/faqrq0vnfOSRR7Jo0aKsXr06bdu2TZJceumlufPOOzNnzpyceeaZ2/fiAOwk3GkHAAAAAPABt2LFiqxbty6HH354adlee+2VPn36NNtuwIABpcf77LNPkqR///6bLfvznXL19fUZMmRIs2MMGTIky5cvz4YNG1JfX59WrVpl0KBBpfV9+/ZNp06dSs+feuqpNDU1pXPnzikvLy/9/fa3v82KFSu28pUD7DrcaQcAAAAAsJNo3bp16XFZWdnbLtu4ceM2O2dTU1MqKyszf/78zdb9ZdwD4J250w4AAAAA4ANu//33T+vWrfP444+Xlr322mtZtmzZVh23uro6CxcubLZs4cKF6d27d1q2bJm+fftm/fr1qaurK61/7rnnsmbNmtLzmpqavPjii2nVqlV69erV7K+iomKr5gPYlYh2AAAAAAAfcOXl5Tn99NMzefLkPPTQQ3nmmWdSW1ubFi227p94zz333MybNy/Tpk3LsmXLcvPNN+eqq67KpEmTkiR9+vTJqFGjctZZZ+Xxxx9PXV1dJkyYkHbt2pWOMWLEiAwePDgnnHBC5s6dm5UrV+bRRx/NBRdckMWLF2/VfAC7EtEOAAAAAGAHMH369Bx55JEZPXp0RowYkSOOOKLZb81tiZqamtx+++257bbb0q9fv0yZMiUXX3xxamtrS9vceOON6datW4466qiceOKJOfPMM7P33nuX1peVleW+++7L0KFDc9ppp6V379455ZRTsmrVqtJv6AHwt/lNOwAAAACAHUB5eXluvfXW3HrrraVl9957b+nxypUrN9tn06ZNzZ736NFjs2UnnXRSTjrppLc9b9euXXPPPfc0WzZu3Lhmzzt27JgrrrgiV1xxxd98HQD8de60AwAAAAAAgIKJdgAAAAAAAFAwX48JAAAAALCDmj9/ftEjALCNuNMOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFa1X0AAAAAAAAwI6roaEhjY2N2+34TU1NeeWVV7JkyZLtdo4kqaioSFVV1XY9B7wT0Q4AAAAAANgiDQ0Nqa6uztq1a7freZ588sncd9992/Uc7du3T319vXBHYUQ7AAAAAABgizQ2Nmbt2rWZNWtWqqurix5ni9XX12fs2LFpbGwU7SiMaAcAAAAAAGyV6urq1NTUFD0G7NBaFD0AAAAAAAAA7OpEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAFvk7rvvLnqEknHjxuVb3/rWNjveRz/60dxxxx3b7Hjwt4h2AAAAAADA26qtrU1ZWVnKysrSpk2b9OrVKxdffHHWr19f9GglTz31VO67776cffbZ72r7//qv/8ro0aPTrVu3lJWV5eGHH95smwsvvDDnn39+Nm7cuK3Hhb9KtAMAAAAAAN7RqFGj8sILL2T58uU599xzM3Xq1EyfPr3osUquvPLKjBkzJuXl5e9q+zfeeCMHHXRQvve9773tNp/4xCfy+9//Pvfff/+2GhPekWgHAAAAAAC8o7Zt26Zr167p3r17vvjFL2bEiBHNvhrz0UcfTXV1dcrLy0uB78+eeOKJfPzjH09FRUX22GOPHHXUUVmyZElp/aZNmzJ16tRUVVWlbdu26datW7M75t56661MmjQp++67bzp06JDDDz888+fPL63fsGFD5syZk9GjRzeb+eqrr84BBxyQ3XbbLfvss08+/elPl9Z94hOfyCWXXJJPfepTb/uaW7ZsmWOPPTa33XbbFl0zeK9EOwAAAAAA4D1p165d1q1bV3o+a9as3Hrrrfmv//qvNDQ0ZNKkSaV1v//973PqqafmkUceyS9+8YsccMABOfbYY/P73/8+SXLHHXfk8ssvz/e///0sX748d955Z/r371/a/8tf/nIee+yx3HbbbXn66aczZsyYjBo1KsuXL0+SPP3003n99ddzyCGHlPZZvHhxzj777Fx88cV57rnn8sADD2To0KHv+XUedthh+fnPf/6e94Mt0aroAQAAAAAAgB3Dpk2bMm/evDz44IP5yle+Ulr+9a9/vRTNvvzlL+fiiy8urTvmmGOaHeMHP/hBOnXqlAULFuS4445LQ0NDunbtmhEjRqR169apqqrKYYcdliRpaGjIjTfemIaGhnTr1i1JMmnSpDzwwAO58cYb861vfSurVq1Ky5Yts/fee5fO0dDQkA4dOuS4445Lx44d07179wwcOPA9v95u3brl+eefz8aNG9Oihfug2L78FwYAAAAAALyje+65J+Xl5dltt93yiU98Ip/5zGcyderU0voPfehDpceVlZVZvXp16flLL72UM844IwcccED22GOP7L777mlqakpDQ0OSZMyYMXnzzTfTs2fPnHHGGfnpT3+a9evXJ0mWLl2aDRs2pHfv3ikvLy/9LViwICtWrEiSvPnmm2nbtm3KyspK5/z4xz+e7t27p2fPnhk3blxmz56dtWvXvufX3a5du2zcuDFvvfXWe94X3it32gEAAAAAAO/o6KOPzjXXXJM2bdqkW7duadXq7fNCWVlZNm3aVHp+6qmn5pVXXsl3v/vddO/ePW3bts3gwYNLX6/5oQ99KM8991x+9rOf5T//8z/zpS99KdOnT8+CBQvS1NSUli1bpq6uLi1btmx2nvLy8iRJRUVF1q5dm3Xr1qVNmzZJko4dO2bJkiWZP39+5s6dmylTpmTq1Kl54okn0qlTp3f9ul999dV06NAh7dq1e9f7wJYS7QAAAAAAgHfUoUOH9OrVa4v2XbhwYa6++uoce+yxSZLnn38+jY2NzbZp165dRo8endGjR+cf//Ef07dv3yxdujQDBw7Mhg0bsnr16hx55JF/9fgHH3xwkuTZZ58tPU6SVq1aZcSIERkxYkS+8Y1vpFOnTnnooYdy4oknvuvZn3nmmS36Wk3YEqIdAAAAAACw3RxwwAG59dZbc8ghh+R///d/M3ny5GZ3rt10003ZsGFDDj/88LRv3z6zZs1Ku3bt0r1793Tu3Dmf//znM378+MyYMSMDBw7Myy+/nHnz5mXAgAH55Cc/mS5duqSmpiaPPPJIKdrdc889+c1vfpOhQ4dmzz33zH333ZeNGzemT58+SZKmpqb893//d2mG//mf/0mSvPDCC81m//nPf56/+7u/285XCP7Eb9oBAAAAAADbzfXXX5/XXnstNTU1GTduXM4+++zsvffepfWdOnXKddddlyFDhmTAgAH52c9+lv/4j/9I586dkyQ33nhjxo8fn3PPPTd9+vTJCSeckCeeeCJVVVWlY0yYMCGzZ89udsx///d/zzHHHJPq6upce+21+dGPfpQDDzwwSbJ48eIMHDiwdBfdZZddliS59tprS8f4v//3/+bRRx/Naaedtv0uDvyFsk1/+cWyAAAAADuRoUOHpkePHrnllluKHgXgHfm8+mDxfrx7S5YsyaBBg1JXV5eamprC5njzzTfTp0+f/PjHP87gwYPf8/5/7XWcd955ee211/KDH/xgW48Lf5WvxwQAAAAAAHZo7dq1yy233LLZb+Vtjb333jvnnHPONjse/C2iHQAAAAAAsMMbNmzYNj3eueeeu02PB3+L37QDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFKxV0QMAAAAAAAA7tvr6+qJH2Co7+vzsHEQ7AAAAAABgi1RUVKR9+/YZO3Zs0aNstfbt26eioqLoMdiFiXYAAAAAAMAWqaqqSn19fRobG7fbOSZMmJDKyspMmzZtu50j+VOArKqq2q7ngHci2gEAAAAAAFusqqpqu8au8vLydO7cOTU1NdvtHPBB0KLoAQAAAAAAAGBXJ9oBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAsI306NEjM2fOLHoMdkCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAMAO7Y033sj48eNTXl6eysrKzJgxI8OGDcvEiROT/OkrKy+55JLSNt27d8/dd9+dl19+Occff3zKy8szYMCALF68uNlx77jjjhx44IFp27ZtevTokRkzZjRbv3r16owePTrt2rXLhz/84cyePXuz2dasWZMJEyakS5cu2X333XPMMcfkqaee2m7Xgh2XaAcAAAAAAOzQJk+enAULFuSuu+7K3LlzM3/+/CxZsqTZNpdffnmGDBmSJ598Mp/85Cczbty4jB8/PmPHjs2SJUuy//77Z/z48dm0aVOSpK6uLieffHJOOeWULF26NFOnTs1FF12Um266qXTM2traPP/883n44YczZ86cXH311Vm9enWz844ZMyarV6/O/fffn7q6utTU1GT48OF59dVXt/t1YcfSqugBAAAAAAAAtlRTU1Ouv/76zJo1K8OHD0+S3Hzzzdlvv/2abXfsscfmrLPOSpJMmTIl11xzTQ499NCMGTMmSXLeeedl8ODBeemll9K1a9dcdtllGT58eC666KIkSe/evfPss89m+vTpqa2tzbJly3L//fdn0aJFOfTQQ5Mk119/faqrq0vnfOSRR7Jo0aKsXr06bdu2TZJceumlufPOOzNnzpyceeaZ2/fisENxpx0AAAAAALDDWrFiRdatW5fDDz+8tGyvvfZKnz59mm03YMCA0uN99tknSdK/f//Nlv35Trn6+voMGTKk2TGGDBmS5cuXZ8OGDamvr0+rVq0yaNCg0vq+ffumU6dOpedPPfVUmpqa0rlz55SXl5f+fvvb32bFihVb+crZ2bjTDgAAAAAA2Om1bt269LisrOxtl23cuHGbnbOpqSmVlZWZP3/+Zuv+Mu5B4k47AAAAAABgB7b//vundevWefzxx0vLXnvttSxbtmyrjltdXZ2FCxc2W7Zw4cL07t07LVu2TN++fbN+/frU1dWV1j/33HNZs2ZN6XlNTU1efPHFtGrVKr169Wr2V1FRsVXzsfMR7QAAAAAAgB1WeXl5Tj/99EyePDkPPfRQnnnmmdTW1qZFi61LIOeee27mzZuXadOmZdmyZbn55ptz1VVXZdKkSUmSPn36ZNSoUTnrrLPy+OOPp66uLhMmTEi7du1KxxgxYkQGDx6cE044IXPnzs3KlSvz6KOP5oILLsjixYu3aj52PqIdAAAAAACwQ5s+fXqOPPLIjB49OiNGjMgRRxzR7LfmtkRNTU1uv/323HbbbenXr1+mTJmSiy++OLW1taVtbrzxxnTr1i1HHXVUTjzxxJx55pnZe++9S+vLyspy3333ZejQoTnttNPSu3fvnHLKKVm1alXpN/Tgz/ymHQAAAAAAsEMrLy/PrbfemltvvbW07N577y09Xrly5Wb7bNq0qdnzHj16bLbspJNOykknnfS25+3atWvuueeeZsvGjRvX7HnHjh1zxRVX5Iorrvibr4NdmzvtAAAAAAAAoGCiHQAAAAAAABTM12MCAAAAAAA7nfnz5xc9Arwn7rQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBWhU9AADw/mtoaEhjY2PRY2y1ioqKVFVVFT0GAAAAAGw10Q4AdjENDQ2prq7O2rVrix5lq7Vv3z719fXCHQAAAAA7PNEOAHYxjY2NWbt2bWbNmpXq6uqix9li9fX1GTt2bBobG0U7AAAAAHZ4oh0A7KKqq6tTU1NT9BgAAAAAQJIWRQ8AAAAAAAAAuzrRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAKMW7cuHzrW99qtuy5555L165d8/vf/36Lj9vY2Ji99947v/vd75otP+WUUzJjxowtPi4AAAAAbE+iHQDs4F588cV85StfSc+ePdO2bdt86EMfyujRozNv3rztet6bbropnTp12qJ9n3rqqdx33305++yzmy3/+te/nq985Svp2LFjkuQPf/hDamtr079//7Rq1SonnHDC3zx2RUVFxo8fn2984xvNll944YX55je/mddff32LZgYAAACA7Um0A4Ad2MqVKzNo0KA89NBDmT59epYuXZoHHnggRx99dP7xH//xr+7zxz/+8X2ecnNXXnllxowZk/Ly8tKyhoaG3HPPPamtrS0t27BhQ9q1a5ezzz47I0aMeNfHP+200zJ79uy8+uqrpWX9+vXL/vvvn1mzZm2T1wAAAAAA25JoBwA7sC996UspKyvLokWLctJJJ6V379458MADc8455+QXv/hFkqSsrCzXXHNN/v7v/z4dOnTIDTfckCSZP39+ampqsttuu6Vnz575l3/5l6xfv7507Msuuyz9+/dPhw4d8qEPfShf+tKX0tTUVNr3tNNOy+uvv56ysrKUlZVl6tSpSZK33norkyZNyr777psOHTrk8MMPz/z580vH3bBhQ+bMmZPRo0c3ey233357DjrooOy7776lZR06dMg111yTM844I127dn3X1+XAAw9Mt27d8tOf/rTZ8tGjR+e2225718cBAAAAgPeLaAcAO6hXX301DzzwQP7xH/8xHTp02Gz9X3515dSpU/OpT30qS5cuzd///d8nSaZMmZKvfvWrefbZZ/P9738/N910U775zW+W9mnRokWuuOKK/OpXv8rNN9+chx56KF/72teSJB/72Mcyc+bM7L777nnhhRfywgsvZNKkSUmSL3/5y3nsscdy22235emnn86YMWMyatSoLF++PEny9NNP5/XXX88hhxzSbN6f//znmy3bGocddlh+/vOfb7Zs0aJFeeutt7bZeQAAAABgWxDtAGAH9d///d/ZtGlT+vbt+ze3/dznPpfTTjstPXv2TGVlZZKktrY2p556anr27JmPf/zjmTZtWr7//e+X9pk4cWKOPvro9OjRI8ccc0wuueSS3H777UmSNm3aZI899khZWVm6du2arl27pry8PA0NDbnxxhvzk5/8JEceeWT233//TJo0KUcccURuvPHGJMmqVavSsmXL7L333s1mXLVqVbp167atLk+6deuWVatWbbZs3bp1efHFF7fZeQAAAABgW2hV9AAAwJbZtGnTu972r93B9sMf/jA33XRT6fmGDRvyhz/8IWvXrk379u3zs5/9LN/+9rfz61//Ov/7v/+b9evXN1v/1yxdujQbNmxI7969my1/66230rlz5yTJm2++mbZt26asrKzZNm+++WZ22223d/2a/pZ27dpl7dq1my1LstlyAAAAACiaaAcAO6gDDjggZWVl+fWvf/03t/1rX5951lln5Stf+cpmy3fbbbesXLkyxx13XL74xS/mm9/8Zvbaa6888sgjOf3007Nu3bq3jXZNTU1p2bJl6urq0rJly2brysvLkyQVFRVZu3Zt1q1blzZt2pTWV1RU5LXXXvubr+XdevXVV9OlS5fNliXZbDkAAAAAFE20A4Ad1F577ZWRI0fme9/7Xs4+++zNwtyaNWua/a7d/2vVqlXp1avXX11XV1eXjRs3ZsaMGWnR4k/fpv3nr8b8szZt2mTDhg3Nlg0cODAbNmzI6tWrc+SRR/7VYx988MFJkmeffbb0+M/7Pvvss28773v1zDPPZNiwYZst22+//VJRUbHNzgMAAAAA24LftAOAHdj3vve9bNiwIYcddljuuOOOLF++PPX19bniiisyePDgd9z3nnvuyb/8y7/kV7/6Verr63PbbbflwgsvTJL06tUrf/zjH3PllVfmN7/5TW699dZce+21zfbv0aNHmpqaMm/evDQ2Nmbt2rXp3bt3Pv/5z2f8+PH593//9/z2t7/NokWL8u1vfzv33ntvkj/d5VZTU5NHHnmk2fFGjhyZxx57bLMQ+Oyzz+aXv/xlXn311bz++uv55S9/mV/+8pfv+NrWrl2burq6/N3f/V2z5T//+c83WwYAAAAAHwSiHQDswHr27JklS5bk6KOPzrnnnpt+/frl4x//eObNm5drrrnmHfedOXNm5s6dm0MPPTQf/ehHc/nll6d79+5JkoMOOiiXXXZZ/s//+T/p169fZs+enW9/+9vN9v/Yxz6WL3zhC/nMZz6TLl265F//9V+TJDfeeGPGjx+fc889N3369MkJJ5yQJ554IlVVVaV9J0yYkNmzZzc73ic+8Ym0atUqP/vZz5otP/bYYzNw4MD8x3/8R+bPn5+BAwdm4MCBpfX/8z//k7KyssyfP7+07K677kpVVVWzu/3+8Ic/5M4778wZZ5zxLq4sAAAAALy/yjZt2rSp6CEAgPfPkiVLMmjQoNTV1aWmpqaQGd5888306dMnP/7xj5vdEfi9730vd999dx588MG/eYw/v45rr702559/fn7zm99kzz33TJJ89KMfzdlnn53Pfe5zpe2vueaa/PSnP83cuXO3/QsCAD6whg4dmh49euSWW24pehSAd+Tz6oPF+/HB4v1gV+E37QCA9127du1yyy23pLGxsdnys846K2vWrMnvf//7dOzY8V0da+HChfnnf/7nUrBrbGzMiSeemM9+9rPNtmvdunWuvPLKbfMCAAAAAGAbE+0AgEIMGzZss2WtWrXKBRdc8J6OM3HixGZ3DFZUVORrX/vaZttNmDDhPc8IAAAAAO8Xv2kHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAVrVfQAAEAx6uvrix5hq+zo8wMAAADAXxLtAGAXU1FRkfbt22fs2LFFj7LV2rdvn4qKiqLHAAAAAICtJtoBwC6mqqoq9fX1aWxs3G7nmDBhQiorKzNt2rTtdo7kTwGyqqpqu54DAAAAAN4Poh0A7IKqqqq2a+wqLy9P586dU1NTs93OAQAAAAA7kxZFDwAAAAAAAAC7OtEOAAAAAAAACibaAQAAAAAAQMFEOwBgl9ejR4/MnDmz6DEAAAAA2IWJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAIV44403Mn78+JSXl6eysjIzZszIsGHDMnHixCR/+srKSy65pLRN9+7dc/fdd+fll1/O8ccfn/Ly8gwYMCCLFy9udtw77rgjBx54YNq2bZsePXpkxowZzdavXr06o0ePTrt27fLhD384s2fP3my2NWvWZMKECenSpUt23333HHPMMXnqqae227UAAAAAANEOACjE5MmTs2DBgtx1112ZO3du5s+fnyVLljTb5vLLL8+QIUPy5JNP5pOf/GTGjRuX8ePHZ+zYsVmyZEn233//jB8/Pps2bUqS1NXV5eSTT84pp5ySpUuXZurUqbnoooty0003lY5ZW1ub559/Pg8//HDmzJmTq6++OqtXr2523jFjxmT16tW5//77U1dXl5qamgwfPjyvvvrqdr8uAAAAAOyaWhU9AACw62lqasr111+fWbNmZfjw4UmSm2++Ofvtt1+z7Y499ticddZZSZIpU6bkmmuuyaGHHpoxY8YkSc4777wMHjw4L730Urp27ZrLLrssw4cPz0UXXZQk6d27d5599tlMnz49tbW1WbZsWe6///4sWrQohx56aJLk+uuvT3V1demcjzzySBYtWpTVq1enbdu2SZJLL700d955Z+bMmZMzzzxz+14cAAAAAHZJ7rQDAN53K1asyLp163L44YeXlu21117p06dPs+0GDBhQerzPPvskSfr377/Zsj/fKVdfX58hQ4Y0O8aQIUOyfPnybNiwIfX19WnVqlUGDRpUWt+3b9906tSp9Pypp55KU1NTOnfunPLy8tLfb3/726xYsWIrXzkAAAAA/HXutAMAPrBat25delxWVva2yzZu3LjNztnU1JTKysrMnz9/s3V/GfcAAAAAYFtypx0A8L7bf//907p16zz++OOlZa+99lqWLVu2Vcetrq7OwoULmy1buHBhevfunZYtW6Zv375Zv3596urqSuufe+65rFmzpvS8pqYmL774Ylq1apVevXo1+6uoqNiq+QAAAADg7Yh2AMD7rry8PKeffnomT56chx56KM8880xqa2vTosXW/Z8m5557bubNm5dp06Zl2bJlufnmm3PVVVdl0qRJSZI+ffpk1KhROeuss/L444+nrq4uEyZMSLt27UrHGDFiRAYPHpwTTjghc+fOzcqVK/Poo4/mggsuyOLFi7dqPgAAAAB4O6IdAFCI6dOn58gjj8zo0aMzYsSIHHHEEc1+a25L1NTU5Pbbb89tt92Wfv36ZcqUKbn44otTW1tb2ubGG29Mt27dctRRR+XEE0/MmWeemb333ru0vqysLPfdd1+GDh2a0047Lb17984pp5ySVatWlX5DDwAAAAC2Nb9pBwAUory8PLfeemtuvfXW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AAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAADAexg1alS+/e1vN2t77rnnUlVVlf/93//90PM2NjbmkEMOyX//9383ax8xYkQmT578oecFAABg9yS0AwAAdoq1a9fmy1/+crp27Zo2bdrk8MMPz9ChQzNv3rwWXXf69Onp0KHDhzp36dKlefDBB/OVr3ylWfs3vvGNfPnLX0779u2TJL///e9TV1eXY489NuXl5Tn//PPfd+7KysqMHj0611xzTbP2b37zm/nWt76VV1999UPVDAAAwO5JaAcAALS4lStX5oQTTsjDDz+cG264Ic8880x++tOf5owzzsgXv/jFdzznzTff3MlVbu2WW27J8OHDU1FRUWpbvXp17r///tTV1ZXaNm/enLZt2+YrX/lKBg0atM3zjxkzJnfeeWdefvnlUtsxxxyTbt26ZebMmTvkGgAAANg9CO0AAIAW94UvfCFlZWVZsGBBhg0blh49euToo4/O1772tTzxxBNJkrKyskydOjXnnntu9t9///zjP/5jkqS+vj61tbXZb7/90rVr11x77bV56623SnPfeOONOfbYY7P//vvn8MMPzxe+8IU0NTWVzh0zZkxeffXVlJWVpaysLBMmTEiSvPHGG7n88svzkY98JPvvv3/69u2b+vr60rybN2/O7NmzM3To0GbXctddd+W4447LRz7ykVLb/vvvn6lTp+aiiy5KVVXVNn8vRx99dDp37px//dd/bdY+dOjQzJo1a5vnAQAAYPcntAMAAFrUyy+/nJ/+9Kf54he/mP3333+r/j99dOWECRPyN3/zN3nmmWdy7rnnJknGjx+fv/u7v8uyZcvyox/9KNOnT8+3vvWt0jn77LNPbr755vzyl7/MjBkz8vDDD+fKK69Mkpx88sm56aabcsABB2TNmjVZs2ZNLr/88iTJl770pTz++OOZNWtWnn766QwfPjxDhgzJ888/nyR5+umn8+qrr+bEE09sVu8jjzyyVdv2OOmkk/LII49s1bZgwYK88cYbO2wdAAAAdm1COwAAoEX9+te/zpYtW9KrV6/3Hfu3f/u3GTNmTLp27ZpOnTolSerq6vKZz3wmXbt2zVlnnZWJEyfmRz/6UemcSy+9NGeccUa6dOmSM888M9dff33uuuuuJMm+++6bAw88MGVlZamqqkpVVVUqKiqyevXqTJs2LXfffXdOPfXUdOvWLZdffnlOOeWUTJs2LUmyatWqtGrVKoccckizGletWpXOnTvvqK8nnTt3zqpVq7Zq27RpU9auXbvD1gEAAGDXVl50AQAAwJ5ty5Yt2zz2nXaw/fjHP8706dNLx5s3b87vf//7bNy4Me3atcvPfvazTJo0Kb/61a/yu9/9Lm+99Vaz/nfyzDPPZPPmzenRo0ez9jfeeCMdO3ZMkrz++utp06ZNysrKmo15/fXXs99++23zNb2ftm3bZuPGjVu1JdmqHQAAgD2X0A4AAGhRf/mXf5mysrL86le/et+x7/T4zEsuuSRf/vKXt2rfb7/9snLlynz84x/P5z//+XzrW9/KQQcdlEcffTQXXnhhNm3a9K6hXVNTU1q1apVFixalVatWzfoqKiqSJJWVldm4cWM2bdqUfffdt9RfWVmZV1555X2vZVu9/PLLOfjgg7dqS7JVOwAAAHsuoR0AANCiDjrooAwePDg/+MEP8pWvfGWrYG7Dhg3N3mv351atWpXu3bu/Y9+iRYvy9ttvZ/Lkydlnnz88/f+Pj8b8o3333TebN29u1nb88cdn8+bNWbduXU499dR3nPuv/uqvkiTLli0rff7jucuWLXvXej+oZ599NgMGDNiq7bDDDktlZeUOWwcAAIBdm3faAQAALe4HP/hBNm/enJNOOin33HNPnn/++TQ0NOTmm29Ov3793vPc+++/P9dee21++ctfpqGhIbNmzco3v/nNJEn37t3z5ptv5pZbbsl//dd/5Y477sgPf/jDZud36dIlTU1NmTdvXhobG7Nx48b06NEjn/70pzN69Oj8y7/8S1544YUsWLAgkyZNygMPPJDkD7vcamtr8+ijjzabb/DgwXn88ce3CgKXLVuWJUuW5OWXX86rr76aJUuWZMmSJe95bRs3bsyiRYvy13/9183aH3nkka3aAAAA2LMJ7QAAgBbXtWvXLF68OGeccUYuu+yyHHPMMTnrrLMyb968TJ069T3PvemmmzJ37tz06dMnH/3oRzNlypQcccQRSZLjjjsuN954Y77zne/kmGOOyZ133plJkyY1O//kk0/O5z73uXzyk5/MwQcfnO9+97tJkmnTpmX06NG57LLL0rNnz5x//vn5z//8z1RXV5fOHTt2bO68885m833sYx9LeXl5fvaznzVrP/vss3P88cfn3/7t31JfX5/jjz8+xx9/fKn/t7/9bcrKylJfX19qu++++1JdXd1st9/vf//73Hvvvbnooou24ZsFAABgT+HxmAAAwE7RqVOn3Hrrrbn11lvfsX/Lli3v2H7yySfnS1/60rvO+9WvfjVf/epXm7WNGjWq2fHUqVO3Cgdbt26da6+9Ntdee+27zl1XV5dJkybl8ccfL+0ILC8vz1VXXZUbb7wxgwcPLo1duXLlO86xePHiJMn//M//pEOHDjnuuONKfd///vczfvz4ZuOnTZuWk046KR/96EfftS4AAAD2PEI7AACAd9G2bdv80z/9UxobG5u1X3LJJdmwYUP+93//N+3bt9+muebPn5+rrroqf/EXf5EkaWxszAUXXJBPfepTzca1bt06t9xyy465AAAAAHYbQjsAAID3MGDAgK3aysvLc/XVV3+geS699NLU1taWjisrK3PllVduNW7s2LEfuEYAAAB2f95pBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUrL7oAAACA99LQ0FB0Cdtld68fAACAnUNoBwAA7JIqKyvTrl27jBw5suhStlu7du1SWVlZdBkAAADswoR2AADALqm6ujoNDQ1pbGxssTXGjh2bTp06ZeLEiS22RvKHALK6urpF1wAAAGD3JrQDAAB2WdXV1S0adlVUVKRjx46pra1tsTUAAABgW+xTdAEAAAAAAACwtxPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAMBuokuXLrnpppuKLgMAAIAWILQDAAAAAACAggntAAAAAAAAoGBCOwAAgPfw2muvZfTo0amoqEinTp0yefLkDBgwIJdeemmSPzyy8vrrry+NOeKIIzJnzpy89NJLOe+881JRUZHevXtn4cKFzea95557cvTRR6dNmzbp0qVLJk+e3Kx/3bp1GTp0aNq2bZsjjzwyd95551a1bdiwIWPHjs3BBx+cAw44IGeeeWaWLl3aYt8FAAAALUdoBwAA8B6uuOKK/OIXv8h9992XuXPnpr6+PosXL242ZsqUKenfv3+eeuqpnHPOORk1alRGjx6dkSNHZvHixenWrVtGjx6dLVu2JEkWLVqUT3ziExkxYkSeeeaZTJgwIePGjcv06dNLc9bV1eU3v/lNfv7zn2f27Nm57bbbsm7dumbrDh8+POvWrctDDz2URYsWpba2NgMHDszLL7/c4t8LAAAAO1Z50QUAAADsqpqamnL77bdn5syZGThwYJJkxowZOeyww5qNO/vss3PJJZckScaPH5+pU6emT58+GT58eJLk61//evr165cXX3wxVVVVufHGGzNw4MCMGzcuSdKjR48sW7YsN9xwQ+rq6rJ8+fI89NBDWbBgQfr06ZMkuf3221NTU1Na89FHH82CBQuybt26tGnTJknyve99L/fee29mz56diy++uGW/HAAAAHYoO+0AAADexYoVK7Jp06b07du31HbQQQelZ8+ezcb17t279PnQQw9Nkhx77LFbtf1xp1xDQ0P69+/fbI7+/fvn+eefz+bNm9PQ0JDy8vKccMIJpf5evXqlQ4cOpeOlS5emqakpHTt2TEVFRennhRdeyIoVK7bzygEAANjZ7LQDAADYTq1bty59Lisre9e2t99+e4et2dTUlE6dOqW+vn6rvj8N9wAAANg92GkHAADwLrp165bWrVvnySefLLW98sorWb58+XbNW1NTk/nz5zdrmz9/fnr06JFWrVqlV69eeeutt7Jo0aJS/3PPPZcNGzaUjmtra7N27dqUl5ene/fuzX4qKyu3qz4AAAB2PqEdAADAu6ioqMiFF16YK664Ig8//HCeffbZ1NXVZZ99tu+vUpdddlnmzZuXiRMnZvny5ZkxY0ZuvfXWXH755UmSnj17ZsiQIbnkkkvy5JNPZtGiRRk7dmzatm1bmmPQoEHp169fzj///MydOzcrV67MY489lquvvjoLFy7crvoAAADY+YR2AAAA7+GGG27IqaeemqFDh2bQoEE55ZRTmr1r7sOora3NXXfdlVmzZuWYY47J+PHjc91116Wurq40Ztq0aencuXNOP/30XHDBBbn44otzyCGH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UllZWXQZAAAAeyShHQAA7GGqq6vT0NCQxsbGFltj7Nix6dSpUyZOnNhia7Dtdtb9qKysTHV1dYuuAQAAsLcS2gEAwB6ourq6RcOVioqKdOzYMbW1tS22BtvO/QAAANj97VN0AQAAAAAAALC3E9oBAAAAAABAwYR2AAAAAAAAUDChHQAAsMfr0qVLbrrppqLL4P9yPwAAALYmtAMAAAAAAICCCe0AAAAAAACgYEI7AACgRbz22msZPXp0Kioq0qlTp0yePDkDBgzIpZdemuQPj0i8/vrrS2OOOOKIzJkzJy+99FLOO++8VFRUpHfv3lm4cGGzee+5554cffTRadOmTbp06ZLJkyc361+3bl2GDh2atm3b5sgjj8ydd965VW0bNmzI2LFjc/DBB+eAAw7ImWeemaVLl7bYd7ErcD8AAAB2bUI7AACgRVxxxRX5xS9+kfvuuy9z585NfX19Fi9e3GzMlClT0r9//zz11FM555xzMmrUqIwePTojR47M4sWL061bt4wePTpbtmxJkixatCif+MQnMmLEiDzzzDOZMGFCxo0bl+nTp5fmrKury29+85v8/Oc/z+zZs3Pbbbdl3bp1zdYdPnx41q1bl4ceeiiLFi1KbW1tBg4cmJdffrnFv5eiuB8AAAC7tvKiCwAAAPY8TU1Nuf322zNz5swMHDgwSTJjxowcdthhzcadffbZueSSS5Ik48ePz9SpU9OnT58MHz48SfL1r389/fr1y4svvpiqqqrceOONGThwYMaNG5ck6dGjR5YtW5YbbrghdXV1Wb58eR566KEsWLAgffr0SZLcfvvtqampKa356KOPZsGCBVm3bl3atGmTJPne976Xe++9N7Nnz87FF1/csl9OAdwPAACAXZ+ddgAAwA63YsWKbNq0KX379i21HXTQQenZs2ezcb179y59PvTQQ5Mkxx577FZtf9yZ1dDQkP79+zebo3///nn++eezefPmNDQ0pLy8PCeccEKpv1evXunQoUPpeOnSpWlqakrHjh1TUVFR+nnhhReyYsWK7bzyXZP7AQAAsOuz0w4AAChM69atS5/Lysrete3tt9/eYWs2NTWlU6dOqa+v36rvT8OkvZH7AQAAUBw77QAAgB2uW7duad26dZ588slS2yuvvJLly5dv17w1NTWZP39+s7b58+enR48eadWqVXr16pW33norixYtKvU/99xz2bBhQ+m4trY2a9euTXl5ebp3797sp7Kycrvq21W5HwAAALs+oR0AALDDVVRU5MILL8wVV1yRhx9+OM8++2zq6uqyzz7b91eQyy67LPPmzcvEiROzfPnyzJgxI7feemsuv/zyJEnPnj0zZMiQXHLJJXnyySezaNGijB07Nm3bti3NMWjQoPTr1y/nn39+5s6dm5UrV+axxx7L1VdfnYULF25Xfbsq9wMAAGDXJ7QDAABaxA033JBTTz01Q4cOzaBBg3LKKac0e7fZh1FbW5u77rors2bNyjHHHJPx48fnuuuuS11dXWnMtGnT0rlz55x++um54IILcvHFF+eQQw4p9ZeVleXBBx/MaaedljFjxqRHjx4ZMWJEVq1aVXpn257I/QAAANi1eacdAADQIioqKnLHHXfkjjvuKLU98MADpc8rV67c6pwtW7Y0O+7SpctWbcOGDcuwYcPedd2qqqrcf//9zdpGjRrV7Lh9+/a5+eabc/PNN7/vdewp3A8AAIBdm512AAAAAAAAUDChHQAAAAAAABTM4zEBAICdpr6+vugS+BPuBwAAwK7DTjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBg5UUXAAAAAAA70urVq9PY2Fh0GdutsrIy1dXVRZcBAOwkQjsAAAAA9hirV69OTU1NNm7cWHQp261du3ZpaGgQ3AHAXkJoBwAAAMAeo7GxMRs3bszMmTNTU1NTdDkfWkNDQ0aOHJnGxkahHQDsJYR2AAAAAOxxampqUltbW3QZAADbbJ+iCwAAAAAAAIC9ndAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAABgBxs1alS+/e1vN2t77rnnUlVVlf/93//90PM2NjbmkEMOyX//9383ax8xYkQmT578oecFAIontAMAAABgl7V27dp8+ctfTteuXdOmTZscfvjhGTp0aObNm9ei606fPj0dOnT4UOcuXbo0Dz74YL7yla80a//GN76RL3/5y2nfvn2S5Pe//33q6upy7LHHpry8POeff/77zl1ZWZnRo0fnmmuuadb+zW9+M9/61rfy6quvfqiaAYDiCe0AAAAA2CWtXLkyJ5xwQh5++OHccMMNeeaZZ/LTn/40Z5xxRr74xS++4zlvvvnmTq5ya7fcckuGDx+eioqKUtvq1atz//33p66urtS2efPmtG3bNl/5ylcyaNCgbZ5/zJgxufPOO/Pyyy+X2o455ph069YtM2fO3CHXAADsfEI7AAAAAHZJX/jCF1JWVpYFCxZk2LBh6dGjR44++uh87WtfyxNPPJEkKSsry9SpU3Puuedm//33zz/+4z8mSerr61NbW5v99tsvXbt2zbXXXpu33nqrNPeNN96YY489Nvvvv38OP/zwfOELX0hTU1Pp3DFjxuTVV19NWVlZysrKMmHChCTJG2+8kcsvvzwf+chHsv/++6dv376pr68vzbt58+bMnj07Q4cObXYtd911V4477rh85CMfKbXtv//+mTp1ai666KJUVVVt8/dy9NFHp3PnzvnXf/3XZu1Dhw7NrFmztnkeAGDXIrQDAAAAYJfz8ssv56c//Wm++MUvZv/999+q/08fXTlhwoT8zd/8TZ555pmce+65SZLx48fn7/7u77Js2bL86Ec/yvTp0/Otb32rdM4+++yTm2++Ob/85S8zY8aMPPzww7nyyiuTJCeffHJuuummHHDAAVmzZk3WrFmTyy+/PEnypS99KY8//nhmzZqVp59+OsOHD8+QIUPy/PPPJ0mefvrpvPrqqznxxBOb1fvII49s1bY9TjrppDzyyCNbtS1YsCBvvPHGDlsHANh5hHYAAAAA7HJ+/etfZ8uWLenVq9f7jv3bv/3bjBkzJl27dk2nTp2SJHV1dfnMZz6Trl275qyzzsrEiRPzox/9qHTOpZdemjPOOCNdunTJmWeemeuvvz533XVXkmTffffNgQcemLKyslRVVaWqqioVFRVZvXp1pk2blrvvvjunnnpqunXrlssvvzynnHJKpk2bliRZtWpVWrVqlUMOOaRZjatWrUrnzp131NeTzp07Z9WqVVu1bdq0KWvXrt1h6wAAO0950QUAAAAAwJ/bsmXLNo99px1sP/7xjzN9+vTS8ebNm/P73/8+GzduTLt27fKzn/0skyZNyq9+9av87ne/y1tvvdWs/50888wz2bx5c3r06NGs/Y033kjHjh2TJK+//nratGmTsrKyZmNef/317Lffftt8Te+nbdu22bhx41ZtSbZqBwB2D0I7AAAAAHY5f/mXf5mysrL86le/et+x7/T4zEsuuSRf/vKXt2rfb7/9snLlynz84x/P5z//+XzrW9/KQQcdlEcffTQXXnhhNm3a9K6hXVNTU1q1apVFixalVatWzfoqKiqSJJWVldm4cWM2bdqUfffdt9RfWVmZV1555X2vZVu9/PLLOfjgg7dqS7JVOwCwexDaAQAAALDLOeiggzJ48OD84Ac/yFe+8pWtgrkNGzY0e6/dn1u1alW6d+/+jn2LFi3K22+/ncmTJ2efff7w9pg/Phrzj/bdd99s3ry5Wdvxxx+fzZs3Z926dTn11FPfce6/+qu/SpIsW7as9PmP5y5btuxd6/2gnn322QwYMGCrtsMOOyyVlZU7bB0AYOfxTjsAAAAAdkk/+MEPsnnz5px00km555578vzzz6ehoSE333xz+vXr957n3n///bn22mvzy1/+Mg0NDZk1a1a++c1vJkm6d++eN998M7fcckv+67/+K3fccUd++MMfNju/S5cuaWpqyrx589LY2JiNGzemR48e+fSnP53Ro0fnX/7lX/LCCy9kwYIFmTRpUh544IEkf9jlVltbm0cffbTZfIMHD87jjz++VRC4bNmyLFmyJC+//HJeffXVLFmyJEuWLHnPa9u4cWMWLVqUv/7rv27W/sgjj2zVBgDsPoR2AAAAAOySunbtmsWLF+eMM87IZZddlmOOOSZnnXVW5s2bl6lTp77nuTfddFPmzp2bPn365KMf/WimTJmSI444Ikly3HHH5cYbb8x3vvOdHHPMMbnzzjszadKkZueffPLJ+dznPpdPfvKTOfjgg/Pd7343STJt2rSMHj06l112WXr27Jnzzz8///mf/5nq6urSuWPHjs2dd97ZbL6PfexjKS8vz89+9rNm7WeffXaOP/74/Nu//Vvq6+tz/PHH5/jjjy/1//a3v01ZWVnq6+tLbffdd1+qq6ub7fb7/e9/n3vvvTcXXXTRNnyzAMCuyOMxAQAAANhlderUKbfeemtuvfXWd+zfsmXLO7affPLJ+dKXvvSu8371q1/NV7/61WZto0aNanY8derUrcLB1q1b59prr8211177rnPX1dVl0qRJefzxx0s7AsvLy3PVVVflxhtvzODBg0tjV65c+Y5zLF68OEnyP//zP+nQoUOOO+64Ut/3v//9jB8/vtn4adOm5aSTTspHP/rRd60LANi1Ce0AAAAAYAdq27Zt/umf/imNjY3N2i+55JJs2LAh//u//5v27dtv01zz58/PVVddlb/4i79IkjQ2NuaCCy7Ipz71qWbjWrdunVtuuWXHXAAAUAihHQAAAADsYAMGDNiqrby8PFdfffUHmufSSy9NbW1t6biysjJXXnnlVuPGjh37gWsEAHYt3mkHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABSsvugAAAAAA2NEaGhqKLmG77O71AwAfnNAOAAAAgD1GZWVl2rVrl5EjRxZdynZr165dKisriy4DANhJhHYAAAAA7DGqq6vT0NCQxsbGFltj7Nix6dSpUyZOnNhiayR/CCCrq6tbdA0AYNchtAMAAABgj1JdXd2iYVdFRUU6duyY2traFlsDANj77FN0AQAAAAAAALC3E9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAADswbp06ZKbbrqp6DIAgPchtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAANjBXnvttYwePToVFRXp1KlTJk+enAEDBuTSSy9N8odHVl5//fWlMUcccUTmzJmTl156Keedd14qKirSu3fvLFy4sNm899xzT44++ui0adMmXbp0yeTJk5v1r1u3LkOHDk3btm1z5JFH5s4779yqtg0bNmTs2LE5+OCDc8ABB+TMM8/M0qVLW+y7AAC2jdAOAAAAAHawK664Ir/4xS9y3333Ze7cuamvr8/ixYubjZkyZUr69++fp556Kuecc05GjRqV0aNHZ+TIkVm8eHG6deuW0aNHZ8uWLUmSRYsW5ROf+ERGjBiRZ555JhMmTMi4ceMyffr00px1dXX5zW9+k5///OeZPXt2brvttqxbt67ZusOHD8+6devy0EMPZdGiRamtrc3AgQPz8ssvt/j3AgC8u/KiCwAAAACAPUlTU1Nuv/32zJw5MwMHDkySzJgxI4cddlizcWeffXYuueSSJMn48eMzderU9OnTJ8OHD0+SfP3rX0+/fv3y4osvpqqqKjfeeGMGDhyYcePGJUl69OiRZcuW5YYbbkhdXV2WL1+ehx56KAsWLEifPn2SJLfffntqampKaz766KNZsGBB1q1blzZt2iRJvve97+Xee+/N7Nmzc/HFF7fslwMAvCs77QAAAABgB1qxYkU2bdqUvn37ltoOOuig9OzZs9m43r17lz4feuihSZJjjz12q7Y/7pRraGhI//79m83Rv3//PP/889m8eXMaGhpSXl6eE044odTfq1evdOjQoXS8dOnSNDU1pWPHjqmoqCj9vPDCC1mxYsV2XjkAsD3stAMAAACAArRu3br0uays7F3b3n777R22ZlNTUzp16pT6+vqt+v403AMAdj477QAAAABgB+rWrVtat26dJ598stT2yiuvZPny5ds1b01NTebPn9+sbf78+enRo0datWqVXr165a233sqiRYtK/c8991w2bNhQOq6trc3atWtTXl6e7t27N/uprKzcrvoAgO0jtAMAAACAHaiioiIXXnhhrrjiijz88MN59tlnU1dXl3322b5/irvssssyb968TJw4McuXL8+MGTNy66235vLLL0+S9OzZM0OGDMkll1ySJ598MosWLcrYsWPTtm3b0hyDBg1Kv379cv7552fu3LlZuXJlHnvssVx99dVZuHDhdtUHAGwfoR0AAAAA7GA33HBDTj311AwdOjSDBg3KKaec0uxdcx9GbW1t7rrrrsyaNSvHHHNMxo8fn+uuuy51dXWlMdOmTUvnzp1z+umn54ILLsjFF1+cQw45pNRfVlaWBx98MKeddlrGjBmTHj16ZMSIEVm1alXpHXoAQDG80w4AAAAAdrCKiorc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+++/P8uXL8+oUaNK/cOGDctvf/vbzJkzJ0OGDEl9fX1qa2szffr00pjXX3+92aMxP6zKysp87WtfS9++fdOnT5/8n//zfzJy5MitHoPZtm3bJMnGjRu3e00AAIAdQWgHAADAu9p///3TvXv3dO/ePX369MmPf/zjvPbaa/mHf/iH0piqqqp07949PXv2zDnnnJNrr702P/nJT/LrX/+6NGa//fbLWWedlXHjxuWxxx5LXV1drrnmmlJ/ZWVlXnnllWZrV1VV5cUXX2zW9uKLL+aAAw4ohW7bom/fvs1qSZKXX345SUrv5QMAACia0A4AAIBtVlZWln322eddH0+ZJK1atUqS9xxz1FFH5bXXXisdH3/88Vm2bFmzMf369cu8efOatf3Hf/xH+vXr94FqXrJkSTp16tSs7dlnn03r1q1z9NFHf6C5AAAAWkp50QUAAACw63rjjTeydu3aJMkrr7ySW2+9NU1NTRk6dGhpzIYNG7J27dq8/fbbef7553PdddelR48eqampyfr16zN8+PB89rOfTe/evdO+ffssXLgw3/3ud3PeeeeV5hg8eHBmzJjRbO3Pfe5zufXWW3PllVfms5/9bB5++OHcddddeeCBB0pjbr311vzrv/5rKdybMWNG9t133xx//PFJkn/5l3/JP/7jP+bHP/5xs7kfeeSRnHrqqR9oxx4AAEBLEtoBAADwrn7605+Wdqm1b98+vXr1yt13350BAwaUxowZMybJH3bhVVVV5bTTTsu3v/3tlJeXp6KiIn379s2UKVOyYsWKvPnmmzn88MNz0UUX5aqrrirN8elPfzpXXnllnnvuufTs2TNJcuSRR+aBBx7IV7/61Xz/+9/PYYcdlh//+McZPHhw6bzGxsasWLGiWc0TJ07MqlWrUl5enl69euUnP/lJ/r//7/9rNmbWrFmZMGHCjvyqAAAAtovQDgAAgHc0ffr0TJ8+/T3HbNmy5T3727Rpk0mTJmXSpEnvOe6ggw7Kl770pdx444350Y9+VGofMGBAnnrqqXc9b8KECc3Ct8985jP5zGc+855rPfTQQ9lnn322CvIAAACK5J12AAAA7BKuvvrqHHHEEXn77bdbdJ3XXnst06ZNS3m5/44VAADYdfgbCgAAALuEDh06NHtkZkuxww4AANgV2WkHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAA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mWdy++23Z+bMmdl+++2TJJdffnlqampKa06fPj0zZ87MokWL0qJFiyTJr371q9x44425/vrrc+SRR67ei1MA9wMAWJvZaQcAAACstebNm5elS5dmxx13LLWtv/766d69e9m4rbfeuvR5o402SpJstdVWjdr+tTOrrq4uO++8c9kcO++8c5599tksW7YsdXV1adasWXr37l3q79GjR9q1a1c6njNnThoaGtK+fftUVlaWfp577rnMmzdvFb/5msn9AADWZnbaAQAAAHyMddZZp/S5oqLiQ9uWL1/+ma3Z0NCQjh07ZurUqY363hsmrY3cDwDgy8hOOwAAAGCttdlmm2WdddbJgw8+WGp77bXX8swzz6zSvDU1NZkxY0ZZ24wZM9KtW7c0bdo0PXr0yLvvvptZs2aV+ufOnZvFixeXjmtra/Piiy+mWbNm2Xzzzct+qqqqVqm+NZX7AQCszYR2AAAAwFqrsrIyw4YNy0knnZS77747TzzxRIYMGZImTVbtTyYnnnhipkyZktGjR+eZZ57JhAkTcskll2TEiBFJku7du2fvvffOUUcdlQcffDCzZs3K8OHD06pVq9Icffv2TZ8+fbLffvtl8uTJef7553PffffltNNOy8MPP7xK9a2p3A8AYG0mtAMAAADWauedd1523XXXDBgwIH379s0uu+xS9m6zlVFbW5vrrrsukyZNSs+ePXPGGWfk5z//eYYMGVIac+WVV6ZTp07Zfffds//+++fII4/MhhtuWOqvqKjIbbfdlt122y1Dhw5Nt27dctBBB2X+/Pmld7Z9GbkfAMDayjvtAAAAgLVaZWVlrr766lx99dWltltvvbX0+fnnn290zooVK8qOO3fu3Kht4MCBGThw4Ieu26FDh9xyyy1lbYcddljZcZs2bXLRRRfloosu+tjv8WXhfgAAays77QAAAAAAAKBgQjsAAAAAAAAomMdjAgAAALzP1KlTiy6B93A/AIC1gZ12AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwZoVXQAAAAB8nhYsWJD6+vrVNn9DQ0NeeeWVzJ49e7WtwSf3ed2PqqqqVFdXr9Y1AAD4chPaAQAAsNZYsGBBampqsmTJktW6ziOPPJLbbrttta7BJ/d53I/WrVunrq5OcAcAwEoT2gEAALDWqK+vz5IlS3LNNdekpqam6HL4kqirq8ugQYNSX18vtAMAYKUJ7QAAAFjr1NTUpLa2tugyAAAASpoUXQAAAAAAAACs7YR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAABruOeffz4VFRV59NFHkyRTp05NRUVFFi9evMpzn3nmmdl2221XeZ7P25QpU1JTU5Nly5YlSS677LIMGDCg4KoAAGDlCe0AAABgNXv55Zfzgx/8INXV1WnRokU6dOiQ/v37Z8aMGSs130477ZSFCxembdu2SZLx48enXbt2n2HFa76TTz45p59+epo2bZok+f73v5/Zs2dn2rRpBVcGAAArp1nRBQAAAMCX3cCBA7N06dJMmDAhXbp0yUsvvZQpU6bklVdeWan5mjdvng4dOnzGVa75li5dmubNm2f69OmZN29eBg4cWOpr3rx5DjnkkFx00UXZddddC6wSAABWjp12AAAAsBotXrw406ZNy7nnnptvfOMb2WSTTbLDDjvk1FNPzbe+9a0kSUVFRcaNG5d99tknrVq1SpcuXXL99dd/6JzvfTzm1KlTM3To0Lz++uupqKhIRUVFzjzzzA899xe/+EU22mijtGnTJsOGDcvbb79d1v/QQw+lX79+qaqqStu2bbP77rtn9uzZZWOefvrp7LLLLmnZsmW22GKL3HXXXamoqMiNN95YGnPfffdl2223TcuWLbPddtvlxhtvLHvEZ5I88cQT2WeffVJZWZmNNtoohx12WOrr60v9e+yxR3784x/n+OOPT1VVVfr3758kmTRpUvr165eWLVuW1TVgwIDcfPPNeeuttz70+wMAwJpKaAcAAACrUWVlZSorK3PjjTfmnXfe+dBxo0aNysCBAzNnzpwceuihOeigg1JXV/ex8++000658MILs95662XhwoVZuHBhRowY8YFjr7vuupx55pk555xz8vDDD6djx4659NJLy8a88cYbOfzwwzN9+vQ88MAD6dq1a/bdd9+88cYbSZJly5Zlv/32S+vWrfPggw/mt7/9bU477bSyOf7+979nwIAB2WqrrTJ79uyMHj06I0eOLBuzePHi7LnnnunVq1cefvjh3HHHHXnppZdy4IEHlo2bMGFCmjdvnhkzZuSyyy5LkkybNi3bbbddo++33Xbb5d13382DDz74sdcNAADWNB6PCQAAAKtRs2bNMn78+BxxxBG57LLLUltbm9133z0HHXRQtt5669K4Aw44IMOHD0+SjB49On/5y19y8cUXNwrV3q958+Zp27ZtKioqPvaRmRdeeGGGDRuWYcOGJUnOOuus3HXXXWW77fbcc8+yc37729+mXbt2uffee/PNb34zf/nLXzJv3rxMnTq1tN7ZZ5+dfv36lc75/e9/n4qKivzud78r7cb73//93xxxxBGlMZdcckl69eqVc845p9R2xRVXZOONN84zzzyTbt26JUm6du2aX/7yl2U1zZ8/P506dWr0/Vq3bp22bdtm/vz5H3kdAABgTWSnHQAAAKxmAwcOzP/93//l5ptvzt57752pU6emtrY248ePL43p06dP2Tl9+vT5RDvtPo26urrsuOOOjdZ5r5deeilHHHFEunbtmrZt22a99dZLQ0NDFixYkCSZO3duNt5447KAcIcddiibY+7cudl6663LHl/5/jFz5szJPffcU9qJWFlZmR49eiRJ5s2bVxrXu3fvRt/jrbfeavRozH9p1apVlixZ8qHXAAAA1lR22gEAAMDnoGXLlunXr1/69euXUaNGZfjw4fnpT3+aIUOGFF1amcMPPzyvvPJK/vM//zObbLJJWrRokT59+mTp0qWf6ToNDQ0ZMGBAzj333EZ9HTt2LH1ed911G/VXVVXltdde+8B5X3311WywwQafXaEAAPA5sdMOAAAACrDFFlvkzTffLB0/8MADZf0PPPBAampqPtFczZs3z7Jlyz52XE1NTaP3vb1/3RkzZuTYY4/Nvvvumy233DItWrRIfX19qb979+554YUX8tJLL5XaHnroobI5unfvnscff7zsHX7vH1NbW5snn3wynTt3zuabb17280FB3Xv16tUrTz31VKP2efPm5e23306vXr0+8nwAAFgTCe0AAABgNXrllVey55575pprrsljjz2W5557Ln/4wx/yy1/+Mt/+9rdL4/7whz/kiiuuyDPPPJOf/vSnmTlzZn784x9/ojU6d+6choaGTJkyJfX19aXHQ5566qkZPHhwadxxxx2XK664IldeeWVpnSeffLJsrq5du+bqq69OXV1dHnzwwRx66KFp1apVqb9fv37ZbLPNcvjhh+exxx7LjBkzcvrppydJKioqkiSHHHJIli9fniOPPDJ1dXW5884786tf/apszI9+9KO8+uqrOfjgg/PQQw9l3rx5ufPOOzN06NCPDSD79++f6dOnN2qfNm1aunTpks022+wTXTcAAFiTCO0AAABgNaqsrMyOO+6YCy64ILvttlt69uyZUaNG5Ygjjsgll1xSGvezn/0skyZNytZbb52rrroq1157bbbYYotPtMZOO+2Uo48+Ot/73veywQYb5Je//GWSZOHChaV30SXJ9773vYwaNSonn3xyevfunfnz5+cHP/hB2VyXX355XnvttdTW1uawww7Lsccemw033LDU37Rp09x4441paGjI9ttvn+HDh+e0005LktJ75tZbb738+c9/zqOPPpptt902p512Ws4444yyMZ06dcqMGTOybNmy/Nu//Vu22mqrHH/88WnXrl2aNPnoP1cceuihefLJJzN37tyy9muvvTZHHHHEJ7pmAACwpvFOOwAAAFiNWrRokTFjxmTMmDEfOa5Tp06ZPHnyB/Z17tw5K1asKB3vscceZcdJMm7cuIwbN66sbfz48Y3m+slPfpKf/OQnZW3vfa9cr169Gj3K8rvf/W7ZcY8ePcp2us2YMSNJsvnmm5fadtppp8yZM6d0PHHixKyzzjqprq4utXXt2jV/+tOfGtX4L1OnTv3A9vXXXz8//vGPc/755+c3v/lNkuTJJ5/Mo48+muuuu+5D5wMAgDWZ0A4AAAD4VG644YZUVlama9eu+etf/5rjjjsuO++8c9ljKa+66qp06dIlX/3qVzNnzpyMHDkyBx54YNmjNlfFaaedlksvvTTL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JMlNN92U2tratGzZMl26dMnPfvazUuCTJOeff3622mqrrLvuutl4443zwx/+MA0NDUmSqVOnZujQoXn99ddTUVGRioqKnHnmmUmSd955JyNGjMhXv/rVrLvuutlxxx0zderU0rzLli1Lkuy6665l3+W6667LNttsk69+9aultnXXXTfjxo3LEUcckQ4dOnzi67LlllumU6dOueGGG8raBwwYkEmTJn3kuc8++2x22223tGzZMltssUX+8pe/NBozcuTIfOc730mSfOtb38qoUaMahaFnnXVWNtxww7Rp0ybDhw/PKaeckm233bbU/+677+bYY49Nu3bt0r59+4wcOTKHH3542W7C5cuXZ8yYMdl0003TqlWrbLPNNrn++utL/VOnTk1FRUVuv/329O7dOy1atMj06dPz8ssv5+67786AAQPKavrKV76SnXfe+WOvAQAAfFpCOwAAANZar776au6444786Ec/yrrrrtuo/72PrjzzzDPzne98J48//ni+//3vZ9q0aRk8eHCOO+64PPXUU/nNb36T8ePHlwK9JGnSpEkuuuiiPPnkk5kwYULuvvvunHzyyUmSnXbaKRdeeGHWW2+9LFy4MAsXLsyIESOSJD/+8Y9z//33Z9KkSXnsscdywAEHZO+9986zzz6bJKV/brHFFmX1Tps2Ldttt91ndn122GGHTJs2rVHbzJkz884773zgOcuXL8/++++f5s2b58EHH8xll132gY+TbNOmTSmkHDFiRH73u9/lggsuKPVPnDgxZ599ds4999zMmjUr1dXVGTduXNkc5557biZOnJgrr7wyM2bMyN///vdG780bM2ZMrrrqqlx22WV58sknc8IJJ2TQoEG59957y8adcsop+cUvfpG6urpsvfXWmT59elq3bp2amppPdF0AAGBVNSu6AAAAACjKX//616xYsSI9evT42LGHHHJIhg4dWjr+/ve/n1NOOSWHH354kqRLly4ZPXp0Tj755NK74I4//vjS+M6dO+ess87K0UcfnUsvvTTNmzdP27ZtU1FRUbYDbsGCBbnyyiuzYMGCdOrUKck/Q6077rgjV155Zc4555wsXLgwSbL++uuX1Th//vzPNLTr1KlTHnnkkUZtS5cuzYsvvphNNtmk0Tl33XVXnn766dx5552l+s8555zss88+ZeNOP/30zJ49O0my22675d13382kSZNKoebFF1+cYcOGla75GWeckcmTJ5d2Kv5rzKmnnlrasXfJJZfktttuK/W/8847Oeecc3LXXXelT58+Sf55n6ZPn57f/OY32X333Utjf/7zn6dfv36l4/nz52ejjTYqezTme6/B/PnzP+7yAQDApyK0AwAAYK21YsWKTzz2/WHYnDlzMmPGjLKddcuWLcvbb7+dJUuWpHXr1rnrrrsyZsyYPP300/n73/+ed999t6z/gzz++ONZtmxZunXrVtb+zjvvpH379qXPyT8f2/leb731Vlq2bPmJv9PHadWqVZYsWdKoLUmj9n+pq6vLxhtvXArskpQCs/f67//+74wZMyZJsssuu2T58uVZb731Sv1z587ND3/4w7Jzdthhh9x9991Jktdffz0vvfRSdthhh1J/06ZN07t37yxfvjzJP0PZJUuWlIVxSbJ06dL06tWrrO399/ejruUHXRcAAFhVQjsAAADWWl27dk1FRUWefvrpjx37/sdnNjQ05Gc/+1n233//RmNbtmyZ559/Pt/85jfzgx/8IGeffXbWX3/9TJ8+PcOGDcvSpUs/NLRraGhI06ZNM2vWrDRt2rSsr7KyMsn/e2zn+98BV1VVlddee+1jv8sn9eqrr2aDDTZo1JakUfuncf/99+fQQw/NUUcdlTlz5uT3v/99Hn/88YwdO3aV6n2/f+3Ku/XWW8ve85ckLVq0KDt+//39qGv5QdcFAABWlXfaAQAAsNZaf/31079///z617/Om2++2ah/8eLFH3pubW1t5s6dm80337zRT5MmTTJr1qwsX748Y8eOzde//vV069Yt//d//1c2R/PmzbNs2bKytl69emXZsmVZtGhRo3n/9RjN7t27J0n+9re/NTr3qaeeWplL8YGeeOKJRjvSnnjiiXzta19LVVXVB55TU1OTF154ofQIzyR54IEHysbcd9992WSTTTJs2LAkSXV1daPHTXbv3j0PPfRQWdt7j9u2bZuNNtqorG3ZsmWlR24m/3znX4sWLbJgwYJG13LjjTf+yO/eq1evvPjiix8Y3H3QdQEAgFUltAMAAGCt9utf/zrLli3LDjvskD/+8Y959tlnU1dXl4suuugDH+v4L2eccUauuuqq/OxnP8uTTz6Zurq6TJo0KaeffnqSZPPNN88//vGPXHzxxfnb3/6Wq6++OpdddlnZHJ07d05DQ0OmTJmS+vr6LFmyJN26dcuhhx6awYMH509/+lOee+65zJw5M2PGjMmtt96aJPnKV76SJHn00UfL5uvfv3/uv//+RkHgU089lUcffTSvvvpqXn/99Tz66KONzn2/JUuWZNasWfm3f/u3svZp06aVtf3v//5vevTokZkzZyZJ+vbtm27duuXwww/PnDlzMm3atJx22mllc3Tt2jULFizInXfemSS59tprc8MNN5SNOeaYY3L55ZdnwoQJefbZZ3PWWWflscceK3sk6DHHHJMxY8bkpptuyty5c3PcccfltddeK41p06ZNRowYkRNOOCETJkzIvHnzMnv27Fx88cWZMGHCR37/Xr16paqqKjNmzGjU9/5rAAAAnwWhHQAAAGu1Ll26ZPbs2fnGN76RE088MT179ky/fv0yZcqUjBs37kPP69+/f2655ZZMnjw522+/fb7+9a/nggsuyCabbJIk2WabbXL++efn3HPPTc+ePTNx4sTSO9z+ZaeddsrRRx+d733ve9lggw3yy1/+Mkly5ZVXZvDgwTnxxBPTvXv37LfffnnooYdSXV1ddv7tt99edrzPPvukWbNmueuuu8ra99133/Tq1St//vOfM3Xq1PTq1atsp9jzzz+fioqKTJ06tdR20003pbq6Orvuumup7e23386NN96YI444otT2j3/8I3Pnzi29461Jkya54YYb8tZbb2WHHXbI8OHDy977lyTf+ta3csIJJ+Tcc89Nkjz22GMZNWpU2ZhDDz00p556akaMGJHa2to899xzGTJkSNl75kaOHJmDDz44gwcPTp8+fVJZWZn+/fuXjRk9enRGjRqVMWPGpKamJnvvvXduvfXWbLrppvkoTZs2zdChQzNx4sSy9vvvvz+vv/56vvvd737k+QAA8GlVrPg0b90GAFar3XbbLZ07d85VV11VdCkAH8nvqzWL+7H2mT17dnr37p2NNtooN9xwQ9mOwF//+te5+eabS7vYPol77rkn+++/f/72t7+VdvF9/etfz7HHHptDDjmkNG7cuHG54YYbMnny5M/0e8yaNSu1tbUfO75fv37p0KFDrr766g/sX758eWpqanLggQdm9OjRq1zfiy++mC233DKzZ88uhbHf+973ss022+QnP/nJKs+/NvL7as3ifqxZ3I81i/uxZnE/WFs0K7oAAAAAYOX8/Oc/T319fVnb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RjnssMNSX19f6t9jjz3y4x//OMcff3yqqqrSv3//JMmkSZPSr1+/tGzZsqyuAQMG5Oabb85bb731od8fAADWVEI7AAAAWI0qKytTWVmZG2+8Me+8886Hjhs1alQGDhyYOXPm5NBDD81BBx2Uurq6j51/p512yoUXXpj11lsvCxcuzMKFCzNixIgPHHvdddflzDPPzDnnnJOHH344HTt2zKWXXlo25o033sjhhx+e6dOn54EHHkjXrl2z77775o033kiSLFu2LPvtt19at26dBx98ML/97W9z2mmnlc3x97//PQMGDMhWW22V2bNnZ/To0Rk5cmTZmMWLF2fPPfdMr1698vDDD+eOO+7ISy+9lAMPPLBs3IQJE9K8efPMmDEjl112WZJk2rRp2W677Rp9v+222y7vvvtuHnzwwY+9bgAAsKbxeEwAAABYjZo1a5bx48fniCOOyGWXXZba2trsvvvuOeigg7L11luXxh1wwAEZPnx4kmT06NH5y1/+kosvvrhRqPZ+zZs3T9u2bVNRUfGxj8y88MILM2zYsAwbNixJctZZZ+Wuu+4q22235557lp3z29/+Nu3atcu9996bb37zm/nLX/6SefPmZerUqaX1zj777PTr1690zu9///tUVFTkd7/7XWk33v/+7//miCOOKI255JJL0qtXr5xzzjmltiuuuCIbb7xxnnnmmXTr1i1J0rVr1/zyl78sq2n+/Pnp1KlTo+/XunXrtG3bNvPnz//I6wAAAGsiO+0AAABgNRs4cGD+7//+LzfffHP23nvvTJ06NbW1tRk/fnxpTJ8+fcrO6dOnzyfaafdp1NXVZccdd2y0znu99NJLOeKII9K1a9e0bds26623XhoaGrJgwYIkydy5c7PxxhuXBYQ77LBD2Rxz587N1ltvXfb4yvePmTNnTu65557STsTKysr06NEjSTJv3rzSuN69ezf6Hm+99VajR2P+S6tWrbJkyZIPvQYAALCmstMOAAAAPgctW7ZMv3790q9fv4waNSrDhw/PT3/60wwZMqTo0socfvjheeWVV/Kf//mf2WSTTdKiRYv06dMnS5cu/UzXaWhoyIABA3Luuec26uvYsWPp87rrrtuov6qqKq+99toHzvvqq69mgw02+OwKBQCAz4mddgAAAFCALbbYIm+++Wbp+IEHHijrf+CBB1JTU/OJ5mrevHmWLVv2seNqamoave/t/evOmDEjxx57bPbdd99sueWWadGiRerr60v93bt3zwsvvJCXXnqp1PbQQw+VzdG9e/c8/vjjZe/we/+Y2traPPnkk+ncuXM233zzsp8PCureq1evXnnqqacatc+bNy9vv/12evXq9ZHnAwDAmkhoBwAAAKvRK6+8kj333DPXXHNNHnvssTz33HP5wx/+kF/+8pf59re/XRr3hz/8IVdccUWeeeaZ/PSnP83MmTPz4x//+BOt0blz5zQ0NGTKlCmpr68vPR7y1FNPzeDBg0vjjjvuuFxxxRW58sorS+s8+eSTZXN17do1V199derq6vLggw/m0EMPTatWrUr9/fr1y2abbZbDDz88jz32WGbMmJHTTz89SVJRUZEkOeSQQ7J8+fIceeSRqaury5133plf/epXZWN+9KMf5dVXX83BBx+chx56KPPmzcudd96ZoUOHfmwA2b9//0yfPr1R+7Rp09KlS5dsttlmn+i6AQDAmkRoBwAAAKtRZWVldtxxx1xwwQXZbbfd0rNnz4waNSpHHHFELrnkktK4n/3sZ5k0aVK23nrrXHXVVbn22muzxRZbfKI1dtpppxx99NH53ve+lw022CC//OUvkyQLFy4svYsuSb73ve9l1KhROfnkk9O7d+/Mnz8/P/jBD8rmuvzyy/Paa6+ltrY2hx12WI499thsuOGGpf6mTZvmxhtvTENDQ7bffvsMHz48p512WpKU3jO33nrr5c9//nMeffTRbLvttjnttNNyxhlnlI3p1KlTZsyYkWXLluXf/u3fstVWW+X4449Pu3bt0qTJR/+54tBDD82TTz6ZuXPnlrVfe+21OeKIIz7RNQMAgDWNd9oBAADAatSiRYuMGTMmY8aM+chxnTp1yuTJkz+wr3PnzlmxYkXpeI899ig7TpJx48Zl3LhxZW3jx49vNNdPfvKT/OQnPylre+975Xr16tXoUZbf/e53y4579OhRttNtxowZSZLNN9+81LbTTjtlzpw5peOJEydmnXXWSXV1damta9eu+dOf/tSoxn+ZOnXqB7avv/76+fGPf5zzzz8/v/nNb5IkTz75ZB599NFcd911HzofAACsyYR2AAAAwKdyww03pLKyMl27ds1f//rXHHfccdl5553LHkt51VVXpUuXLvnqV7+aOXPmZOTIkTnwwAPLHrW5Kk477bRceumlWb58eZo0aZKFCxfmqquuStu2bT+T+QEA4PMmtAMAAAA+lTfeeCMjR47MggULUlVVlb59+2bs2LFlY1588cWcccYZefHFF9OxY8cccMABOfvssz+zGtq1a1e2Y7Bv376f2dwAAFAEoR0AAAAU7P2PulzTDR48OIMHD/7IMSeffHJOPvnkz6kiAAD44vvoNzsDAAAAAAAAq53QDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYM2KLgAAAGBtUFdXV3QJAGsFv28BgC8qoR0AAMBqVFVVldatW2fQoEFFlwKw1mjdunWqqqqKLgMA4FMR2gEAAKxG1dXVqaurS319fdGlwKcyfPjwdOzYMaNHjy66FPjUqqqqUl1dXXQZAACfitAOAABgNauurvbHY75wKisr0759+9TW1hZdCgAArBWaFF0AAAAAAAAArO2EdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAfOF17tw5F154YdFlAADAShPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAACwUt58880MHjw4lZWV6dixY8aOHZs99tgjxx9/fJJ/PrLyrLPOKo3ZZJNNcvPNN+fll1/Ot7/97VRWVmbrrbfOww8/XDbvH//4x2y55ZZp0aJFOnfunLFjx5b1L1q0KAMGDEirVq2y6aabZuLEiY1qW7x4cYYPH54NNtgg6623Xvbcc8/MmTNntV0LAABYVUI7AAAAYKWcdNJJuffee3PTTTdl8uTJmTp1ambPnl025oILLsjOO++cRx55JP/+7/+eww47LIMHD86gQYMye/bsbLbZZhk8eHBWrFiRJJk1a1YOPPDAHHTQQXn88cdz5plnZtSoURk/fnxpziFDhuSFF17IPffck+uvvz6XXnppFi1aVLbuAQcckEWLFuX222/PrFmzUltbm7322iuvvvrqar8uAACwMpoVXQAAAADwxdPQ0JDLL78811xzTfbaa68kyYQJE/K1r32tbNy+++6bo446KklyxhlnZNy4cdl+++1zwAEHJElGjhyZPn365KWXXkqHDh1y/vnnZ6+99sqoUaOSJN26dctTTz2V8847L0OGDMkzzzyT22+/PTNnzsz222+fJLn88stTU1NTWnP69OmZOXNmFi1alBYtWiRJfvWrX+XGG2/M9ddfnyOPPHL1XhwAAFgJdtoBAAAAn9q8efOydOnS7LjjjqW29ddfP927dy8bt/XWW5c+b7TRRkmSrbbaqlHbv3bK1dXVZeeddy6bY+edd86zzz6bZcuWpa6uLs2aNUvv3r1L/T169Ei7du1Kx3PmzElDQ0Pat2+fysrK0s9zzz2XefPmreI3BwCA1cNOOwAAAGC1WWeddUqfKyoqPrRt+fLln9maDQ0N6dixY6ZOndqo773hHgAArEnstAMAAAA+tc022yzrrLNOHnzwwVLba6+9lmeeeWaV5q2pqcmMGTPK2mbMmJFu3bqladOm6dGjR959993MmjWr1D937twsXry4dFxbW5sXX3wxzZo1y+abb172U1VVtUr1AQDA6iK0AwAAAD61ysrKDBs2LCeddFLuvvvuPPHEExkyZEiaNFm1PzWceOKJmTJlSkaPHp1nnnkmEyZMyCWXXJIRI0YkSbp375699947Rx11VB588MHMmjUrw4cPT6tWrUpz9O3bN3369Ml+++2XyZMn5/nnn899992X0047LQ8//PAq1QcAAKuL0A4AAABYKeedd1523XXXDBgwIH379s0uu+xS9q65lVFbW5vrrrsukyZNSs+ePXPGGWfk5z//eYYMGVIac+WVV6ZTp07Zfffds//+++fII4/MhhtuWOqvqKjIbbfdlt122y1Dhw5Nt27dctBBB2X+/Pmld+gBAMCaxjvtAAAAgJVSWVmZq6++OldffXWp7dZbby19fv755xuds2LFirLjzp07N2obOHBgBg4c+KHrdujQIbfccktZ22GHHVZ23KZNm1x00UW56KKLPvZ7AADAmsBOOwAAAAAAACiY0A4AAAAAAAAK5vGYAAAAwGdm6tSpRZcAAABfSHbaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABWtWdAEAAADAp7dgwYLU19evtvkbGhryyiuvZPbs2attjSSpqqpKdXX1al0DAAC+CIR2AAAA8AWzYMGC1NTUZMmSJat1nUceeSS33Xbbal2jdevWqaurE9wBALDWE9oBAADAF0x9fX2WLFmSa665JjU1NUWXs9Lq6uoyaNCg1NfXC+0AAFjrCe0AAADgC6qmpia1tbVFlwEAAHwGmhRdAAAAAAAAAKzthHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAF9Qo0aNyjnnnFPWNnfu3HTo0CFvvPHGSs9bX1+fDTfcMP/zP/9T1n7QQQdl7NixKzVnRUVFbrzxxpWuqSi77bZbfv/73ydJli5dms6dO+fhhx8uuCoAAL6MhHYAAACs9V588cUcc8wx6dKlS1q0aJGNN944AwYMyJQpU1bruuPHj0+7du1W+vwZM2bk2GOPLWs79dRTc8wxx6RNmzZJkrfffjtDhgzJVlttlWbNmmW//fb72HmrqqoyePDg/PSnPy1rP/3003P22Wfn9ddfX+mav0huvvnmvPTSSznooIOSJM2bN8+IESMycuTIgisDAODLSGgHAADAWu35559P7969c/fdd+e8887L448/njvuuCPf+MY38qMf/egDz/nHP/7xOVf5wfr27ZvKysrS8YIFC3LLLbdkyJAhpbZly5alVatWOfbYY9O3b99PPPfQoUMzceLEvPrqq6W2nj17ZrPNNss111zzmdS/JlqxYkXefffdJMlFF12UoUOHpkmT//fnk0MPPTTTp0/Pk08+WVSJAAB8SQntAAAAWKv98Ic/TEVFRWbOnJmBAwemW7du2XLLLfMf//EfeeCBB5L889GO48aNy7e+9a2su+66Ofvss5MkN910U2pra9OyZct06dIlP/vZz0qBT5Kcf/752WqrrbLuuutm4403zg9/+MM0NDQkSaZOnZqhQ4fm9ddfT0VFRSoqKnLmmWcmSd55552MGDEiX/3qV7Puuutmxx13zNSpU0vzLlu2LEmy6667ln2X6667Lttss02++tWvltrWXXfdjBs3LkcccUQ6dOjwia/LlltumU6dOuWGG24oax8wYEAmTZr0kec+++yz2W233dKyZctsscUW+ctf/tJozMiRI/Od73wnSfKtb30ro0aNahSGnnXWWdlwww3Tpk2bDB8+PKecckq23XbbUv+7776bY489Nu3atUv79u0zcuTIHH744WW7CZcvX54xY8Zk0003TatWrbLNNtvk+uuvL/VPnTo1FRUVuf3229O7d++0aNEi06dPz8svv5y77747AwYMKKvpK1/5SnbeeeePvQYAAPBpCe0AAABYa7366qu544478qMf/Sjrrrtuo/73PrryzDPPzHe+8508/vjj+f73v59p06Zl8ODBOe644/LUU0/lN7/5TcaPH18K9JKkSZMmueiii/Lkk09mwoQJufvuu3PyyScnSXbaaadceOGFWW+99bJw4cIsXLgwI0aMSJL8+Mc/zv33359JkyblscceywEHHJC99947zz77bJKU/rnFFluU1Ttt2rRst912n9n12WGHHTJt2rRGbTNnzsw777zzgecsX748+++/f5o3b54HH3wwl1122Qc+TrJNmzalkHLEiBH53e9+lwsuuKDUP3HixJx99tk599xzM2vWrFRXV2fcuHFlc5x77rmZOHFirrzyysyYMSN///vfG703b8yYMbnqqqty2WWX5cknn8wJJ5yQQYMG5d577y0bd8opp+QXv/hF6urqsvXWW2f69Olp3bp1ampqPtF1AQCAVdWs6AIAAACgKH/961+zYsWK9OjR42PHHnLIIRk6dGjp+Pvf/35OOeWUHH744UmSLl26ZPTo0Tn55JNL74I7/vjjS+M7d+6cs846K0cffXQuvfTSNG/ePG3btk1FRUXZDrgFCxbkyiuvzIIFC9KpU6ck/wy17rjjjlx55ZU555xzsnDhwiTJ+uuvX1bj/PnzP9PQrlOnTnnkkUcatS1dujQvvvhiNtlkk0bn3HXXXXn66adz5513luo/55xzss8++5SNO/300zN79uwkyW677ZZ33303kyZNKoWaF198cYYNG1a65meccUYmT55c2qn4rzGnnnpqacfeJZdckttuu63U/8477+Scc87JXXfdlT59+iT5532aPn16fvOb32T33Xcvjf35z3+efv36lY7nz5+fjTbaqOzRmO+9BvPnz/+4ywcAAJ+K0A4AAIC11ooVKz7x2PeHYXPmzMmMGTPKdtYtW7Ysb7/9dpYsWZLWrVvnrrvuypgxY/L000/n73//e959992y/g/y+OOPZ9myZenWrVtZ+zvvvJP27duXPif/fGzne7311ltp2bLlJ/5OH6dVq1ZZsmRJo7Ykjdr/pa6uLhtvvHEpsEtSCsze67//+78zZsyYJMkuu+yS5cuXZ7311iv1z507Nz/84Q/Lztlhhx1y9913J0lef/31vPTSS9lhhx1K/U2bNk3v3r2zfPnyJP8MZZcsWVIWxiXJ0qVL06tXr7K299/fj7qWH3RdAABgVQntAAAAWGt17do1FRUVefrppz927Psfn9nQ0JCf/exn2X///RuNbdmyZZ5//vl885vfzA9+8IOcffbZWX/99TN9+vQMGzYsS5cu/dDQrqGhIU2bNs2sWbPStGnTsr7Kysok/++xne9/B1xVVVVee+21j/0un9Srr76aDTbYoFFbkkbtn8b999+fQw89NEcddVTmzJmT3//+93n88cczduzYVar3/f61K+/WW28te89fkrRo0aLs+P3396Ou5QddFwAAWFXeaQcAAMBaa/3110///v3z61//Om+++Waj/sWLF3/oubW1tZk7d24233zzRj9NmjTJrFmzsnz58owdOzZf//rX061bt/zf//1f2RzNmzfPsmXLytp69eqVZcuWZdGiRY3m/ddjNLt3754k+dvf/tbo3KeeemplLsUHeuKJJxrtSHviiSfyta99LVVVVR94Tk1NTV544YXSIzyT5IEHHigbc99992WTTTbJsGHDkiTV1dWNHjfZvXv3PPTQQ2Vt7z1u27ZtNtpoo7K2ZcuWlR65mfzznX8tWrTIggULGl3LjTfe+CO/e69evfLiiy9+YHD3QdcFAABWldAOAACAtdqvf/3rLFu2LDvssEP++Mc/5tlnn01dXV0uuuiiD3ys47+cccYZueqqq/Kzn/0sTz75ZOrq6jJp0qScfvrpSZLNN988//jHP3LxxRfnb3/7W66++upcdtllZXN07tw5DQ0NmTJlSurr67NkyZJ069Ythx56aAYPHpw//elPee655zJz5syMGTMmt956a5LkK1/5SpLk0UcfLZuvf//+uf/++xsFgU899VQeffTRvPrqq3n99dfz6KOPNjr3/ZYsWZJZs2bl3/7t38rap02bVtb2v//7v+nRo0dmzpyZJOnbt2+6deuWww8/PHPmzMm0adNy2mmnlc3RtWvXLFiwIHfeeWeS5Nprr80NN9xQNuaYY47J5ZdfngkTJuTZZ5/NWWedlccee6zskaDHHHNMxowZk5tuuilz587Ncccdl9dee600pk2bNhkxYkROOOGETJgwIfPmzcvs2bNz8cUXZ8KECR/5/Xv16pWqqqrMmDGjUd/7rwEAAHwWhHYAAACs1bp06ZLZs2fnG9/4Rk488cT07Nkz/fr1y5QpUzJu3LgPPa9///655ZZbMnny5Gy//fb5+te/ngsuuCCbbLJJkmSbbbbJ+eefn3PPPTc9e/bMxIkTS+9w+5eddtopRx99dL73ve9lgw02yC9/+cskyZVXXpnBgwfnxBNPTPfu3bPffvvloYceSnV1ddn5t99+e9nxPvvsk2bNmuWuu+4qa993333Tq1ev/PnPf87UqVPTq1evsp1izz//fCoqKjJ16tRS20033ZTq6ursuuuupba33347N954Y4444ohS2z/+8Y/MnTu39I63Jk2a5IYbbshbb72VHXbYIcOHDy9771+SfOtb38oJJ5yQc889N0ny2GOPZdSoUWVjDj300Jx66qkZMWJEamtr89xzz2XIkCFl75kbOXJkDj744AwePDh9+vRJZWVl+vfvXzZm9OjRGTVqVMaMGZOamprsvffeufXWW7PpppvmozRt2jRDhw7NxIkTy9rvv//+vP766/nud7/7kecDAMCnVbHi07x1GwBYrXbbbbd07tw5V111VdGlAHwkv6+gWLNnz07v3r2z0UYb5YYbbijbEfjrX/86N998c2kX2ydxzz33ZP/998/f/va30i6+r3/96zn22GNzyCGHlMaNGzcuN9xwQyZPnvyZfo9Zs2altrb2Y8f369cvHTp0yNVXX/2B/cuXL09NTU0OPPDAjB49epXre/HFF7Pllltm9uzZpTD2e9/7XrbZZpv85Cc/WeX5oWj+e75mcT/WLO7HmsX9YG3RrOgCAAAAgJXz85//PPX19WVtRx11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WGbOnFkac9JJJ+Xee+/NTTfdlMmTJ2fq1KmZPXt22Tz/+Mc/Mnr06MyZMyc33nhjnn/++QwZMqTRemeeeWYuueSS3HfffXnhhRdy4IEH5sILL8zvf//73HrrrZk8eXIuvvji0vg333wz//Ef/5GHH344U6ZMSZMmTfKd73wny5cvL5v3lFNOyXHHHZe6urr0798/Y8eOzfjx43PFFVdk+vTpefXVV3PDDTd85LVoaGjINddck8033zzt27dPknTo0CEPPPBA5s+f/2kvLQBrqWZFFwAAAAAArHluueWWVFZWlrUtW7as9PmrX/1qRowYUTo+5phjcuedd+a6667LDjvskIaGhlx++eW55pprstdeeyVJJkyYkK997Wtlc37/+98vfe7SpUsuuuiibL/99mloaChb/6yzzsrOO++cJBk2bFhOPfXUzJs3L126dEmSfPe7380999yTkSNHJkkGDhxYts4VV1yRDTbYIE899VR69uxZaj/++OOz//77l44vvPDCnHrqqaW2yy67LHfeeedHXp8333wzHTt2zC233JImTf65T+KnP/1p9t9//3Tu3DndunVLnz59su++++a73/1uaQwAvJf/OgAAAAAAjXzjG9/Io48+WvbzX//1X6X+ZcuWZfTo0dlqq62y/vrrp7KyMnfeeWcWLFiQJJk3b16WLl2aHXfcsXTO+uuvn+7du5etM2vWrAwYMCDV1dVp06ZNdt999yQpzfMvW2+9denzRhttlNatW5cCu3+1vfexms8++2wOPvjgdOnSJeutt146d+78gfNut912pc+vv/56Fi5cWFZzs2bNysZ80PWZOXNm+vfvn3322ae0s65jx465//778/jjj+e4447Lu+++m8MPPzx77713o91+AJDYaQcAAAAAfIB11103m2++eVnb//zP/5Q+n3feefnP//zPXHjhhdlqq62y7rrr5vjjj8/SpUs/8Rpvvvlm+vfvn/79+2fixInZYIMNsmDBgvTv37/RPOuss07pc0VFRdnxv9reG4YNGDAgm2yySX73u9+lU6dOWb58eXr27Nlo3nXXXfcT1/v+8957ff7rv/4rbdu2ze9+97ucddZZpfaePXumZ8+e+eEPf5ijjz46u+66a+6999584xvfWKl1AfjystMOAAAAAPjUZsyYkW9/+9sZNGhQttlmm3Tp0iXPPPNMqX+z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O7fBvD/5yU+y5557pmnTpunUqVPGjx/foH/p0qUZOnRomjdvnt122y3Tpk1br7YVK1Zk9OjRadu2bVq1apVDDz008+fP32z3AuDvCe0AAAAAAPjIjB07Ng8//HB+9rOfZfr06Zk5c2bmzZvXYMy1116bfv365Yknnsjhhx+eE088MSNHjsyIESMyb968dOnSJSNHjsy6deuSJLW1tTnmmGNy7LHH5qmnnsoll1ySCy+8MJMnTy7NOWrUqLz00kv51a9+lbvuuivf+973snTp0gbrDh8+PEuXLs3999+f2tra1NTUZODAgXnttdc2+30BKC+6AAAAAAAAtg319fWZOHFipk6dmoEDByZJpkyZkl133bXBuMMOOyynn356kuSiiy7KjTfemH333TfDhw9PknzjG99I375988orr6Rdu3a55pprMnDgwFx44YVJkm7duuWZZ57JVVddlVGjRmXBggW5//77M2fOnOy7775JkokTJ6a6urq05qxZszJnzpwsXbo0TZs2TZJcffXVufvuu3PXXXfltNNO27w3B9jm2WkHAAAAAMBHYuHChVm9enX233//UtuOO+6Y3XffvcG4Xr16lT7vvPPOSZKePXuu1/a3nXJ1dXXp169fgzn69euX5557LmvWrEldXV3Ky8vTp0+fUn/37t3TunXr0vH8+fNTX1+fNm3apKKiovTzwgsvZOHChRt55QD/mp12AAAAAABsUZo0aVL6XFZW9k/b1q5du8nWrK+vT/v27TNz5sz1+v4+3APYXOy0AwAAAADgI9GlS5c0adIkjz/+eKnt9ddfz4IFCzZq3urq6syePbtB2+zZs9OtW7c0btw43bt3zzvvvJPa2tpS/7PPPpsVK1aUjmtqavLyyy+nvLw8Xbt2bfBTWVm5UfUBbAihHQAAAAAAH4mKioqccsopGTt2bB566KE8/fTTGTVqVBo12rg/VZ999tmZMWNGxo0blwULFmTKlCm54YYbcs455yRJdt999wwZMiSnn356Hn/88dTW1mb06NFp3rx5aY5Bgwalb9++OeqoozJ9+vS8+OKLefTRR/Otb30rc+fO3aj6ADaE0A4AAAAAgI/MVVddlYMOOihDhw7NoEGDcuCBBzb4rrkPo6amJnfccUduv/329OjRIxdddFG+/e1vZ9SoUaUxkyZNSocOHXLwwQfn6KOPzmmnnZaddtqp1F9WVpb77rsv/fv3z8knn5xu3brl2GOPzaJFi0rfoQewOflOOwAAAAAAPjIVFRW57bbbctttt5Xafv7zn5c+v/jii+uds27dugbHnTp1Wq9t2LBhGTZs2D9dt127drn33nsbtJ144okNjrfffvtcd911ue666/7ldQBsanbaAQAAAAAAQMGEdgAAAAAAAFAwr8cEAAAAAKBQM2fOLLoEgMLZaQcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABSsvOgCAAAAAAD4aCxevDjLli3bbPPX19dn+fLlmTdv3mZbI0kqKytTVVW1WdcA+KgJ7QAAAAAAtgGLFy9OdXV1Vq1atVnXeeKJJ3Lfffdt1jVatGiRuro6wR3wsSK0AwAAAADYBixbtiyrVq3K1KlTU11dXXQ5H1pdXV1GjBiRZcuWCe2AjxWhHQAAAADANqS6ujo1NTVFlwHAP2hUdAEAAAAAAACwrRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAwDbqkksuyd577/2RrDVjxoxUV1dnzZo1Ddr79++fH/3oRxs197HHHpvx48c3aHvggQey9957Z+3atRs1N8BHRWgHAAAAALCVevXVV/OlL30pVVVVadq0adq1a5fBgwdn9uzZhdTzfiHgueeemwsuuCCNGzcutd1zzz155ZVXcuyxx5bafvCDH2TAgAFp1apVysrKsmLFin+57gUXXJDLL788b7zxRqltyJAhadKkSaZNm/ahrwfgoyS0AwAAAADYSg0bNixPPPFEpkyZkgULFuSee+7JgAEDsnz58qJLa2DWrFlZuHBhhg0b1qD9uuuuy8knn5xGjf7fn6pXrVqVIUOG5Jvf/OYGz9+jR4906dIlU6dObdA+atSoXHfddRtXPMBHRGgHAAAAALAVWrFiRR555JF85zvfySGHHJKOHTtmv/32y/nnn5/Pf/7zpTGjR49O27Zt079//yTJggUL3nfem2++OdXV1WnWrFm6d++e733vew36//jHP+a4447LjjvumJYtW2afffbJ448/nsmTJ+fSSy/N/PnzU1ZWlrKyskyePDlJcvvtt+czn/lMmjVrVprn1VdfzUMPPZShQ4c2mH/MmDE577zz8ulPf/oD3Y+hQ4fm9ttvX69t7ty5Wbhw4QeaC6AI5UUXAAAAAADAB1dRUZGKiorcfffd+fSnP52mTZuuN2b48OFp3rx57r///vzxj3/MF77whZxxxhn57Gc/mx133HG98dOmTctFF12UG264Ib17984TTzyRU089NS1btsxJJ52U+vr6HHzwwdlll11yzz33pF27dpk3b17Wrl2bf//3f8/TTz+dBx54IL/85S+TJDvssEOS5JFHHsnxxx/fYK1Zs2alRYsWqa6u3iT3Y7/99svll1+et956q3QvqqqqsvPOO+eRRx5Jly5dNsk6AJuL0A4AAAAAYCtUXl6eyZMn59RTT81NN92UmpqaHHzwwTn22GPTq1evzJo1K3PmzMnSpUvTtGnT0isot99++9x111057bTT1pvz4osvzvjx43P00UcnSXbbbbc888wz+f73v5+TTjopP/rRj/Lqq6/mN7/5TSn069q1a+n8ioqKlJeXp127dg3mXbRoUTp06LBe284779zg1Zgbo0OHDlm9enVefvnldOzYsUH7okWLNskaAJuT0A4AAAAAYCs1bNiwHH744XnkkUfy2GOP5f77789//dd/5eabb87KlStTX1+fNm3aJEnWrl2bJPnzn//8nq+LXLlyZRYuXJhTTjklp556aqn9nXfeKe2Ye/LJJ9O7d+/33KX3fv761782eDXmP2vbGM2bN0/y7nfi/WP7P7YBbImEdgAAAAAAW7FmzZrlM5/5TD7zmc/kwgsvzOjRo3PxxRfny1/+ctq3b5+ZM2cmSX73u9/lqKOOyv/+7/+mX79+681TX1+fJPnhD3+Y/fffv0Ff48aNk/y/YOyDqqyszOuvv/4v2zbGa6+9liRp27bteu3/2AawJdo0+44BAAAAANgi7LHHHlm5cmVqamry8ssvp7y8PF27ds0nP/nJJMknP/nJVFZWrnfezjvvnA4dOuQPf/hDunbt2uBnt912S5L06tUrTz75ZCkg+0fbbbdd1qxZs157796988wzz6zX9vLLL2+y4O7pp5/Orrvu2uDa3nzzzSxcuDC9e/feJGsAbE5COwAAAACArdDy5ctz6KGHZurUqfntb3+bF154IXfeeWf+67/+K0ceeWQGDRqUvn375qijjsr06dPz5z//OUny3e9+N3Pnzn3POS+99NJcccUVue6667JgwYI89dRTmTRpUq655pokyXHHHZd27drlqKOOyuzZs/OHP/whP/nJT/LrX/86SdKpU6e88MILefLJJ7Ns2bK89dZbSZLBgwdn1qxZDdbq3bt3KisrM3v27AbtL7/8cp588sk8//zzSZKnnnrqfYPCv3nkkUfy2c9+tkHbY489lqZNm6Zv374bcksBCiW0AwAAAADYClVUVGT//ffPtddem/79+6dHjx658MILc+qpp+aGG25IWVlZ7rvvvvTv3z8nn3xyvvCFLyRJlixZkp133vk95xw9enRuvvnmTJo0KT179szBBx+cyZMnl3babbfddpk+fXp22mmnHHbYYenZs2euvPLK0uszhw0bliFDhuSQQw5J27Zt8+Mf/zhJcsIJJ+R3v/tdnn322dJajRs3zsknn5xp06Y1qOGmm25K7969S9+r179///Tu3Tv33HNPg3EXX3xx6fObb76Zu+++u8F38SXJj3/845xwwglp0aLFB76/AB+1snXr1q0ruggA4F39+/dPp06dcuuttxZdCsD78rwCgK2f3+fbnnnz5qVPnz6pra1NTU3NR77+2LFj83//7//N97///VLbyy+/nD333DPz5s1Lx44dN2iev13HxRdfnEsuuSRJcuONN+anP/1ppk+fXhq3bNmy7L777pk7d24pdGTr5HnFtsJOOwAAAAAANrtvfetb6dixY9auXVtqa9euXSZOnJjFixdv8DwLFy5MkhxxxBGltiZNmuT6669vMO7FF1/M9773PYEdsNUoL7oAAAAAAAA+/lq3bp1vfvOb67Uf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QrCWLVvmxhtvzLx58/5paNe7d+/07t27dNypU6f87//+bx555JEGoV15eXnatWv3T2v92te+lq9+9as577zzSm277777B6q3c+fO6dy5c2lMx44dM3PmzDzyyCMN1qqsrCzVcvvtt6dFixYNQrvjjz++wfhrrrkmEydOzG9/+9sMHDgwdXV1eeCBB/Kb3/wm++yzT5Lk+uuvz2GHHZarr746HTp0yG233ZajjjoqZ5xxRqm2888/P9/5znfyH//xHykrKyvNv9NOO6V169bveV8+7L+fv+f1mAAAAAAAAB/CpEmT8oc//CEXX3zxh55j7dq1OfHEEzN27NjsueeeG3TOG2+8kR133PFDr5kkTzzxRB599NEcfPDBDdqfe+65dOjQIZ07d84JJ5yQxYsXl/qWLl2axx9/PDvttFMOOOCA7Lzzzjn44IMza9asjar3+eefzwMPPLBeLX9v4sSJOfbYY9OyZcv37F+9enV+8IMfZIcddshee+2V5N1dga1bty4FdkkyaNCgNGrUqPQazbfeeivNmjVrMFfz5s3zxz/+MYsWLWrQvvfee6d9+/b5zGc+k9mzZ7/vNX8YQjsAAAAAAIAP6Lnnnst5552XqVOnrvcKyQ/iO9/5TsrLy/PVr351g8Y///zzuf7663P66ad/qPV23XXXNG3aNPvss0/+4z/+I6NHjy717b///pk8eXIeeOCB3HjjjXnhhRdy0EEH5S9/+UuS5A9/+EOSd79L7tRTT80DDzyQmpqaDBw4MM8999wHrveAAw5Is2bN8qlPfSoHHXRQvv3tb7/nHHPmzMnTTz/doNa/uffee1NRUZFmzZrl2muvzS9+8YtUVlYmSV5++eUGr7BM3t1JuOOOO5a+j27w4MH53//938yYMSNr167NggULMn78+CTJkiVLkiTt27fPTTfdlJ/85Cf5yU9+kk9+8pMZMGBA5s2b989v9Ifg9ZgAAAAAAAAfwJo1a3L88cfn0ksvTbdu3T70PLW1tfnv//7vzJs3r8FrGP+ZP/3pTxkyZEiGDx+eU0899UOt+cgjj6S+vj6PPfZYzjvvvHTt2jXHHXdckjR4vWOvXr2y//77p2PHjrnjjjtyyimnZO3atUmS008/PSeffHKSd1+7OWPGjNxyyy254oorPlC9//M//5O//OUvmT9/fsaOHZurr74655577nrjJk6cmJ49e2a//fZbr++QQw7Jk08+mWXLluWHP/xhjjnmmNJuwA1x6qmnZuHChTniiCPy9ttvp1WrVjnrrLNyySWXlL6nb/fdd2/wCtADDjggCxcuzLXXXpvbbrttg9bZEHbaAQAAAAAAfAB/+ctfMnfu3Jx55pkpLy9PeXl5vv3tb2f+/PkpLy/PQw89tEHzPPLII1m6dGmqqqpK8yxatChnn312OnXq1GDsn//85xxyyCE54IAD8oMf/OBD177bbrulZ8+eOfXUU/O1r30tl1xyyT8d27p163Tr1i3PP/98knd3nCXJHnvs0WBcdXV1g9dobmi9n/zkJ7PHHnvkuOOOy5VXXplLLrkka9asaTBm5cqVuf3223PKKae85xwtW7ZM165d8+lPfzoTJ05MeXl5Jk6cmCRp165dli5d2mD8O++8k9dee630XXllZWX5zne+k/r6+ixatCgvv/xyKRz8++/d+0f77bdf6b5sKnbaAQAAAAAAfACtWrXKU0891aDte9/7Xh566KHcdddd2W233TZonhNPPDGDBg1q0DZ48OCceOKJpZ1sybs71g455JD06dMnkyZNKu0A21hr167NW2+99U/76+vrs3Dhwpx44olJkk6dOqVDhw559tlnG4xbsGBBg116H6betWvX5u233y7t5vubO++8M2+99VZGjBjxga+pb9++WbFiRWpra9OnT58kyUMPPZS1a9dm//33b3Be48aNs8suuyRJfvzjH6dv375p27btP13nySefLIWYm4rQDgAAAAAA2ObV19c32Dn1wgsv5Mknn8yOO+6YqqqqnH/++fnTn/6UW2+9NY0aNUqPHj0anL/TTjulWbNmDdr/1Zxt2rRJmzZtGszTpEmTtGvXrvQ6xj/96U8ZMGBAOnbsmKuvvjqvvvpqaezfdoslyTPPPFMK0+rr6/Pkk08mSfbee+8kyXe/+91UVVWle/fuSZL/83/+T66++uoG36V3zjnnZOjQoenYsWP+/Oc/5+KLL07jxo1Lr88sKyvL2LFjc/HFF2evvfbK3nvvnSlTpuT3v/997rrrrg2ud9q0aWnSpEl69uyZpk2bZu7cuTn//PPz7//+72nSpEmD+zFx4sQcddRR692nlStX5vLLL8/nP//5tG/fPsuWLct3v/vd/OlPf8rw4cOTvLsDcMiQITn11FNz00035e23386ZZ56Z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PIceemiWLl2a+++/P9XV1WnVqlWOP/74rFq1qnTeAw88kAMPPDCtW7dOmzZtcsQRR2ThwoWl/hdffDFlZWX5n//5nxx88MFp1qxZpk2bljVr1uTrX/966bxzzz0369atW6/upk2bpl27dmnXrl323nvvnHfeeXnppZfy6quvJknuueeeHHPMMTnllFPStWvX7LnnnjnuuONy+eWXb/S9BwAAANjaCO0AADaTN998M3369MnPf/7zPP300znttNNy4oknZs6cOaUxY8eOzcMPP5yf/exnmT59embOnJl58+Y1mOftt9/OuHHjMn/+/Nx999158cUXM2rUqPXWu+SSS3LDDTfk0UcfzUsvvZRjjjkmEyZMyI9+9KP8/Oc/z/Tp03P99deXxq9cuTJf//rXM3fu3MyYMSONGjXKF77whaxdu7bBvOedd17OOuus1NXVZfDgwRk/fnwmT56cW265JbNmzcprr72Wn/70p+97L+rr6zN16tR07do1bdq0SZK0a9cujz32WBYtWvRBby0AAADAx0550QUAAGyt7r333lRUVDRoW7NmTenzLrvsknPOOad0/JWvfCUPPvhg7rjjjuy3336pr6/PxIkTM3Xq1AwcODBJMmXKlOy6664N5vziF79Y+ty5c+dcd9112XfffVNfX99g/csuuyz9+vVLkpxyyik5//zzs3DhwnTu3DlJ8m//9m/51a9+lW984xtJkmHDhjVY55Zbbknbtm3zzDPPpEePHqX2MWPG5Oijjy4dT5gwIeeff36p7aabbsqDDz74vvdn5cqVad++fe699940avTu/zd28cUX5+ijj06nTp3SrVu39O3bN4cddlj+7d/+rTQGAAAAYFvhryEAAB/SIYcckieffLLBz80331zqX7NmTcaNG5eePXtmxx13TEVFRR588MEsXrw4SbJw4cKsXr06+++/f+mcHXfcMbvvvnuDdWprazN06NBUVVVl++23z8EHH5wkpXn+plevXqXPO++8c1q0aFEK7P7W9vev1Xzuuedy3HHHpXPnzmnVqlU6der0nvPus88+pc9vvPFGlixZ0qDm8vLyBmPe6/7MmTMngwcPzuc+97nSzrr27dvn17/+dZ566qmcddZZeeedd3LSSSdlyJAh6+32AwAAAPi4s9MOAOBDatmyZbp27dqg7Y9//GPp81VXXZX//u//zoQJ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z7vsskvOOeec0vFXvvKVPPjgg7njjjuy3377pb6+PhMnTszUqVMzcODAJMmUKVOy6667Npjzi1/8Yulz586dc91112XfffdNfX19g/Uvu+yy9OvXL0lyyimn5Pzzz8/ChQvTuXPnJMm//du/5Ve/+lW+8Y1vJEmGDRvWYJ1bbrklbdu2zTPPPJMePXqU2seMGZOjjz66dDxhwoScf/75pbabbropDz744Pven5UrV6Z9+/a5995706jRu/tWLr744hx99NHp1KlTunXrlr59++awww7Lv/3bv5XGABTN0wgAAAAAYAt3yCGH5Mknn2zwc/PNN5f616xZk3HjxqVnz57ZcccdU1FRkQcffDCLFy9OkixcuDCrV6/O/vvvXzpnxx13zO67795gndra2gwdOjRVVVXZfvvtc/DBBydJaZ6/6dWrV+nzzjvvnBYtWpQCu7+1/f1rNZ977rkcd9xx6dy5c1q1apVOnTq957z77LNP6fMbb7yRJUuWNKi5vLy8wZj3uj9z5szJ4MGD87nPfa60s659+/b59a9/naeeeipnnXVW3nnnnZx00kkZMmTIerv9AIpipx0AAAAAwBauZcuW6dq1a4O2P/7xj6XPV111Vf77v/87EyZMSM+ePdOyZcuMGTMmq1ev3uA1Vq5cmcGDB2fw4MGZNm1a2rZtm8WLF2fw4MHrzdOkSZPS57KysgbHf2v7+zBs6NCh6dixY374wx+mQ4cOWbt2bXr06LHevC1bttzgev/xvL+/PzfffHN22GGH/PCHP8xll11Wau/Ro0d69OiRL3/5yznjjDNy0EEH5eGHH84hhxzyodYF2JTstAMAAAAA2MrNnj07Rx55ZEaMGJG99tornTt3zoIFC0r9Xbp0SZMmTfL444+X2l5//fUGY37/+99n+fLlufLKK3PQQQele/fuDXbLfVjLly/Ps88+mwsuuCADBw5MdXV1Xn/99X953g477JD27ds3qPmdd95JbW3tvzy3rKwsjRo1yl//+td/OmaPPfZI8m5YCbAlsNMOAAAAAGAr96lPfSp33XVXHn300XziE5/INddck1deeaUUTFVUVOSUU07J2LFj06ZNm+y000751re+1eD73KqqqrLddtvl+uuvzxlnnJGnn34648aN2+jaPvGJT6RNmzb5wQ9+kPbt22fx4sU577zzNujcs846K1deeWU+9alPpXv37rnmmmuyYsWK9ca99dZbefnll5O8G0becMMNqa+vz9ChQ5MkX/rSl9KhQ4cceuih2XXXXbNkyZJcdtlladu2bfr27bvR1wiwKdhpBwAAAACwlbvgggtSU1OTwYMHZ8CAAWnXrl2OOuqoBmOuuuqqHHTQQRk6dGgGDRqUAw88MH369Cn1t23bNpMnT86dd96ZPfbYI1deeWWuvvrqja6tUaNGuf3221NbW5sePXrka1/7Wq666qoNOvfss8/OiSeemJNOOil9+/bN9ttvny984QvrjXvggQfSvn37tG/fPvvvv39+85vf5M4778yAAQOSJIMGDcpjjz2W4cOHp1u3bhk2bFiaNWuWGTNmpE2bNht9jQCbQtm6devWFV0EAPCu/v37p1OnTrn11luLLgXgfXleAcDmNW/evPTp0ye1tbWpqakpuhyAjz3PXbYEdtoBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABSsvOgCAAAAAID3VldXV3QJANsEz1u2BEI7AAAAANjCVFZWpkWLFhkxYkTRpQBsM1q0aJHKysqiy2AbJrQDAAAAgC1MVVVV6urqsmzZss22xujRo9O+ffuMGzdus60BsCl8VM+rysrKVFVVbdY14P0I7QAAAABgC1RVVbVZ/3hcUVGRNm3apKamZrOtAbApeF6xrWhUdAEAAAAAAACwrRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAsMXr1KlTJkyYUHQZAP+S5xUfltAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAACA97Ry5cqMHDkyFRUVad++fcaPH58BAwZkzJgxSd59Bdxll11WGtOxY8fcc889efXVV3PkkUemoqIivXr1yty5cxvM+5Of/CR77rlnmjZtmk6dOmX8+PEN+pcuXZqhQ4emefPm2W233TJt2rT1aluxYkVGjx6dtm3bplWrVjn00EMzf/78zXYvgC2b5xUfB0I7AAAAAOA9jR07Ng8//HB+9rOfZfr06Zk5c2bmzZvXYMy1116bfv365Yknnsjhhx+eE088MSNHjsyIESMyb968dOnSJSNHjsy6deuSJLW1tTnmmGNy7LHH5qmnnsoll1ySCy+8MJMnTy7NOWrUqLz00kv51a9+lbvuuivf+973snTp0gbrDh8+PEuXLs3999+f2tra1NTUZODAgXnttdc2+30BtjyeV3wclBddAAAAAACw5amvr8/EiRMzderUDBw4MEkyZcqU7Lrrrg3GHXbYYTn99NOTJBdddFFuvPHG7Lvvvhk+fHiS5Bvf+Eb69u2bV155Je3atcs111yTgQMH5sILL0ySdOvWLc8880yuuuqqjBo1KgsWLMj999+fOXPmZN99902STJw4MdXV1aU1Z82alTlz5mTp0qVp2rRpkuTqq6/O3XffnbvuuiunnXba5r05wBbF84qPCzvtAAAAAID1LFy4MKtXr87+++9fattxxx2z++67NxjXq1ev0uedd945SdKzZ8/12v6286Suri79+vVrMEe/fv3y3HPPZc2aNamrq0t5eXn69OlT6u/evXtat25dOp4/f37q6+vTpk2bVFRUlH5eeOGFLFy4cCOvHNjaeF7xcWGnHQAAAADwoTVp0qT0uays7J+2rV27dpOtWV9fn/bt22fmzJnr9f39H8sB/p7nFVs6O+0AAAAAgPV06dIlTZo0yeOPP15qe/3117NgwYKNmre6ujqzZ89u0DZ79ux069YtjRs3Tvfu3fPOO++ktra21P/ss89mxYoVpeOampq8/PLLKS8vT9euXRv8VFZWblR9wNbH84qPC6EdAAAAALCeioqKnHLKKRk7dmweeuihPP300xk1alQaNdq4PymeffbZmTFjRsaNG5cFCxZkypQpueGGG3LOOeckSXbfffcMGTIkp59+eh5//PHU1tZm9OjRad68eWmOQYMGpW/fvjnqqKMyffr0vPjii3n00UfzrW99K3Pnzt2o+oCtj+cVHxdCOwAAAADgPV111VU56KCDMnTo0AwaNCgHHnhgg+9u+jBqampyxx135Pbbb0+PHj1y0UUX5dvf/nZGjRpVGjNp0qR06NAhBx98cI4++uicdtpp2WmnnUr9ZWVlue+++9K/f/+cfPLJ6datW4499tgsWrSo9J1UwLbF84qPg7J169atK7oIAOBd/fv3T6dOnXLrrbcWXQrA+/K8AoCt34f9fT5gwIDsvffemTBhwuYpDOAfeF6xrbDTDgAAAAAAAAomtAMAAAAAAICClRddAAAAAACw9Zg5c2bRJQBsEM8rtjZ22gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUrL7oANs7ixYuzbNmyosvYaJWVlamqqiq6DAAAAAAAgEII7bZiixcvTnV1dVatWlV0KRutRYsWqaurE9wBAAAAAADbJKHdVmzZsmVZtWpVpk6dmurq6qLL+dDq6uoyYsSILFu2TGgHAAAAAABsk4R2HwPV1dWpqakpugwAAAAAAAA+pEZFFwAAAAAAAADbOqEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2rHRTjzxxPznf/5ng7Znn3027dq1y1/+8pcPPe+yZcuy00475Y9//GOD9mOPPTbjx4//0PMCAAAAAABsaYR2W5CXX345X/nKV9K5c+c0bdo0n/zkJzN06NDMmDFjs647efLktG7d+kOdO3/+/Nx333356le/2qD9/PPPz1e+8pVsv/32SZI333wzo0aNSs+ePVNeXp6jjjrqX85dWVmZkSNH5uKLL27QfsEFF+Tyyy/PG2+88aFqBgAAAAAA2NII7bYQL774Yvr06ZOHHnooV111VZ566qk88MADOeSQQ/If//Ef73nO22+//RFXub7rr78+w4cPT0VFRalt8eLFuffeezNq1KhS25o1a9K8efN89atfzaBBgzZ4/pNPPjnTpk3La6+9Vmrr0aNHunTpkqlTp26SawAAAAAAACia0G4L8eUvfzllZWWZM2dOhg0blm7dumXPPffM17/+9Tz22GNJkrKystx44435/Oc/n5YtW+aWW25JksycOTM1NTVp1qxZOnfunEsvvTTvvPNOae5rrrkmPXv2TMuWLfPJT34yX/7yl1NfX1869+STT84bb7yRsrKylJWV5ZJLLkmSvPXWWznnnHOyyy67pGXLltl///0zc+bM0rxr1qzJXXfdlaFDhza4ljvuuCN77bVXdtlll1Jby5Ytc+ONN+bUU09Nu3btNvi+7LnnnunQoUN++tOfNmgfOnRobr/99g2eBwAAAAAAYEsmtNsCvPbaa3nggQfyH//xH2nZsuV6/X//6spLLrkkX/jCF/LUU0/l85//fJLkoosuyllnnZVnnnkm3//+9zN58uRcfvnlpXMaNWqU6667Lr/73e8yZcqUPPTQQzn33HOTJAcccEAmTJiQVq1aZcmSJVmyZEnOOeecJMmZZ56ZX//617n99tvz29/+NsOHD8+QIUPy3HPPJUl++9vf5o033sg+++zToN5HHnlkvbaNsd9+++WRRx5Zr23OnDl56623Ntk6AAAAAAAARRHabQGef/75rFu3Lt27d/+XY48//vicfPLJ6dy5c9q3b58kGTVqVE466aR07tw5n/nMZzJu3Lh8//vfL50zZsyYHHLIIenUqVMOPfTQXHbZZbnjjjuSJNttt1122GGHlJWVpV27dmnXrl0qKiqyePHiTJo0KXfeeWcOOuigdOnSJeecc04OPPDATJo0KUmyaNGiNG7cODvttFODGhctWpQOHTpsqtuTDh06ZNGiReu1rV69Oi+//PImWwcAAAAAAKAo5UUXQLJu3boNHvteO9huvvnmTJ48uXS8Zs2avPnmm1m1alVatGiRX/7yl7niiivy+9//Pv/3//7fvPPOOw3638tTTz2VNWvWpFu3bg3a33rrrbRp0yZJ8te//jVNmzZNWVlZgzF//etf06xZsw2+pn+lefPmWbVq1XptSdZrBwAAAAAA2BoJ7bYAn/rUp1JWVpbf//73/3Lse70+8/TTT89XvvKV9dqbNWuWF198MUcccUS+9KUv5fLLL8+OO+6YWbNm5ZRTTsnq1av/aWhXX1+fxo0bp7a2No0bN27QV1FRkSSprKzMqlWrsnr16my33Xal/srKyrz++uv/8lo21GuvvZa2bduu15ZkvXYAAAAAAICtkdBuC7Djjjtm8ODB+e53v5uvfvWr6wVzK1asaPC9dv9o0aJF6dq163v21dbWZu3atRk/fnwaNXr3bah/ezXm32y33XZZs2ZNg7bevXtnzZo1Wbp0aQ466KD3nHvvvfdOkjzzzDOlz38795lnnvmn9X5QTz/9dAYMGLBe26677prKyspNtg4AAAAAAEBRfKfdFuK73/1u1qxZk/322y8/+clP8txzz6Wuri7XXXdd+vbt+77n3nvvvbn00kvzu9/9LnV1dbn99ttzwQUXJEm6du2at99+O9dff33+8Ic/5LbbbstNN93U4PxOnTqlvr4+M2bMyLJly7Jq1ap069YtJ5xwQkaOHJn//d//zQsvvJA5c+bkiiuuyM9//vMk7+5yq6mpyaxZsxrMN3jw4Pz6179eLwh85pln8uSTT+a1117LG2+8kSeffDJPPvnk+17bqlWrUltbm89+9rMN2h955JH12gAAAAAAALZWQrstROfOnTNv3rwccsghOfvss9OjR4985jOfyYwZM3LjjTe+77kTJkzI9OnTs+++++bTn/50rr322nTs2DFJstdee+Waa67Jd77znfTo0SPTpk3LFVdc0eD8Aw44IGeccUb+/d//PW3bts1//dd/JUkmTZqUkSNH5uyzz87uu++eo446Kr/5zW9SVVVVOnf06NGZNm1ag/k+97nPpby8PL/85S8btB922GHp3bt3/r//7//LzJkz07t37/Tu3bvU/+c//zllZWWZOXNmqe1nP/tZqqqqGuz2e/PNN3P33Xfn1FNP3YA7CwAAAAAAsOUrW7du3bqii+DDmTdvXvr06ZPa2trU1NQUUsNf//rX7L777vmf//mfBjsCv/vd7+aee+7Jgw8++C/n+Nt13HTTTTnvvPPyhz/8IZ/4xCeSJJ/+9Kfz1a9+Nccff3xp/I033pif/vSnmT59+qa/IICC9e/fP506dcqtt95adCkA78vzCgC2fn6fA1sLzyu2Fb7Tjo3SvHnz3HrrrVm2bFmD9tNPPz0rVqzIX/7yl2y//fYbNNfs2bPzzW9+sxTYLVu2LEcffXSOO+64BuOaNGmS66+/ftNcAAAAAAAAwBZAaMdGGzBgwHpt5eXl+da3vvWB5hkzZkyDHYOVlZU599xz1xs3evToD1wjAAAAAADAlsx32gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDByosugI1XV1dXdAkbZWuvHwAAAAAAYGMJ7bZilZWVadGiRUaMGFF0KRutRYsWqaysLLoMAAAAAACAQgjttmJVVVWpq6vLsmXLNtsao0ePTvv27TNu3LjNtkbybgBZVVW1WdcAAAAAAADYUgnttnJVVVWbNeyqqKhImzZtUlNTs9nWAAAAAAAA2NY1KroAAAAAAAAA2NYJ7QAAAAAAAKBgQjsAAAAAAAAomNCOj5VOnTplwoQJRZcBAAAAAADwgQjtAAAAAAAAoGBCOwAAAAAAACiY0I6NtnLlyowcOTIVFRVp3759xo8fnwEDBmTMmDFJ3n1l5WWXXVYa07Fjx9xzzz159dVXc+SRR6aioiK9evXK3LlzG8z7k5/8JHvuuWeaNm2aTp06Zfz48Q36ly5dmqFDh6Z58+bZbbfdMm3atPVqW7FiRUaPHp22bdumVatWOfTQQzN//vzNdi8AAAAAAAA+DKEdG23s2LF5+OGH87Of/SzTp0/PzJkzM2/evAZjrr322vTr1y9PPPFEDj/88Jx44okZOXJkRowYkXnz5qVLly4ZOXJk1q1blySpra3NMccck2OPPTZPPfVULrnkklx44YWZPHlyac5Ro0blpZdeyq9+9avcdddd+d73vpelS5c2WHf48OFZunRp7r///tTW1qampiYDBw7Ma6+9ttnvCwAAAAAAwIYqL7oAtm719fWZOHFipk6dmoEDByZJpkyZkl133bXBuMMOOyynn356kuSiiy7KjTfemH333TfDhw9PknzjG99I375988orr6Rdu3a55pprMnDgwFx44YVJkm7duuWZZ57JVVddlVGjRmXBggW5//77M2fOnOy7775JkokTJ6a6urq05qxZszJnzpwsXbo0TZs2TZJcffXVufvuu3PXXXfltNNO27w3BwAAAAAAYAPZacdGWbhwYVavXp3999+/1Lbjjjtm9913bzCuV69epc8777xzkqRnz57rtf1tp1xdXV369evXYI5+/frlueeey5o1a1JXV5fy8vL06dOn1N+9e/e0bt26dDx//vzU19enTZs2qaioKP288MILWbhw4UZeOQAAAAAAwKZjpx0fiSZNmpQ+l5WV/dO2tWvXbrI16+vr0759+8ycOXO9vr8P9wAAAAAAAIpmpx0bpUuXLmnSpEkef/zxUtvrr7+eBQsWbNS81dXVmT17doO22bNnp1u3bmncuHG6d++ed955J7W1taX+Z599NitWrCgd19TU5OWXX055eXm6du3a4KeysnKj6gMAAAAAANiUhHZslIqKipxyyikZO3ZsHnrooTz99NMZNWpUGjXauH9aZ599dmbMmJFx48ZlwYIFmTJlSm644Yacc845SZLdd989Q4YMyemnn57HH388tbW1GT16dJo3b16aY9CgQenbt2+OOuqoTJ8+PS+++GIeffTRfOtb38rcuXM3qj4AAAAAAIBNSWjHRrvqqqty0EEHZejQoRk0aFAOPPDABt8192HU1NTkjjvuyO23354ePXrkoosuyre//e2MGjWqNGbSpEnp0KFDDj744Bx99NE57bTTstNOO5X6y8rKct9996V///45+eST061btxx77LFZtGhR6Tv0AAAAAAAAtgS+046NVlFRkdtuuy233XZbqe3nP/956fOLL7643jnr1q1rcNypU6f12oYNG5Zhw4b903XbtWuXe++9t0HbiSee2OB4++23z3XXXZfrrrvuX14HAAAAAABAUey0AwAAAAAAgIIJ7QAAAAAAAKBgXo/JZjFz5syiSwAAAAAAANhq2GkHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGE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02Nee+2197jKbV1//fUZPXp0qqqqSm3PPPNM7rrrrjQ0NJTatmzZkk6dOuWLX/xihg0btt3jT5gwIbfccks2btxYajvqqKPSq1evzJ8/f6ecAwAAAAAA7I2EdvAmPvvZz6aioiJLly7NqFGj0qdPnxx55JH58pe/nJ///OdJkoqKisyePTsf+chHst9+++Uf//EfkySNjY2pr6/PvvvumyOOOCJXXHFFXn/99dLY11xzTY4++ujst99+OfTQQ/PZz342ra2tpWMnTJiQF198MRUVFamoqMi0adOSJK+88komT56c97///dlvv/0ycODANDY2lsbdsmVLFi5cmJEjR5ady6233ppjjjkm73//+0tt++23X2bPnp3zzz8/NTU1231djjzyyPTo0SP/+q//WtY+cuTILFiwYLvHAQAAAAAAygnt4E9s3LgxP/7xj/O5z30u++233zb7//jRldOmTcvf/M3f5PHHH89HPvKRJMnUqVPzd3/3d1m5cmW+//3vZ+7cufn6179eOqZdu3a57rrr8otf/CLz5s3Lfffdl0suuSRJcuKJJ+baa6/N/vvvn3Xr1mXdunWZPHlykuTzn/98HnrooSxYsCCPPfZYRo8enREjRuSpp55Kkjz22GN58cUXc/zxx5fVe//992/TtiNOOOGE3H///du0LV26NK+88spOmwcAAAAAAPYmQjv4E7/61a+ydevW9OvX7x37/u3f/m0mTJiQI444It27d0+SNDQ05JOf/GSOOOKInHHGGZk+fXq+//3vl4658MILc9ppp6Vnz545/fTTc9VVV+XWW29Nkuyzzz553/vel4qKitTU1KSmpiZVVVV55plnMmfOnPzoRz/KySefnF69emXy5Mk56aSTMmfOnCTJ2rVr0759+xx00EFlNa5duzY9evTYWZcnPXr0yNq1a7dpe/XVV7N+/fqdNg8AAAAAAOxNKosuAHY1W7du3e6+b7aC7Qc/+EHmzp1b2t6yZUt+97vfZfPmzencuXN+8pOf5Oqrr84vf/nL/Pa3v83rr79etv/NPP7449myZUv69OlT1v7KK6+kW7duSZKXX345HTt2TEVFRVmfl19+Ofvuu+92n9M76dSpUzZv3rxNW5Jt2gEAAAAAgO0jtIM/8Zd/+ZepqKjIL3/5y3fs+2aPz5w0aVK+8IUvbNO+7777Zs2aNfnwhz+cz3zmM/n617+eAw44IA888EDOO++8vPrqq28Z2rW2tqZ9+/ZpampK+/bty/ZVVVUlSaqrq7N58+a8+uqr2WeffUr7q6ur88ILL7zjuWyvjRs35sADD9ymLck27QAAAAAAwPYR2sGfOOCAAzJ8+PB897vfzRe/+MVtgrlNmzaVvdfuT61duza9e/d+031NTU154403MnPmzLRr9/un0/7h0Zh/sM8++2TLli1lbccee2y2bNmSDRs25OSTT37Tsf/qr/4qSbJy5crS9z8cu3Llyres98/1xBNPZMiQIdu0HXLIIamurt5p8wAAAAAAwN7EO+3gTXz3u9/Nli1bcsIJJ+S2227LU089lebm5lx33XUZNGjQ2x5711135YorrsgvfvGLNDc3Z8GCBfna176WJOndu3dee+21XH/99fmv//qv3Hzzzfne975XdnzPnj3T2tqaxYsXp6WlJZs3b06fPn3yiU98IuPHj8+//Mu/5Omnn87SpUtz9dVX5+67707y+1Vu9fX1eeCBB8rGGz58eB566KFtgsCVK1fm0UcfzcaNG/Piiy/m0UcfzaOPPvq257Z58+Y0NTXlr//6r8va77///m3aAAAAAACA7Se0gzdxxBFHZPny5TnttNNy0UUX5aijjsoZZ5yRxYsXZ/bs2W977LXXXptFixZlwIAB+eAHP5hZs2blsMMOS5Icc8wxueaaa/LNb34zRx11VG655ZZcffXVZcefeOKJ+fSnP52PfexjOfDAA/Otb30rSTJnzpyMHz8+F110Ufr27Ztzzjkn//mf/5na2trSsRMnTswtt9xSNt6HPvShVFZW5ic/+UlZ+5lnnpljjz02//Zv/5bGxsYce+yxOfbYY0v7f/Ob36SioiKNjY2ltjvuuCO1tbVlq/1+97vf5fbbb8/555+/HVcWAAAAAAB4Mx6PCW+he/fuueGGG3LDDTe86f6tW7e+afuJJ56Yz3/+82857pe+9KV86UtfKmsbN25c2fbs2bO3CQc7dOiQK664IldcccVbjt3Q0JCrr746Dz30UGlFYGVlZS699NJcc801GT58eKnvmjVr3nSM5cuXJ0n+7//9v+natWuOOeaY0r7vfOc7mTp1aln/OXPm5IQTTsgHP/jBt6wLAAAAAAB4e0I72IN06tQp//RP/5SWlpay9kmTJmXTpk35n//5n3Tp0mW7xlqy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kZx11lkZN25cxo8fn7Fjx2b58uXp1atXxo8fn61btyZJmpqa8tGPfjRjxozJ448/nmnTpmXKlCmZO3duacyGhob8+te/zk9/+tMsXLgwN954YzZs2FA27+jRo7Nhw4bce++9aWpqSn19fYYOHZqNGze2+XUpivsBAAAAAMDepLLoAmBX0Nramptuuinz58/P0KFDkyTz5s3LIYccUtbvzDPPzKRJk5IkU6dOzezZszNgwICMHj06SfKVr3wlgwYNyrPPPpuamppcc801GTp0aKZMmZIk6dOnT1auXJkZM2akoaEhq1atyr333pulS5dmwIABSZKbbropdXV1pTkfeOCBLF26NBs2bEjHjh2TJN/+9rdz++23Z+HChbngggva9uIUwP0AAAAAAGBvY6UdJFm9enVeffXVDBw4sNR2wAEHpG/fvmX9+vfvX/p+8MEHJ0mOPvrobdr+sDKrubk5gwcPLhtj8ODBeeqpp7Jly5Y0NzensrIyxx13XGl/v3790rVr19L2ihUr0tramm7duqWqqqr0efrpp7N69eodPPNdk/sBAAAAAMDexko7+DN06NCh9L2iouIt2954442dNmdra2u6d++exsbGbfb9cZi0N3I/AAAAAADYU1hpB0l69eqVDh065OGHHy61vfDCC1m1atUOjVtXV5clS5aUtS1ZsiR9+vRJ+/bt069fv7z++utpamoq7X/yySezadOm0nZ9fX3Wr1+fysrK9O7du+xTXV29Q/XtqtwPAAAAAAD2NkI7SFJVVZXzzjsvF198ce6777488cQTaWhoSLt2O/aPyEUXXZTFixdn+vTpWbVqVebNm5cbbrghkydPTpL07ds3I0aMyKRJk/Lwww+nqakpEydOTKdOnUpjDBs2LIMGDco555yTRYsWZc2aNXnwwQdz2WWXZdmyZTtU367K/QAAAAAAYG8jtIP/NWPGjJx88skZOXJkhg0blpNOOqns3WbvRn19fW699dYsWLAgRx11VKZOnZorr7wyDQ0NpT5z5sxJjx49cuqpp+bcc8/NBRdckIMOOqi0v6KiIvfcc09OOeWUTJgwIX369MmYMWOydu3a0jvb9kTuBwAAAAAAexPvtIP/VVVVlZtvvjk333xzqe3uu+8ufV+zZs02x2zdurVsu2fPntu0jRo1KqNGjXrLeWtqanLXXXeVtY0bN65su0uXLrnuuuty3XXXveN57CncDwAAAAAA9iZW2gEAAAAAAEDBhHYAAAAAAABQMI/HhLfR2NhYdAn8EfcDAAAAAIA9lZV2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwSqLLgAAYG/3zDPPpKWlpegydlh1dXVqa2uLLgMAAABgtyS0AwAo0DPPPJO6urps3ry56FJ2WOfOndPc3Cy4AwAAAHgXhHYAAAVqaWnJ5s2bM3/+/NTV1RVdzrvW3NycsWPHpqWlRWgHAAAA8C4I7QAAdgF1dXWpr68vugwAAAAACtKu6AIAAAAAAABgbye0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAADJu3Lh84xvfKGt78sknU1NTk//5n/951+O2tLTkoIMOyn//93+XtY8ZMyYzZ8581+MCAAAA7GmEdgAAO9H69evzhS98IUcccUQ6duyYQw89NCNHjszixYvbdN65c+ema9eu7+rYFStW5J577skXv/jFsvavfvWr+cIXvpAuXbokSX73u9+loaEhRx99dCorK3POOee849jV1dUZP358Lr/88rL2r33ta/n617+eF1988V3VDAAAALCnEdoBAOwka9asyXHHHZf77rsvM2bMyOOPP54f//jHOe200/K5z33uTY957bXX3uMqt3X99ddn9OjRqaqqKrU988wzueuuu9LQ0FBq27JlSzp16pQvfvGLGTZs2HaPP2HChNxyyy3ZuHFjqe2oo45Kr169Mn/+/J1yDgAAAAC7O6EdAMBO8tnPfjYVFRVZunRpRo0alT59+uTII4/Ml7/85fz85z9PklRUVGT27Nn5yEc+kv322y//+I//mCRpbGxMfX199t133xxxxBG54oor8vrrr5fGvuaaa3L00Udnv/32y6GHHprPfvazaW1tLR07YcKEvPjii6moqEhFRUWmTZuWJHnllVcyefLkvP/9789+++2XgQMHprGxsTTuli1bsnDhwowcObLsXG699dYcc8wxef/7319q22+//TJ79uycf/75qamp2e7rcuSRR6ZHjx7513/917L2kSNHZsGCBds9DgAAAMCeTGgHALATbNy4MT/+8Y/zuc99Lvvtt982+//40ZXTpk3L3/zN3+Txxx/PRz7ykSTJ1KlT83d/93dZuXJlvv/972fu3Ln5+te/XjqmXbt2ue666/KLX/wi8+bNy3333ZdLLrkkSXLiiSfm2muvzf77759169Zl3bp1mTx5cpLk85//fB566KEsWLAgjz32WEaPHp0RI0bkqaeeSpI89thjefHFF3P88ceX1Xv//fdv07YjTjjhhNx///3btC1dujSvvPLKTpsHAAAAYHcltAMA2Al+9atfZevWrenXr9879v3bv/3bTJgwIUcccUS6d++eJGloaMgnP/nJHHHEETnjjDMyffr0fP/73y8dc+GFF+a0005Lz549c/rpp+eqq67KrbfemiTZZ5998r73vS8VFRWpqalJTU1Nqqqq8swzz2TOnDn50Y9+lJNPPjm9evXK5MmTc9JJJ2XOnDlJkrVr16Z9+/Y56KCDympcu3ZtevTosbMuT3r06JG1a9du0/bqq69m/fr1O20eAAAAgN1VZdEFAADsCbZu3brdfd9sBdsPfvCDzJ07t7S9ZcuW/O53v8vmzZvTuXPn/OQnP8nVV1+dX/7yl/ntb3+b119/vWz/m3n88cezZcuW9OnTp6z9lVdeSbdu3ZIkL7/8cjp27JiKioqyPi+//HL23Xff7T6nd9KpU6ds3rx5m7Yk27QDAAAA7I2EdgAAO8Ff/uVfpqKiIr/85S/fse+bPT5z0qRJ+cIXvrBN+7777ps1a9bkwx/+cD7zmc/k61//eg444IA88MADOe+88/Lqq6++ZWjX2tqa9u3bp6mpKe3bty/bV1VVlSSprq7O5s2b8+qrr2afffYp7a+urs4LL7zwjueyvTZu3JgDDzxwm7Yk27QDAAAA7I2EdgAAO8EBBxyQ4cOH57vf/W6++MUvbhPMbdq0qey9dn9q7dq16d2795vua2pqyhtvvJGZM2emXbvfP938D4/G/IN99tknW7ZsKWs79thjs2XLlmzYsCEnn3zym479V3/1V0mSlStXlr7/4diVK1e+Zb1/rieeeCJDhgzZpu2QQw5JdXX1TpsHAAAAYHflnXYAADvJd7/73WzZsiUnnHBCbrvttjz11FNpbm7Oddddl0GDBr3tsXfddVeuuOKK/OIXv0hzc3MWLFiQr33ta0mS3r1757XXXsv111+f//qv/8rNN9+c733ve2XH9+zZM62trVm8eHFaWlqyefPm9OnTJ5/4xCcyfvz4/Mu//EuefvrpLF26NFdffXXuvvvuJL9f5VZfX58HHnigbLzhw4fnoYce2iYIXLlyZR599NFs3LgxL774Yh599NE8+uijb3tumzdvTlNTU/76r/+6rP3+++/fpg0AAABgbyW0AwDYSY444ogsX748p512Wi666KIcddRROeOMM7J48eLMnj37bY+99tprs2jRogwYMCAf/OAHM2vWrBx22GFJkmOOOSbXXHNNvvnNb+aoo47KLbfckquvvrrs+BNPPDGf/vSn87GPfSwHHnhgvvWtbyVJ5syZk/Hjx+eiiy5K3759c8455+Q///M/U1tbWzp24sSJueWWW8rG+9CHPpTKysr85Cc/KWs/88wzc+yxx+bf/u3f0tjYmGOPPTbHHntsaf9vfvObVFRUpLGxsdR2xx13pLa2tmy13+9+97vcfvvtOf/887fjygIAAADs+TweEwBgJ+revXtuuOGG3HDDDW+6f+vWrW/afuKJJ+bzn//8W477pS99KV/60pfK2saNG1e2PXv27G3CwQ4dOuSKK67IFVdc8ZZjNzQ05Oqrr85DDz1UWhFYWVmZSy+9NNdcc02GDx9e6rtmzZo3HWP58uVJkv/7f/9vunbtmmOOOaa07zvf+U6mTp1a1n/OnDk54YQT8sEPfvAt6wIAAADYmwjtAAD2cp06dco//dM/paWlpax90qRJ2bRpU/7nf/4nXbp02a6xlixZkksvvTR/8Rd/kSRpaWnJueeem49//ONl/Tp06JDrr79+55wAAAAAwB5AaAcAQIYMGbJNW2Vl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H300F154YSZOnJh///d/f8e6f/KTn5TqXrduXY477rjSvurq6gwfPjyzZ8/ekUsDAAAAAMAurLLoAgB2pj+sjEuSmpqa/P3f/31OPvnkPPfccznwwAOTJF27di31OfTQQ3P22Wdn+fLlSZJNmzbl/vvvT2NjY0499dQkyWGHHZYTTjihbJ4FCxbkjDPOyL777ltq+973vpfDDz88M2fOTJLU1dXlgQceyKxZszJ8+PC3rbtbt26lmt7MyJEjc9lll2XGjBl/zuUAAAAAAGA3YaUdsMdqbW3N/Pnz07t373Tr1u1N+6xatSr33XdfBg4cmCSpqqpKVVVVbr/99rJHZv6p+++/P8cff3xZ20MPPZRhw4aVtQ0fPjwPPfTQO9b6kY98JAcddFBOOumk3HnnndvsP+GEE/Lf//3fWbNmzTuOBQAAAADA7kdoB+xR7rrrrlLw1qVLl9x555354Q9/mHbt/t/P3cc//vFUVVVl3333Td++fXPkkUfmq1/9apKksrIyc+fOzbx589K1a9cMHjw4l156adl78ZJk7dq16dGjR1nb+vXrc/DBB5e1HXzwwfntb3+bl19++U3rraqqysyZM/OjH/0od999d0466aScc8452wR3f5hr7dq17+7CAAAAAACwSxPaAXuUP7xP7tFHH83SpUszfPjwfOhDHyoLu2bNmpVHH300K1asyF133ZVVq1Zl3Lhxpf2jRo3Kb37zm9x5550ZMWJEGhsbU19fn7lz55b6vPzyy2WPxny3qqur8+UvfzkDBw7MgAED8n/+z//J2LFjt3kMZqdOnZIkmzdv3uE5AQAAAADY9QjtgD3Kfvvtl969e6d3794ZMGBAfvCDH+Sll17KP/zDP5T61NTUpHfv3unbt2/OOuusXHHFFfnhD3+YX/3qV6U+++67b84444xMmTIlDz74YBoaGnL55ZeX9ldXV+eFF14om7umpibPPvtsWduzzz6b/fffvxS6bY+BAweW1ZIkGzduTJLSe/kAAAAAANizCO2APVpFRUXatWv3lo+nTJL27dsnydv2+cAHPpCXXnqptH3sscdm5cqVZX0GDRqUxYsXl7X9x3/8RwYNGvRn1fzoo4+me/fuZW1PPPFEOnTokCOPPPLPGgsAAAAAgN1DZdEFAOxMr7zyStavX58keeGFF3LDDTektbU1I0eOLPXZtGlT1q9fnzfeeCNPPfVUrrzyyvTp0yd1dXV5/vnnM3r06HzqU59K//7906VLlyxbtizf+ta3cvbZZ5fGGD58eObNm1c296c//enccMMNueSSS/KpT30q9913X2699dbcfffdpT433HBD/vVf/7UU7s2bNy/77LNPjj322CTJv/zLv+Qf//Ef84Mf/KBs7Pvvvz8nn3zyn7ViDwAAAACA3YfQDtij/PjHPy6tUuvSpUv69euXH/3oRxkyZEipz4QJE5L8fhVeTU1NTjnllHzjG99IZWVlqqqqMnDgwMyaNSurV6/Oa6+9lkMPPTTnn39+Lr300tIYn/jEJ3LJJZfkySefTN++fZMkhx9+eO6+++586Utfyne+850ccsgh+cEPfpDhw4eXjmtpacnq1avLap4+fXrWrl2bysrK9OvXLz/84Q/z//1//19ZnwULFmTatGk781IBAAAAALALEdoBe4y5c+dm7ty5b9tn69atb7u/Y8eOufrqq3P11Ve/bb8DDjggn//853PNNdfk+9//fql9yJAheeSRR97yuGnTppWFb5/85CfzyU9+8m3nuvfee9OuXbttgjwAAAAAAPYc3mkH8C5ddtllOeyww/LGG2+06TwvvfRS5syZk8pK/58FAAAAAMCeyn8BBniXunbtWvbIzLZihR0AAAAAwJ7PSjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBglUUXAOyampubiy6BPYg/TwAAAAAAb09oB5Sprq5O586dM3bs2KJLYQ/TuXPnVFdXF10GAAAAAMAuSWgHlKmtrU1zc3NaWlrabI6JEyeme/fumT59epvNwfZ7r+5HdXV1amtr23QOAAAAAIDdldAO2EZtbW2bhitVVVXp1q1b6uvr22wOtp/7AQAAAABQvHZFFwAAAAAAAAB7O6EdAAAAAAAAFExoBwAAAAAAAAUT2gG8g549e+baa68tugz+l/sBAAAAAOyJhHYAAAAAAABQMKEdAAAAAAAAFExoB+ySXnrppYwfPz5VVVXp3r17Zs6cmSFDhuTCCy9M8vtHJF511VWlPocddljuvPPOPPfcczn77LNTVVWV/v37Z9myZWXj3nbbbTnyyCPTsWPH9OzZMzNnzizbv2HDhowcOTKdOnXK4YcfnltuuWWb2jZt2pSJEyfmwAMPzP7775/TTz89K1asaLNrsStwPwAAAAAA2pbQDtglXXzxxfnZz36WO+64I4sWLUpjY2OWL19e1mfWrFkZPHhwHnnkkZx11lkZN25cxo8fn7Fjx2b58uXp1atXxo8fn61btyZJmpqa8tGPfjRjxozJ448/nmnTpmXKlCmZO3duacyGhob8+te/zk9/+tMsXLgwN954YzZs2FA27+jRo7Nhw4bce++9aWpqSn19fYYOHZqNGze2+XUpivsBAAAAANC2KosuAOBPtba25qabbsr8+fMzdOjQJMm8efNyyCGHlPU788wzM2nSpCTJ1KlTM3v27AwYMCCjR49OknzlK1/JoEGD8uyzz6ampibXXHNNhg4dmilTpiRJ+vTpk5UrV2bGjBlpaGjIqlWrcu+992bp0qUZMGBAkuSmm25KXV1dac4HHnggS5cuzYYNG9KxY8ckybe//e3cfvvtWbhwYS644IK2vTgFcD8AAAAAANqelXbALmf16tV59dVXM3DgwFLbAQcckL59+5b169+/f+n7wQcfnCQ5+uijt2n7w8qs5ubmDB48uGyMwYMH56mnnsqWLVvS3NycysrKHHfccaX9/fr1S9euXUvbK1asSGtra7p165aqqqrS5+mnn87q1at38Mx3Te4HAAAAAEDbs9IO2G116NCh9L2iouIt2954442dNmdra2u6d++exsbGbfb9cZi0N3I/AAAAAADePSvtgF1Or1690qFDhzz88MOlthdeeCGrVq3aoXHr6uqyZMmSsrYlS5akT58+ad++ffr165fXX389TU1Npf1PPvlkNm3aVNqur6/P+vXrU1lZmd69e5d9qqurd6i+XZX7AQAAAADQ9oR2wC6nqqoq5513Xi6++OLcd999eeKJJ9LQ0JB27XbsJ+uiiy7K4sWLM3369KxatSrz5s3LDTfckMmTJydJ+vbtmxEjRmTSpEl5+OGH09TUlIkTJ6ZTp06lMYYNG5ZBgwblnHPOyaJFi7JmzZo8+OCDueyyy7Js2bIdqm9X5X4AAAAAALQ9oR2wS5oxY0ZOPvnkjBw5MsOGDctJ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NCiLFy8ua/uP//iPDBo0qKztiSeeyCGHHJLq6urtPg8AAAAA2F1UFl0AAFC8V155pfSuuBdeeCE33HBDWltbM3LkyFKfTZs2Zf369XnjjTfy1FNP5corr0yfPn1SV1eX559/PqNHj86nPvWp9O/fP126dMmyZcvyrW99K2effXZpjOHDh2fevHllc3/605/ODTfckEsuuSSf+tSnct999+XWW2/N3XffXdbv/vvvz1//9V+34VUAAAAAgOII7QCA/PjHP0737t2TJF26dEm/fv3yox/9KEOGDCn1mTBhQpLfr8KrqanJKaeckm984xuprKxMVVVVBg4cmFmzZmX16tV57bXXcuihh+b888/PpZdeWhrjE5/4RC655JI8+eST6du3b5Lk8MMPz913350vfelL+c53vpNDDjkkP/jBDzJ8+PDScb/73e9y++2358c//vF7cDUAAAAA4L0ntAOAvdzcuXMzd+7ct+2zdevWt93fsWPHXH311bn66qvftt8BBxyQz3/+87nmmmvy/e9/v9Q+ZMiQPPLII2953Jw5c3LCCSfkgx/84NuODwAAAAC7K++0AwDeU5dddlkOO+ywvPHGG9t9TIcOHXL99de3YVUAAAAAUCwr7QCA91TXrl3LHpm5PSZOnNhG1QAAAADArsFKOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGCVRRcAALub5ubmoktgD+LPEwAAAACJ0A4Atlt1dXU6d+6csWPHFl0Ke5jOnTunurq66DIAAAAAKJDQDgC2U21tbZqbm9PS0tJmc0ycODHdu3fP9OnT22wOtt97dT+qq6tTW1vbpnMAAAAAsGsT2gHAn6G2trZNw5Wqqqp069Yt9fX1bTYH28/9AAAAAOC90q7oAgAAAAAAAGBvJ7QDAAAAAACAggntAAAAAAAAoGBCOwDgXevZs2euvfbaosvgf7kfAAAAALsvoR0AAAAAAAAUTGgHAAAAAAAABRPaAcBu5qWXXsr48eNTVVWV7t27Z+bMmRkyZEguvPDCJL9/ROJVV11V6nPYYYflzjvvzHPPPZezzz47VVVV6d+/f5YtW1Y27m233ZYjjzwyHTt2TM+ePTNz5syy/Rs2bMjIkSPTqVOnHH744bnlllu2qW3Tpk2ZOHFiDjzwwOy///45/fTTs2LFija7FrsC9wMAAACAnUFoBwC7mYsvvjg/+9nPcscdd2TRokVpbGzM8uXLy/rMmjUrgwcPziOPPJKzzjor48aNy/jx4zN27NgsX748vXr1yvjx47N169YkSVNTUz760Y9mzJgxefzxxzNt2rRMmTIlc+fOLY3Z0NCQX//61/npT3+ahQsX5sYbb8yGDRvK5h09enQ2bNiQe++9N01NTamvr8/QoUOzcePGNr8uRXE/AAAAANgZKosuAADYfq2trbnpppsyf/78DB06NEkyb968HHLIIWX9zjzzzEyaNClJMnXq1MyePTsDBgzI6NGjkyRf+cpXMmjQoDz77LOpqanJNddck6FDh2bKlClJkj59+mTlypWZMWNGGhoasmrVqtx7771ZunRpBgwYkCS56aabUldXV5rzgQceyNKlS7Nhw4Z07NgxSfLtb387t99+exYuXJgLLrigbS9OAdwPAAAAAHYWK+0AYDeyevXqvPrqqxk4cGCp7YADDkjfvn3L+vXv37/0/eCDD06SHH300du0/WFlVnNzcwYPHlw2xuDBg/PUU09ly5YtaW5uTmVlZY477rjS/n79+qVr166l7RUrVqS1tTXdunVLVVVV6fP0009n9erVO3jmuyb3AwAAAICdxUo7ANgDdejQofS9oqLiLdveeOONnTZna2trunfvnsbGxm32/XGYtDdyPwAAAAB4J1baAcBupFevXunQoUMefvjhUtsLL7yQVatW7dC4dXV1WbJkSVnbkiVL0qdPn7Rv3z79+vXL66+/nqamptL+J598Mps2bSpt19fXZ/369amsrEzv3r3LPtXV1TtU367K/QAAAABgZxHaAcBupKqqKuedd14uvvji3HfffXniiSfS0NCQdu127F/pF110URYvXpzp06dn1apVmTdvXm644YZMnjw5SdK3b9+MGDEikyZNysMPP5ympqZMnDgxnTp1Ko0xbNiwDBo0KOecc04WLVqUNWvW5MEHH8xll12WZcuW7VB9uyr3AwAAAICdRWgHALuZGTNm5OSTT87IkSMzbNiwnHTSSWXvNns36uvrc+utt2bBggU56qijMnXq1Fx55ZVpaGgo9ZkzZ0569OiRU089Neeee24uuOCCHHTQQaX9FRUVueeee3LKKadkwoQJ6dOnT8aMGZO1a9eW3tm2J3I/AAAAANgZvNMOAHYzVVVVufnmm3PzzTeX2u6+++7S9zVr1mxzzNatW8u2e/bsuU3bqFGjMmrUqLect6amJnfddVdZ27hx48q2u3Tpkuuuuy7XXXfdO57HnsL9AAAAAGBnsNIOAAAAAAAACia0AwAAAAAAgIJ5PCYA7AEaGxuLLoE/4n4AAAAA8Oey0g4AAAAAAAAK9v+zd+/xX8/3//hv70rHdzK9UZm3FpU3OfTOYTmP+oStzRhzSEo5bHOcyClDaGbhg8m2DxWij9kcPnOKLJfKIYqc3mKN8tknhzcybyGq3x/77fX1kkNDnh2u18vlffF6Ph6P5+Nxfz5fLr2t2x7Pp9AOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgTYouAIDPNnfu3NTX1y+3+RsaGvL6669nxowZy20Nlt3X9X1UVVWlurp6ua4BAAAAACw7oR3ACmzu3LmpqanJggULlus6jz32WO64447lugbL7uv4Plq2bJm6ujrBHQAAAACsIIR2ACuw+vr6LFiwINddd11qamqKLodVRF1dXfr165f6+nqhHQAAAACsIIR2ACuBmpqa1NbWFl0GAAAAAADLSaOiCwAAAAAAAIDVndAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QD4yr344oupqKjI448/niSZNGlSKioqMn/+/C8991lnnZWtttrqS8/zdZs4cWJqamqyaNGiJMmVV16Zvn37FlwVAAAAALCiENoBsJTXXnstP/nJT1JdXZ1mzZqlXbt26dOnT6ZOnfqF5tt+++0zb968tGnTJkkyZsyYrLXWWl9hxSu+k08+OWeccUYaN26cJDnssMMyY8aMTJ48ueDKAAAAAIAVQZOiCwBgxbPvvvtm4cKFGTt2bDp16pRXXnklEydOzOuvv/6F5mvatGnatWv3FVe54lu4cGGaNm2aKVOmZPbs2dl3331LfU2bNs1BBx2USy+9NDvttFOBVQIAAAAAKwI77QAoM3/+/EyePDkXXHBBvvOd72TDDTfMtttum1NPPTXf//73kyQVFRUZNWpU9txzz7Ro0SKdOnXKTTfd9KlzfvTxmJMmTcrAgQPz1ltvpaKiIhUVFTnrrLM+9dxf/vKXWW+99dK6desMGjQo7733Xln/I488kt69e6eqqipt2rTJLrvskhkzZpSNefbZZ7PjjjumefPm2XTTTXPvvfemoqIit9xyS2nMAw88kK222irNmzfP1ltvnVtuuaXsEZ9J8tRTT2XPPfdMZWVl1ltvvRxyyCGpr68v9e+66645+uijc/zxx6eqqip9+vRJkowfPz69e/dO8+bNy+rq27dvbrvttrz77rufev0AAAAAwOpBaAdAmcrKylRWVuaWW27J+++//6njhg0bln333TczZ87MwQcfnAMOOCB1dXWfO//222+fSy65JGuuuWbmzZuXefPmZciQIZ849sYbb8xZZ52V888/P48++mjat2+fK664omzM22+/nUMPPTRTpkzJQw89lM6dO2evvfbK22+/nSRZtGhR9t5777Rs2TIPP/xwfve73+X0008vm+Mf//hH+vbtm8033zwzZszI8OHDM3To0LIx8+fPz2677Zbu3bvn0UcfzV133ZVXXnkl+++/f9m4sWPHpmnTppk6dWquvPLKJMnkyZOz9dZbL3V9W2+9dT788MM8/PDDn3vfAAAAAIBVm8djAlCmSZMmGTNmTA4//PBceeWVqa2tzS677JIDDjggW2yxRWncfvvtl8GDBydJhg8fnnvuuSeXXXbZUqHaxzVt2jRt2rRJRUXF5z4y85JLLsmgQYMyaNCgJMm5556be++9t2y33W677VZ2zu9+97ustdZauf/++/O9730v99xzT2bPnp1JkyaV1jvvvPPSu3fv0jnXX399Kioq8vvf/760G+/vf/97Dj/88NKYyy+/PN27d8/5559farv66quzwQYb5LnnnkuXLl2SJJ07d86vfvWrsprmzJmTDh06LHV9LVu2TJs2bTJnzpzPvA8AAAAAwKrPTjsAlrLvvvvm//7v/3Lbbbdljz32yKRJk1JbW5sxY8aUxvTs2bPsnJ49ey7TTrt/R11dXbbbbrul1vmoV155JYcffng6d+6cNm3aZM0110xDQ0Pmzp2bJJk1a1Y22GCDsoBw2223LZtj1qxZ2WKLLcoeX/nxMTNnzsxf/vKX0k7EysrKbLLJJkmS2bNnl8b16NFjqet49913l3o05r+0aNEiCxYs+NR7AAAAAACsHuy0A+ATNW/ePL17907v3r0zbNiwDB48OL/4xS8yYMCAoksrc+ihh+b111/Pf/7nf2bDDTdMs2bN0rNnzyxcuPArXaehoSF9+/bNBRdcsFRf+/btS59btWq1VH9VVVXefPPNT5z3jTfeyDrrrPPVFQoAAAAArJTstANgmWy66aZ55513SscPPfRQWf9DDz2UmpqaZZqradOmWbRo0eeOq6mpWep9bx9fd+rUqTn22GOz1157ZbPNNkuzZs1SX19f6u/atWteeumlvPLKK6W2Rx55pGyOrl275sknnyx7h9/Hx9TW1ubpp59Ox44ds/HGG5f9fFJQ91Hdu3fPM888s1T77Nmz895776V79+6feT4AAAAAsOoT2gFQ5vXXX89uu+2W6667Lk888UReeOGF/OEPf8ivfvWr/OAHPyiN+8Mf/pCrr746zz33XH7xi19k2rRpOfroo5dpjY4dO6ahoSETJ05MfX196fGQp556avr3718ad9xxx+Xqq6/O6NGjS+s8/fTTZXN17tw51157berq6vLwww/n4IMPTosWLUr9vXv3zkYbbZRDDz00TzzxRKZOnZozzjgjSVJRUZEkOeigg7J48eIcccQRqaury913351f//rXZWN+9rOf5Y033siBBx6YRx55JLNnz87dd9+dgQMHfm4A2adPn0yZMmWp9smTJ6dTp07ZaKONlum+AQAAAACrLqEdAGUqKyuz3Xbb5eKLL87OO++cbt26ZdiwYTn8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AAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AX5thw4bl/PPPL2ubNWtW2rVrl7fffvsLz1tfX5911103//u//1vWfsABB2TkyJFfaM6KiorccsstX7imouy88865/vrrkyQLFy5Mx44d8+ijjxZcFQAAAADweYR2ACuhl19+Occcc0w6deqUZs2aZYMNNkjfvn0zceLE5brumDFjstZaa33h86dOnZpjjz22rO3UU0/NMccck9atWydJ3nvvvQwYMCCbb755mjRpkr333vtz562qqkr//v3zi1/8oqz9jDPOyHnnnZe33nrrC9e8Mrntttvyyiuv5IADDkiSNG3aNEOGDMnQoUMLrgwAAAAA+DxCO4CVzIsvvpgePXrkvvvuy4UXXpgnn3wyd911V77zne/kZz/72See88EHH3zNVX6yXr16pbKysnQ8d+7c/PnPf86AAQNKbYsWLUqLFi1y7LHHplevXss898CBAzNu3Li88cYbpbZu3bplo402ynXXXfeV1L8iWrJkST788MMkyaWXXpqBAwemUaP/9+v94IMPzpQpU/L0008XVSIAAAAAsAyEdgArmZ/+9KepqKjItGnTsu+++6ZLly7ZbLPN8vOf/zwPPfRQkn8+2nHUqFH5/ve/n1atWuW8885Lktx6662pra1N8+bN06lTp5x99tmlwCdJLrroomy++eZp1apVNthgg/z0pz9NQ0NDkmTSpEkZOHBg3nrrrVRUVKSioiJnnXVWkuT999/PkCFDsv7666dVq1bZbrvtMmnSpNK8ixYtSpLstNNOZddy4403Zsstt8z6669famvVqlVGjRqVww8/PO3atVvm+7LZZpulQ4cOufnmm8va+/btm/Hjx3/muc8//3x23nnnNG/ePJtuumnuueeepcYMHTo0P/zhD5Mk3//+9zNs2LClwtBzzz036667blq3bp3BgwfnlFNOyVZbbVXq//DDD3PsscdmrbXWStu2bTN06NAceuihZbsJFy9enBEjRuRb3/pWWrRokS233DI33XRTqX/SpEmpqKjInXfemR49eqRZs2aZMmVKXnvttdx3333p27dvWU3f+MY3ssMOO3zuPQAAAAAAiiW0A1iJvPHGG7nrrrvys5/9LK1atVqq/6OPrjzrrLPywx/+ME8++WQOO+ywTJ48Of37989xxx2XZ555Jr/97W8zZsyYUqCXJI0aNcqll16ap59+OmPHjs19992Xk08+OUmy/fbb55JLLsmaa66ZefPmZd68eRkyZEiS5Oijj86DDz6Y8ePH54knnsh+++2XPfbYI88//3ySlP656aabltU7efLkbL311l/Z/dl2220zefLkpdqmTZuW999//xPPWbx4cfbZZ580bdo0Dz/8cK688spPfJxk69atSyHlkCFD8vvf/z4XX3xxqX/cuHE577zzcsEFF2T69Omprq7OqFGjyua44IILMm7cuIwePTpTp07NP/7xj6XemzdixIhcc801ufLKK/P000/nhBNOSL9+/XL//feXjTvllFPyy1/+MnV1ddliiy0yZcqUtGzZMjU1Nct0XwAAAACAFUuTogsAYNn99a9/zZIlS7LJJpt87tiDDjooAwcOLB0fdthhOeWUU3LooYcmSTp16pThw4fn5JNPLr0L7vjjjy+N79ixY84999wcddRRueKKK9K0adO0adMmFRUVZTvg5s6dm9GjR2fu3Lnp0KFDkn+GWnfddVdGjx6d888/P/PmzUuSrL322mU1zpkz5ysN7Tp06JDHHntsqbaFCxfm5ZdfzoYbbrjUOffee2+effbZ3H333aX6zz///Oy5555l484444zMmDEjSbLzzjvnww8/zPjx40uh5mWXXZZBgwaV7vmZZ56ZCRMmlHYq/mvMqaeeWtqxd/nll+eOO+4o9b///vs5//zzc++996Znz55J/vk9TZkyJb/97W+zyy67lMaec8456d27d+l4zpw5WW+99coejfnRezBnzpzPu30AAAAAQIGEdgArkSVLlizz2I+HYTNnzszUqVPLdtYtWrQo7733XhYsWJCWLVvm3nvvzYgRI/Lss8/mH//4Rz788MOy/k/y5JNPZtGiRenSpUtZ+/vvv5+2bduWPif/fGznR7377rtp3rz5Ml/T52nRokUWLFiwVFuSpdr/pa6uLhtssEEpsEtSCsw+6r//+78zYsSIJMmOO+6YxYsXZ8011yz1z5o1Kz/96U/Lztl2221z3333JUneeuutvPLKK9l2221L/Y0bN06PHj2yePHiJP8MZRcsWFAWxiXJwoUL071797K2j3+/n3UvP+m+AAAAAAArFqEdwEqkc+fOqaioyLPPPvu5Yz/++MyGhoacffbZ2WeffZYa27x587z44ov53ve+l5/85Cc577zzsvbaa2fKlCkZNGhQFi5c+KmhXUNDQxo3bpzp06encePGZX2VlZVJ/t9jOz/+Driqqqq8+eabn3sty+qNN97IOuuss1RbkqXa/x0PPvhgDj744Bx55JGZOXNmrr/++jz55JMZOXLkl6r34/61K+/2228ve89fkjRr1qzs+OPf72fdy0+6LwAAAADAisU77QBWImuvvXb69OmT3/zmN3nnnXeW6p8/f/6nnltbW5tZs2Zl4403XuqnUaNGmT59ehYvXpyRI0fm29/+drp06ZL/+7//K5ujadOmWbRoUVlb9+7ds2jRorz66qtLzfuvx2h27do1SfK3v/1tqXOfeeaZL3IrPtFTTz211I60p556Kt/85jdTVVX1iefU1NTkpZdeKj3CM0keeuihsjEPPPBANtxwwwwaNChJUl1dvdTjJrt27ZpHHnmkrO2jx23atMl6661X1rZo0aLSIzeTf77zr1mzZpk7d+5S93KDDTb4zGvv3r17Xn755U8M7j7pvgAAAAAAKxahHcBK5je/+U0WLVqUbbfdNn/84x/z/PPPp66uLpdeeuknPtbxX84888xcc801Ofvss/P000+nrq4u48ePzxlnnJEk2XjjjfPBBx/ksssuy9/+9rdce+21ufLKK8vm6NixYxoaGjJx4sTU19dnwYIF6dKlSw4++OD0798/f/rTn/LCCy9k2rRpGTFiRG6//fYkyTe+8Y0kyeOPP142X58+ffLggw8uFQQ+88wzefzxx/PGG2/krbfeyuOPP77UuR+3YMGCTJ8+Pf/xH/9R1j558uSytr///e/ZZJNNMm3atCRJr1690qVLlxx66KGZOXNmJk+enNNPP71sjs6dO2fu3Lm5++67kyQ33HBDbr755rIxxxxzTK666qqMHTs2zz//fM4999w88cQTZY8EPeaYYzJixIjceuutmTVrVo477ri8+eabpTGtW7fOkCFDcsIJJ2Ts2LGZPXt2ZsyYkcsuuyxjx479zOvv3r17qqqqMnXq1KX6Pn4PAAAAAIAVj9AOYCXTqVOnzJgxI9/5zndy4oknplu3bundu3cmTpyYUaNGfep5ffr0yZ///OdMmDAh22yzTb797W/n4osvzoYbbpgk2XLLLXPRRRflggsuSLdu3TJu3LjSO9z+Zfvtt89RRx2VH//4x1lnnXXyq1/9KkkyevTo9O/fPyeeeGK6du2avffeO4888kiqq6vLzr/zzjvLjvfcc880adIk9957b1n7Xnvtle7du+d//ud/MmnSpHTv3r1sp9iLL76YioqKTJo0qdR26623prq6OjvttFOp7b333sstt9ySww8/vNT2wQcfZNasWaV3vDVq1Cg333xz3n333Wy77bYZPHhw2Xv/kuT73/9+TjjhhFxwwQVJkieeeCLDhg0rG3PwwQfn1FNPzZAhQ1JbW5sXXnghAwYMKHvP3NChQ3PggQemf//+6dmzZyorK9OnT5+yMcOHD8+wYcMyYsSI1NTUZI899sjtt9+eb33rW/ksjRs3zsCBAzNu3Liy9gcffDBvvfVWfvSjH33m+QAAAABAsSqWLFmypOgiVkU777xzOnbsmGuuuaboUojvY0Xj+1j9zJgxIz169Mh6662Xm2++uWxH4G9+85vcdtttpV1sy+Ivf/lL9tlnn/ztb38r7eL79re/nWOPPTYHHXRQadyoUaNy8803Z8KECV/pdUyfPj21tbWfO753795p165drr322k/sX7x4cWpqarL//vtn+PDhX7q+l19+OZtttllmzJhRCmN//OMfZ8stt8xpp532pedfHfnzasXi+1ix+D4AYOXn9zmwsvDnFauLJkUXAMDq45xzzkl9fX1Z25FHHpn58+fn7bffTuvWrZdpnjvuuCOnnXZaKbCrr6/PPvvskwMPPLBs3BprrJHLLrvsqyn+cyxYsCBXXnll+vTpk8aNG+eGG27Ivffem3vuuac0Zs6cOZkwYUJ22WWXvP/++7n88svzwgsvlAWNX0a7du1y1VVXZe7cudlwww2zcOHCbL755jnhhBO+kvkBAAAAgOVHaAfA12brrbdeaodakyZNlnqH3Oe58MILy46rqqpy8sknLzVu8ODB/36RX1BFRUXuuOOOnHfeeXnvvffStWvX/PGPf0yvXr1KYxo1apQxY8ZkyJAhWbJkSbp165Z77703NTU1X1kde++9d+lz06ZNS+8sBAAAAABWbEI7APgKtGjRYql3833cBhtskKlTp35NFQEAAAAAK5NGRRcAAAAAAAAAqzuhHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwZoUXQAAq4+6urqiS/hSVvb6AQAAAIAVl9AOgOWuqqoqLVu2TL9+/You5Utr2bJlqqqqii4DAAAAAFjFCO0AWO6qq6tTV1eX+vr6okv50qqqqlJdXV10GQAAAADAKkZoB8DXorq6WtgFAAAAAPApGhVdAAAAAAAAAKzuhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQsCZFFwCseObOnZv6+vrlNn9DQ0Nef/31zJgxY7mtAfBV+Lr+vKqqqkp1dfVyXQMAAACAFZvQDigzd+7c1NTUZMGCBct1ncceeyx33HHHcl0D4Kvwdfx51bJly9TV1QnuAAAAAFZjQjugTH19fRYsWJDrrrsuNTU1RZcDsMqrq6tLv379Ul9fL7QDAAAAWI0J7YBPVFNTk9ra2qLLAAAAAACA1UKjogsAAAAAAACA1Z3QDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0A+Mq9+OKLqaioyOOPP54kmTRpUioqKjJ//vwvPfdZZ52Vrbba6kvP83WbOHFiampqsmjRoiTJlVdemb59+xZcFQAAAACwohDaAbCU1157LT/5yU9SXV2dZs2apV27dunTp0+mTp36hebbfvvtM2/evLRp0yZJMmbMmKy11lpfYcUrvpNPPjlnnHFGGjdunCQ57LDDMmPGjEyePLngygAAAACAFUGTogsAYMWz7777ZuHChRk7dmw6deqUV155JRMnTszrr7/+heZr2rRp2rVr9xVXueJbuHBhmjZtmilTpmT27NnZd999S31NmzbNQQcdlEsvvTQ77bRTgVUCAAAAACsCO+0AKDN//vxMnjw5F1xwQb7zne9kww03zLbbbptTTz013//+95MkFRUVGTVqVPbcc8+0aNEinTp1yk033fSpc3708ZiTJk3KwIED89Zbb6WioiIVFRU566yzPvXcX/7yl1lvvfXSunXrDBo0KO+9915Z/yOPPJLevXunqqoqbdq0yS677JIZM2aUjXn22Wez4447pnnz5tl0001z7733pqKiIrfccktpzAMPPJCtttoqzZs3z9Zbb51bbrml7BGfSfLUU09lzz33TGVlZdZbb70ccsghqa+vL/XvuuuuOfroo3P88cenqqoqffr0SZKMHz8+vXv3TvPmzcvq6tu3b2677ba8++67n3r9AAAAAMDqQWgHQJnKyspUVlbmlltuyfvvv/+p44YNG5Z99903M2fOzMEHH5wDDjggdXV1nzv/9ttvn0suuSRrrrlm5s2bl3nz5mXIkCGfOPbGG2/MWWedlfPPPz+PPvpo2rdvnyuuuKJszNtvv51DDz00U6ZMyUMPPZTOnTtnr732yttvv50kWbRoUfbee++0bNkyDz/8cH73u9/l9NNPL5vjH//4R/r27ZvNN988M2bMyPDhwzN06NCyMfPnz89uu+2W7t2759FHH81dd92VV155Jfvvv3/ZuLFjx6Zp06aZOnVqrrzyyiTJ5MmTs/XWWy91fVtvvXU+/PDDPPzww5973wAAAACAVZvHYwJQpkmTJhkzZkwOP/zwXHnllamtrc0uu+ySAw44IFtssUVp3H777ZfBgwcnSYYPH5577rknl1122VKh2sc1bdo0bdq0SUVFxec+MvOSSy7JoEGDMmjQoCTJueeem3vvvbdst91uu+1Wds7vfve7rLXWWrn//vvzve99L/fcc09mz56dSZMmldY777zz0rt379I5119/fSoqKvL73/++tBvv73//ew4//PDSmMsvvzzdu3fP+eefX2q7+uqrs8EGG+S5555Lly5dkiSdO3fOr371q7Ka5syZkw4dOix1fS1btkybNm0yZ86cz7wPAAAAAMCqz047AJay77775v/+7/9y2223ZY899sikSZNSW1ubMWPGlMb07Nmz7JyePXsu0067f0ddXV222267pdb5qFdeeSWHH354OnfunDZt2mTNNddMQ0ND5s6dmySZNWtWNthgg7KAcNttty2bY9asWdliiy3KHl/58TEzZ87MX/7yl9JOxMrKymyyySZJktmzZ5fG9ejRY6nrePfdd5d6NOa/tGjRIgsWLPjUewAAAAAArB7stAPgEzVv3jy9e/dO7969M2zYsAwePDi/+MUvMmDAgKJLK3PooYfm9ddfz3/+539mww03TLNmzdKzZ88sXLjwK12noaEhffv2zQUXXLBUX/v27UufW7VqtVR/VVVV3nzzzU+c94033sg666zz1RUKAAAAAKyU7LQDYJlsuummeeedd0rHDz30UFn/Qw89lJqammWaq2nTplm0aNHnjqupqVnqfW8fX3fq1Kk59thjs9dee2WzzTZLs2bNUl9fX+rv2rVrXnrppbzyyiultkceeaRsjq5du+bJJ58se4ffx8fU1tbm6aefTseOHbPxxhuX/XxSUPdR3bt3zzPPPLNU++zZs/Pee++le/fun3k+AAAAALDqE9oBUOb111/Pbrvtluuuuy5PPPFEXnjhhfzhD3/Ir371q/zgBz8ojfvDH/6Qq6++Os8991x+8YtfZNq0aTn66KOXaY2OHTumoaEhEydOTH19fenxkKeeemr69+9fGnfcccfl6quvzujRo0vrPP3002Vzde7cOddee23q6ury8MMP5+CDD06LFi1K/b17985GG22UQw89NE888USmTp2aM844I0lSUVGRJDnooIOyePHiHHHEEamrq8vdd9+dX//612Vjfvazn+WNN97IgQcemEceeSSzZ8/O3XffnYEDB35uANmnT59MmTJlqfbJkyenU6dO2WijjZbpvgEAAAAAqy6hHQBlKisrs9122+Xiiy/OzjvvnG7dumXYsGE5/PDDc/nll5fGnX322Rk/fny22GKLXHPNNbnhhhuy6aabLtMa22+/fY466qj8+Mc/zjrrrJNf/epXSZJ58+aV3kWXJD/+8Y8zbNiwnHzyyenRo0fmzJmTn/zkJ2VzXXXVVXnzzTdTW1ubQw45JMcee2zWXXfdUn/jxo1zyy23pKGhIdtss00GDx6c008/PUlK75lbc8018z//8z95/PHHs9VWW+X000/PmWeeWTamQ4cOmTp1ahYtWpT/+I//yOabb57jjz8+a621Vho1+uxfpwcffHCefvrpzJo1q6z9hhtuyOGHH75M9wwAAAAAWLV5px0AZZo1a5YRI0ZkxIgRnzmuQ4cOmTBhwif2dezYMUuWLCkd77rrrmXHSTJq1KiMGjWqrG3MmDFLzXXaaafltNNOK2v76HvlunfvvtSjLH/0ox+VHW+yySZlO92mTp2aJNl4441Lbdtvv31mzpxZOh43blzWWGONVFdXl9o6d+6cP/3pT0vV+C+TJk36xPa11147Rx99dC666KL89re/TZI8/fTTefzxx3PjjTd+6nwAAAAAwOpDaAfAKu/mm29OZWVlOnfunL/+9a857rjjssMOO5Q9lvKaa65Jp06dsv7662fmzJkZOnRo9t9//7JHbX4Zp59+eq644oosXrw4jRo1yrx583LNNdekTZs2X8n8AAAAAMDKTWgHwCrv7bffztChQzN37txUVVWlV69eGTlyZNmYl19+OWeeeWZefvnltG/fPvvtt1/OO++8r6yGtdZaq2zHYK9evb6yuQEAAACAlZ/QDoB/28cfdbmi69+/f/r37/+ZY04++eScfPLJX1NFAAAAAADlGhVdAAAAAAAAAKzuhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAVrUnQBwIqprq6u6BIAVgv+vAUAAAAgEdoBH1NVVZWWLVumX79+RZcCsNpo2bJlqqqqii4DAAAAgAIJ7YAy1dXVqaurS319fdGlwL9l8ODBad++fYYPH150KfBvq6qqSnV1ddFlAAAAAFAgoR2wlOrqan95zEqnsrIybdu2TW1tbdGlAAAAAAD82xoVXQAAAAAAAACs7oR2AAAAAAAAUDChHQAAAAAAABRMaAcABejYsWMuueSSossAAAAAAFYQQjsAAAAAAAAomNAOAAAAAAAACia0A2C18c4776R///6prKxM+/btM3LkyOy66645/vjjk/zzkZXnnntuacyGG26Y2267La+99lp+8IMfpLKyMltssUUeffTRsnn/+Mc/ZrPNNkuzZs3SsWPHjBw5sqz/1VdfTd++fdOiRYt861vfyrhx45aqbf78+Rk8eHDWWWedrLnmmtltt90yc+bM5XYvAAAAAIAVi9AOgNXGSSedlPvvvz+33nprJkyYkEmTJmXGjBllYy6++OLssMMOeeyxx/Ld7343hxxySPr3759+/fplxowZ2WijjdK/f/8sWbIkSTJ9+vTsv//+OeCAA/Lkk0/mrLPOyrBhwzJmzJjSnAMGDMhLL72Uv/zlL7nppptyxRVX5NVXXy1bd7/99surr76aO++8M9OnT09tbW123333vPHGG8v9vgAAAAAAxWtSdAEA8HVoaGjIVVddleuuuy677757kmTs2LH55je/WTZur732ypFHHpkkOfPMMzNq1Khss8022W+//ZIkQ4cOTc+ePfPKK6+kXbt2ueiii7L77rtn2LBhSZIuXbrkmWeeyYUXXpgBAwbkueeey5133plp06Zlm222SZJcddVVqampKa05ZcqUTJs2La+++mqaNWuWJPn1r3+dW265JTfddFOOOOKI5XtzAAAAAIDC2WkHwGph9uzZWbhwYbbbbrtS29prr52uXbuWjdtiiy1Kn9dbb70kyeabb75U2792ytXV1WWHHXYom2OHHXbI888/n0WLFqWuri5NmjRJjx49Sv2bbLJJ1lprrdLxzJkz09DQkLZt26aysrL088ILL2T27Nlf8soBAAAAgJWBnXYA8BFrrLFG6XNFRcWnti1evPgrW7OhoSHt27fPpEmTlur7aLgHAAAAAKy67LQDYLWw0UYbZY011sjDDz9canvzzTfz3HPPfal5a2pqMnXq1LK2qVOnpkuXLmncuHE22WSTfPjhh5k+fXqpf9asWZk/f37puLa2Ni+//HKaNGmSjTfeuOynqqrqS9UHAAAAAKwchHYArBYqKyszaNCgnHTSSbnvvvvy1FNPZcCAAWnU6Mv9KjzxxBMzceLEDB8+PM8991zGjh2byy+/PEOGDEmSdO3aNXvssUeOPPLIPPzww5k+fXoGDx6cFi1alObo1atXevbsmb333jsTJkzIiy++mAceeCCnn356Hn300S9VHwAAAACwchDaAbDauPDCC7PTTjulb9++6dWrV3bccceyd819EbW1tbnxxhszfvz4dOvWLWeeeWbOOeecDBgwoDRm9OjR6dChQ3bZZZfss88+OeKII7LuuuuW+isqKnLHHXdk5513zsCBA9OlS5cccMABmTNnTukdegAAAADAqs077QBYbVRWVubaa6/NtddeW2q7/fbbS59ffPHFpc5ZsmRJ2XHHjh2Xatt3332z7777fuq67dq1y5///OeytkMOOaTsuHXr1rn00ktz6aWXfu51AAAAAACrHjvtAAAAAAAAoGBCOwAAAAAAACiYx2MCsFqbNGlS0SUAAAAAANhpBwAAAAAAAEUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFKxJ0QUAsHqYO3du6uvrl9v8DQ0Nef311zNjxozltkaSVFVVpbq6ermuAQAAAACsfoR2ACx3c+fOTU1NTRYsWLBc13nsscdyxx13LNc1WrZsmbq6OsEdAAAAAPCVEtoBsNzV19dnwYIFue6661JTU1N0OV9YXV1d+vXrl/r6eqEdAAAAAPCVEtoB8LWpqalJbW1t0WUAAAAAAKxwGhVdAAAAAAAAAKzuhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoB8DXZtiwYTn//PPL2mbNmpV27drl7bff/sLz1tfXZ911183//u//lrUfcMABGTly5Beas6KiIrfccssXrqkoO++8c66//vokycKFC9OxY8c8+uijBVcFAAAAAHweoR3ASujll1/OMccck06dOqVZs2bZYIMN0rdv30ycOHG5rjtmzJistdZaX/j8qVOn5thjjy1rO/XUU3PMMcekdevWSZL33nsvAwYMyOabb54mTZpk7733/tx5q6qq0r9///ziF78oaz/jjDNy3nnn5a233vrCNa9Mbrvttrzyyis54IADkiRNmzbNkCFDMnTo0IIrAwAAAAA+j9AOYCXz4osvpkePHrnvvvty4YUX5sknn8xdd92V73znO/nZz372ied88MEHX3OVn6xXr16prKwsHc+dOzd//vOfM2DAgFLbokWL0qJFixx77LHp1avXMs89cODAjBs3Lm+88UaprVu3btloo41y3XXXfSX1r4iWLFmSDz/8MEly6aWXZuDAgWnU6P/9ej/44IMzZcqUPP3000WVCAAAAAAsA6EdwErmpz/9aSoqKjJt2rTsu+++6dKlSzbbbLP8/Oc/z0MPPZTkn492HDVqVL7//e+nVatWOe+885Ikt956a2pra9O8efN06tQpZ599dinwSZKLLroom2++eVq1apUNNtggP/3pT9PQ0JAkmTRpUgYOHJi33norFRUVqaioyFlnnZUkef/99zNkyJCsv/76adWqVbbbbrtMmjSpNO+iRYuSJDvttFPZtdx4443Zcssts/7665faWrVqlVGjRuXwww9Pu3btlvm+bLbZZunQoUNuvvnmsva+fftm/Pjxn3nu888/n5133jnNmzfPpptumnvuuWepMUOHDs0Pf/jDJMn3v//9DBs2bKkw9Nxzz826666b1q1bZ/DgwTnllFOy1VZblfo//PDDHHvssVlrrbXStm3bDB06NIceemjZbsLFixdnxIgR+da3vpUWLVpkyy23zE033VTqnzRpUioqKnLnnXemR48eadasWaZMmZLXXnst9913X/r27VtW0ze+8Y3ssMMOn3sPAAAAAIBiCe0AViJvvPFG7rrrrvzsZz9Lq1atlur/6KMrzzrrrPzwhz/Mk08+mcMOOyyTJ09O//79c9xxx+WZZ57Jb3/724wZM6YU6CVJo0aNcumll+bpp5/O2LFjc9999+Xkk09Okmy//fa55JJLsuaaa2bevHmZN29ehgwZkiQ5+uij8+CDD2b8+PF54oknst9++2WPPfbI888/nySlf2666aZl9U6ePDlbb731V3Z/tt1220yePHmptmnTpuX999//xHMWL16cffbZJ02bNs3DDz+cK6+88hMfJ9m6detSSDlkyJD8/ve/z8UXX1zqHzduXM4777xccMEFmT59eqqrqzNq1KiyOS644IKMGzcuo0ePztSpU/OPf/xjqffmjRgxItdcc02uvPLKPP300znhhBPSr1+/3H///WXjTjnllPzyl79MXV1dtthii0yZMiUtW7ZMTU3NMt0XAAAAAGDF0qToAgBYdn/961+zZMmSbLLJJp879qCDDsrAgQNLx4cddlhOOeWUHHrooUmSTp06Zfjw4Tn55JNL74I7/vjjS+M7duyYc889N0cddVSuuOKKNG3aNG3atElFRUXZDri5c+dm9OjRmTt3bjp06JDkn6HWXXfdldGjR+f888/PvHnzkiRrr712WY1z5sz5SkO7Dh065LHHHluqbeHChXn55Zez4YYbLnXOvffem2effTZ33313qf7zzz8/e+65Z9m4M844IzNmzEiS7Lzzzvnwww8zfvz4Uqh52WWXZdCgQaV7fuaZZ2bChAmlnYr/GnPqqaeWduxdfvnlueOOO0r977//fs4///zce++96dmzZ5J/fk9TpkzJb3/72+yyyy6lseecc0569+5dOp4zZ07WW2+9skdjfvQezJkz5/NuHwAAAABQIKEdwEpkyZIlyzz242HYzJkzM3Xq1LKddYsWLcp7772XBQsWpGXLlrn33nszYsSIPPvss/nHP/6RDz/8sKz/kzz55JNZtGhRunTpUtb+/vvvp23btqXPyT8f2/lR7777bpo3b77M1/R5WrRokQULFizVlmSp9n+pq6vLBhtsUArskpQCs4/67//+74wYMSJJsuOOO2bx4sVZc801S/2zZs3KT3/607Jztt1229x3331JkrfeeiuvvPJKtt1221J/48aN06NHjyxevDjJP0PZBQsWlIVxSbJw4cJ07969rO3j3+9n3ctPui8AAAAAwIpFaAewEuncuXMqKiry7LPPfu7Yjz8+s6GhIWeffXb22WefpcY2b948L774Yr73ve/lJz/5Sc4777ysvfbamTJlSgYNGpSFCxd+amjX0NCQxo0bZ/r06WncuHFZX2VlZZL/99jOj78DrqqqKm+++ebnXsuyeuONN7LOOuss1ZZkqfZ/x4MPPpiDDz44Rx55ZGbOnJnrr78+Tz75ZEaOHPml6v24f+3Ku/3228ve85ckzZo1Kzv++Pf7Wffyk+4LAAAAALBi8U47gJXI2muvnT59+uQ3v/lN3nnnnaX658+f/6nn1tbWZtasWdl4442X+mnUqFGmT5+exYsXZ+TIkfn2t7+dLl265P/+7//K5mjatGkWLVpU1ta9e/csWrQor7766lLz/usxml27dk2S/O1vf1vq3GeeeeaL3IpP9NRTTy21I+2pp57KN7/5zVRVVX3iOTU1NXnppZdKj/BMkoceeqhszAMPPJANN9wwgwYNSpJUV1cv9bjJrl275pFHHilr++hxmzZtst5665W1LVq0qPTIzeSf7/xr1qxZ5s6du9S93GCDDT7z2rt3756XX375E4O7T7ovAAAAAMCKRWgHsJL5zW9+k0WLFmXbbbfNH//4xzz//POpq6vLpZde+omPdfyXM888M9dcc03OPvvsPP3006mrq8v48eNzxhlnJEk23njjfPDBB7nsssvyt7/9Lddee22uvPLKsjk6duyYhoaGTJw4MfX19VmwYEG6dOmSgw8+OP3798+f/vSnvPDCC5k2bVpGjBiR22+/PUnyjW98I0ny+OOPl83Xp0+fPPjgg0sFgc8880wef/zxvPHGG3nrrbfy+OOPL3Xuxy1YsCDTp0/Pf/zHf5S1T548uazt73//ezbZZJNMmzYtSdKrV6906dIlhx56aGbOnJnJkyfn9NNPL5ujc+fOmTt3bu6+++4kyQ033JCbb765bMwxxxyTq666KmPHjs3zzz+fc889N0888UTZI0GPOeaYjBgxIrfeemtmzZqV4447Lm+++WZpTOvWrTNkyJCccMIJGTt2bGbPnp0ZM2bksssuy9ixYz/z+rt3756qqqpMnTp1qb6P3wMAAAAAYMUjtANYyXTq1CkzZszId77znZx44onp1q1bevfunYkTJ2bUqFGfel6fPn3y5z//ORMmTMg222yTb3/727n44ouz4YYbJkm23HLLXHTRRbngggvSrVu3jBs3rvQOt3/Zfvvtc9RRR+XHP/5x1llnnfzqV79KkowePTr9+/fPiSeemK5du2bvvffOI488kurq6rLz77zzzrLjPffcM02aNMm9995b1r7XXnule/fu+Z//+Z9MmjQp3bt3L9sp9uKLL6aioiKTJk0qtd16662prq7OTjvtVGp77733csstt+Twww8vtX3wwQeZNWtW6R1vjRo1ys0335x333032267bQYPHlz23r8k+f73v58TTjghF1xwQZLkiSeeyLBhw8rGHHzwwTn11FMzZMiQ1NbW5oUXXsiAAQPK3jM3dOjQHHjggenfv3969uyZysrK9OnTp2zM8OHDM2zYsIwYMSI1NTXZY489cvvtt+db3/pWPkvjxo0zcODAjBs3rqz9wQcfzFtvvZUf/ehHn3k+AAAAAFCsiiVLliwpuohV0c4775yOHTvmmmuuKboU4vuAos2YMSM9evTIeuutl5tvvrlsR+BvfvOb3HbbbaVdbMviL3/5S/bZZ5/87W9/K+3i+/a3v51jjz02Bx10UGncqFGjcvPNN2fChAlf6XVMnz49tbW1nzu+d+/eadeuXa699tpP7F+8eHFqamqy//77Z/jw4V+6vpdffjmbbbZZZsyYUQpjf/zjH2fLLbfMaaed9qXnh6L5fb5i8X0AwMrP73NgZeHPK1YXTYouAIDVxznnnJP6+vqytiOPPDLz58/P22+/ndatWy/TPHfccUdOO+20UmBXX1+fffbZJwceeGDZuDXWWCOXXXbZV1P851iwYEGuvPLK9OnTJ40bN84NN9yQe++9N/fcc09pzJw5czJhwoTssssuef/993P55ZfnhRdeKAsav4x27drlqquuyty5c7Phhhtm4cKF2XzzzXPCCSd8JfMDAAAAAMuP0A6Ar83WW2+91A61Jk2aLPUOuc9z4YUXlh1XVVXl5JNPXmrc4MGD//0iv6CKiorccccdOe+88/Lee++la9eu+eMf/5hevXqVxjRq1ChjxozJkCFDsmTJknTr1i333ntvampqvrI69t5779Lnpk2blt5ZCAAAAACs2IR2APAVaNGixVLv5vu4DTbYIFOnTv2aKgIAAAAAViaNii4AAAAAAAAAVndCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAgjUpugAAVh91dXVFl/ClrOz1AwAAAAArLqEdAMtdVVVVWrZsmX79+hVdypfWsmXLVFVVFV0GAAAAALCKEdoBsNxVV1enrq4u9fX1RZfypVVVVaW6urroMgAAAACAVYzQDoCvRXV1tbALAAAAAOBTNCq6AAAAAAAAAFjdCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYE2KLgAAgFXD3LlzU19fv9zmb2hoyOuvv54ZM2YstzVYdl/X91FVVZXq6urlugYAAACsCIR2AAB8aXPnzk1NTU0WLFiwXNd57LHHcscddyzXNVh2X8f30bJly9TV1QnuAAAAWOUJ7QAA+NLq6+uzYMGCXHfddampqSm6HFYRdXV16devX+rr64V2AAAArPKEdgAAfGVqampSW1tbdBkAAAAAK51GRRcAAAAAAAAAqzuhHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAMBn2HXXXXP88ccXXca/ZcCAAdl7772LLgMAAAD4NwjtAABY6X1aSDVp0qRUVFRk/vz5X3tNK5IBAwakoqKi9NO2bdvsscceeeKJJ8rG/f73v8+WW26ZysrKrLXWWunevXtGjBhRUNUAAACwehHaAQDASuqDDz5Y5rF77LFH5s2bl3nz5mXixIlp0qRJvve975X6r7766hx//PE59thj8/jjj2fq1Kk5+eST09DQsDxKBwAAAD5GaAcAwGrh9ddfz4EHHpj1118/LVu2zOabb54bbrihbMw777yT/v37p7KyMu3bt8/IkSOXmufaa6/N1ltvndatW6ddu3Y56KCD8uqrr5b6/7W77+6770737t3TokWL7Lbbbnn11Vdz5513pqamJmuuuWYOOuigLFiwoHTeXXfdlR133DFrrbVW2rZtm+9973uZPXt2qf/FF19MRUVF/vu//zu77LJLmjdvnnHjxmXRokX5+c9/Xjrv5JNPzpIlS5aqu1mzZmnXrl3atWuXrbbaKqecckpeeumlvPbaa0mS2267Lfvvv38GDRqUjTfeOJtttlkOPPDAnHfeeV/63gMAAACfT2gHAMBq4b333kuPHj1y++2356mnnsoRRxyRQw45JNOmTSuNOemkk3L//ffn1ltvzYQJEzJp0qTMmDGjbJ4PPvggw4cPz8yZM3PLLbfkxRdfzIABA5Za76yzzsrll1+eBx54IC+99FL233//XHLJJbn++utz++23Z8KECbnssstK49955538/Oc/z6OPPpqJEyemUaNG+eEPf5jFixeXzXvKKafkuOOOS11dXfr06ZORI0dmzJgxufrqqzNlypS88cYbufnmmz/zXjQ0NOS6667LxhtvnLZt2yZJ2rVrl4ceeihz5sz5d28tAAAA8BVoUnQBAADwVfjzn/+cysrKsrZFixaVPq+//voZMmRI6fiYY47J3XffnRtvvDHbbrttGhoactVVV+W6667L7rvvniQZO3ZsvvnNb5bNedhhh5U+d+rUKZdeemm22WabNDQ0lK1/7rnnZocddkiSDBo0KKeeempmz56dTp06JUl+9KMf5S9/+UuGDh2aJNl3333L1rn66quzzjrr5Jlnnkm3bt1K7ccff3z22Wef0vEll1ySU089tdR25ZVX5u677/7M+/POO++kffv2+fOf/5xGjf75/+P7xS9+kX322ScdO3ZMly5d0rNnz+y111750Y9+VBoDAAAALD/+1zcAAKuE73znO3n88cfLfv7rv/6r1L9o0aIMHz48m2++edZee+1UVlbm7rvvzty5c5Mks2fPzsKFC7PddtuVzll77bXTtWvXsnWmT5+evn37prq6Oq1bt84uu+ySJKV5/mWLLbYofV5vvfXSsmXLUmD3r7aPPlbz+eefz4EHHphOnTplzTXXTMeOHT9x3q233rr0+a233sq8efPKam7SpEnZmE+6P9OmTUufPn2y5557lnbWtW/fPg8++GCefPLJHHfccfnwww9z6KGHZo899lhqtx8AAADw1bPTDgCAVUKrVq2y8cYbl7X97//+b+nzhRdemP/8z//MJZdcks033zytWrXK8ccfn4ULFy7zGu+880769OmTPn36ZNy4cVlnnXUyd+7c9OnTZ6l51lhjjdLnioqKsuN/tX00DOvbt2823HDD/P73v0+HDh2yePHidOvWbal5W7Vqtcz1fvy8j96f//qv/0qbNm3y+9//Pueee26pvVu3bunWrVt++tOf5qijjspOO+2U+++/P9/5zne+0LoAAADAsrHTDgCA1cLUqVPzgx/8IP369cuWW26ZTp065bnnniv1b7TRRlljjTXy8MMPl9refPPNsjHPPvtsXn/99fzyl7/MTjvtlE022aRst9wX9frrr2fWrFk544wzsvvuu6empiZvvvnm557Xpk2btG/fvqzmDz/8MNOnT//ccysqKtKoUaO8++67nzpm0003TfLPsBIAAABYvuy0AwBgtdC5c+fcdNNNeeCBB/KNb3wjF110UV555ZVSMFVZWZlBgwblpJNOStu2bbPuuuvm9NNPL3ufW3V1dZo2bZrLLrssRx11VJ566qkMHz78S9f2jW98I23bts3vfve7tG/fPnPnzs0pp5yyTOced9xx+eUvf5nOnTtnk002yUUXXZT58+cvNe7999/Pyy+/nOSfYeTll1+ehoaG9O3bN0nyk5/8JB06dMhuu+2Wb37zm5k3b17OPffcrLPOOunZs+eXvkYAAADgs9lpBwDAauGMM85IbW1t+vTpk1133TXt2rXL3nvvXTbmwgsvzE477ZS+ffumV69e2XHHHdOjR49S/zrrrJMxY8bkD3/4QzbddNP88pe/zK9//esvXVujRo0yfvz4TJ8+Pd26dcsJJ5yQCy+8cJnOPfHEE3PIIYfk0EMPTc+ePdO6dev88Ic/XGrcXXfdlfbt26d9+/bZbrvt8sgjj+QPf/hDdt111yRJr1698tBDD2W//fZLly5dsu+++6Z58+aZOHFi2rZt+6WvEQAAAPhsFUuWLFlSdBGrop133jkdO3bMNddcU3QpxPcBAMvbjBkz0qNHj0yfPj21tbVFl8Mqwr9XALB8+fsSYGXhzytWF3baAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUrEnRBQAAsOqoq6srugRWIf59AgAAYHUitAMA4EurqqpKy5Yt069fv6JLYRXTsmXLVFVVFV0GAAAALHdCOwAAvrTq6urU1dWlvr5+ua0xePDgtG/fPsOHD19ua7Dsvq7vo6qqKtXV1ct1DQAAAFgRCO0AAPhKVFdXL9dwpbKyMm3btk1tbe1yW4Nl5/sAAACAr1ajogsAAAAAAACA1Z3QDgAAAAAAAAomtAMAAAAAAICCCe0AAGA56NixYy655JKiy+D/5/sAAABgRSe0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAFYZ77zzTvr375/Kysq0b98+I0eOzK677prjjz8+yT8fkXjuueeWxmy44Ya57bbb8tprr+UHP/hBKisrs8UWW+TRRx8tm/ePf/xjNttsszRr1iwdO3bMyJEjy/pfffXV9O3bNy1atMi3vvWtjBs3bqna5s+fn8GDB2edddbJmmuumd122y0zZ85cbvdiReD7AAAAgGUntAMAYJVx0kkn5f7778+tt96aCRMmZNKkSZkxY0bZmIsvvjg77LBDHnvssXz3u9/NIYcckv79+6dfv36ZMWNGNtpoo/Tv3z9LlixJkkyfPj37779/DjjggDz55JM566yzMmzYsIwZM6Y054ABA/LSSy/lL3/5S2666aZcccUVefXVV8vW3W+//fLqq6/mzjvvzPTp01NbW5vdd989b7zxxnK/L0XxfQAAAMCya1J0AQAA8FVoaGjIVVddleuuuy677757kmTs2LH55je/WTZur732ypFHHpkkOfPMMzNq1Khss8022W+//ZIkQ4cOTc+ePfPKK6+kXbt2ueiii7L77rtn2LBhSZIuXbrkmWeeyYUXXpgBAwbkueeey5133plp06Zlm222SZJcddVVqampKa05ZcqUTJs2La+++mqaNWuWJPn1r3+dW265JTfddFOOOOKI5XtzCuD7AAAAgH+PnXYAAKwSZs+enYULF2a77bYrta299trp2rVr2bgtttii9Hm99dZLkmy++eZLtf1rZ1ZdXV122GGHsjl22GGHPP/881m0aFHq6urSpEmT9OjRo9S/ySabZK211iodz5w5Mw0NDWnbtm0qKytLPy+88EJmz579Ja98xeT7AAAAgH+PnXYAAKxW1lhjjdLnioqKT21bvHjxV7ZmQ0ND2rdvn0mTJi3V99EwaXXk+wAAAIB/stMOAIBVwkYbbZQ11lgjDz/8cKntzTffzHPPPfel5q2pqcnUqVPL2qZOnZouXbqkcePG2WSTTfLhhx9m+vTppf5Zs2Zl/vz5pePa2tq8/PLLadKkSTbeeOOyn6qqqi9V34rK9wEAAAD/HqEdAACrhMrKygwaNCgnnXRS7rvvvjz11FMZMGBAGjX6cv/Je+KJJ2bixIkZPnx4nnvuuYwdOzaXX355hgwZkiTp2rVr9thjjxx55JF5+OGHM3369AwePDgtWrQozdGrV6/07Nkze++9dyZMmJAXX3wxDzzwQE4//fQ8+uijX6q+FZXvAwAAAP49QjsAAFYZF154YXbaaaf07ds3vXr1yo477lj2brMvora2NjfeeGPGjx+fbt265cwzz8w555yTAQMGlMaMHj06HTp0yC677JJ99tknRxxxRNZdd91Sf0VFRe64447svPPOGThwYLp06ZIDDjggc+bMKb2zbVXk+wAAAIBlV7FkyZIlRRexKtp5553TsWPHXHPNNUWXQnwfALAq+KK/z3fddddstdVWueSSS5ZPYasp3wcArPz8fQmwsvDnFasLO+0AAAAAAACgYEI7AAAAAAAAKFiTogsAAIDladKkSUWXwEf4PgAAAOCT2WkHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUrEnRBQAAAF+9uXPnpr6+frnN39DQkNdffz0zZsxYbmsAAMvX1/X7vKqqKtXV1ct1DQBYFQjtAABgFTN37tzU1NRkwYIFy3Wdxx57LHfcccdyXQMAWL6+jt/nLVu2TF1dneAOAD6H0A4AAFYx9fX1WbBgQa677rrU1NQUXQ4AsBqrq6tLv379Ul9fL7QDgM8htAMAgFVUTU1Namtriy4DAAAAWAaNii4AAAAAAAAAVndCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAYBUxYMCAVFRU5Kijjlqq72c/+1kqKioyYMCAr78wAADgcwntAAAAYBWywQYbZPz48Xn33XdLbe+9916uv/76VFdXf+F5lyxZkg8//PCrKBEAAPgEQjsAAABYhdTW1maDDTbIn/70p1Lbn/70p1RXV6d79+6ltsWLF2fEiBH51re+lRYtWmTLLbfMTTfdVOqfNGlSKioqcuedd6ZHjx5p1qxZpkyZkrfffjsHH3xwWrVqlfbt2+fiiy/OrrvumuOPP7507vvvv58hQ4Zk/fXXT6tWrbLddttl0qRJX8flAwDASktoBwAAAKuYww47LKNHjy4dX3311Rk4cGDZmBEjRuSaa67JlVdemaeffjonnHBC+vXrl/vvv79s3CmnnJJf/vKXqauryxZbbJGf//znmTp1am677bbcc889mTx5cmbMmFF2ztFHH50HH3ww48ePzxNPPJH99tsve+yxR55//vnld9EAALCSa1J0AQAAAMBXq1+/fjn11FMzZ86cJMnUqVMzfvz40m63999/P+eff37uvffe9OzZM0nSqVOnTJkyJb/97W+zyy67lOY655xz0rt37yTJ22+/nbFjx+b666/P7rvvniQZPXp0OnToUBo/d+7cjB49OnPnzi21DxkyJHfddVdGjx6d888/f7lfPwAArIyEdgAAALCKWWeddfLd7343Y8aMyZIlS/Ld7343VVVVpf6//vWvWbBgQSmM+5eFCxeWPUIzSbbeeuvS57/97W/54IMPsu2225ba2rRpk65du5aOn3zyySxatChdunQpm+f9999P27Ztv5LrAwCAVZHQDgAAAFZBhx12WI4++ugkyW9+85uyvoaGhiTJ7bffnvXXX7+sr1mzZmXHrVq1+rfWbWhoSOPGjTN9+vQ0bty4rK+ysvLfmgsAAFYnQjsAAABYBe2xxx5ZuHBhKioq0qdPn7K+TTfdNM2aNcvcuXPLHoX5eTp16pQ11lgjjzzySKqrq5Mkb731Vp577rnsvPPOSZLu3btn0aJFefXVV7PTTjt9dRcEAACrOKEdAAAArIIaN26curq60uePat26dYYMGZITTjghixcvzo477pi33norU6dOzZprrplDDz30E+ds3bp1Dj300Jx00klZe+21s+666+YXv/hFGjVqlIqKiiRJly5dcvDBB6d///4ZOXJkunfvntdeey0TJ07MFltske9+97vL98IBAGAlJbQDAACAVdSaa675qX3Dhw/POuuskxEjRuRvf/tb1lprrdTW1ua00077zDkvuuiiHHXUUfne976XNddcMyeffHJeeumlNG/evDRm9OjROffcc3PiiSfm73//e6qqqvLtb3873/ve976yawMAgFWN0A4AAABWEWPGjPnM/ltuuaX0uaKiIscdd1yOO+64Txy76667ZsmSJUu1t27dOuPGjSsdv/POOzn77LNzxBFHlNrWWGONnH322Tn77LP/vQsAAIDVmNAOAAAAWGaPPfZYnn322Wy77bZ56623cs455yRJfvCDHxRcGQAArNyEdgAAAMC/5de//nVmzZqVpk2bpkePHpk8eXKqqqqKLgsAAFZqQjsAAABgmXXv3j3Tp08vugwAAFjlNCq6AAAAAAAAAFjdCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAArWpOgCAACA5aOurq7oEgCA1Zz/HgGAZSe0AwCAVUxVVVVatmyZfv36FV0KAEBatmyZqqqqossAgBWe0A4AAFYx1dXVqaurS319fdGlACuxwYMHp3379hk+fHjRpQAruaqqqlRXVxddBgCs8IR2AACwCqqurvaXY8CXUllZmbZt26a2trboUgAAYLXQqOgCAAAAAAAAYHUntAMAAAAAAICCCe0AAAAAAACgYEI7AAAAYKXXsWPHXHLJJUWXAQAAX5jQDgAAAAAAAAomtAMAAAAAAICCCe0AAACAL+Sdd95J//79U1lZmfbt22fkyJHZddddc/zxx+f/Y+/uw7Qs67yBfwcGERiRYNAZsgEFgUlAGVSWUEShhTQ20jBfAHHBl1ozSyndUlm1thZRU1crI0GhrHAzH/OFwvARfCEGJV0nIVbFSsRBaRtQUeD5o8d7myVNQLoUPp/juI/jvs7zvM7zd183Hnj79byu5E+3rLzssstKY7p27Zrbb789L7zwQj72sY+loqIi/fr1y+LFi5vNe+utt+aAAw5I69at061bt0ybNq1Z/+rVqzNq1Ki0adMm++67b2bPnr1FbWvXrs2kSZPSuXPntG/fPkcddVSWLl26w64FAABsL6EdAAAAsE0mT56c++67Lz/5yU8yd+7czJ8/P0uWLGk25sorr8zgwYPzyCOP5Jhjjsm4ceMyfvz4jB07NkuWLEn37t0zfvz4bN68OUlSX1+f448/PieccEIee+yxTJkyJRdeeGFmzJhRmnPChAl59tln84tf/CJz5szJddddl9WrVzdbd8yYMVm9enXuuuuu1NfXp66uLsOGDcuLL764w68LAABsi/KiCwAAAADee5qamjJ9+vTMmjUrw4YNS5LMnDkz++yzT7NxRx99dM4444wkyUUXXZTrr78+hxxySMaMGZMk+eIXv5hBgwbl+eefT1VVVa644ooMGzYsF154YZKkZ8+eeeKJJzJ16tRMmDAhy5Yty1133ZVFixblkEMOSZJMnz49tbW1pTUXLFiQRYsWZfXq1WndunWS5PLLL89tt92WOXPm5PTTT9+xFwcAALaBnXYAAADAVluxYkU2bNiQgQMHlto6duyYXr16NRvXr1+/0vu99947SdK3b98t2t7YKdfQ0JDBgwc3m2Pw4MFZvnx5Nm7cmIaGhpSXl2fAgAGl/t69e6dDhw6l46VLl6apqSmdOnVKRUVF6fXUU09lxYoV2/nJAQBgx7DTDgAAANhhWrVqVXpfVlb2pm2bNm16x9ZsampKdXV15s+fv0Xfn4d7AADwbmKnHQAAALDVunfvnlatWuXhhx8utb300ktZtmzZds1bW1ubhQsXNmtbuHBhevbsmZYtW6Z37955/fXXU19fX+p/8skns3bt2tJxXV1dVq1alfLy8vTo0aPZq7KycrvqAwCAHUVoBwAAAGy1ioqKTJw4MZMnT869996bxx9/PBMmTEiLFtv3nxrOPffczJs3L5deemmWLVuWmTNn5tprr815552XJOnVq1dGjhyZM844Iw8//HDq6+szadKktGnTpjTH8OHDM2jQoIwePTpz587N008/nQceeCBf+tKXsnjx4u2qDwAAdhShHQAAALBNpk6dmsMPPzyjRo3K8OHDc9hhhzV71ty2qKuryw9/+MPccsst6dOnTy666KJccsklmTBhQmnMjTfemC5duuSII47Isccem9NPPz177bVXqb+srCx33nlnhgwZklNPPTU9e/bMCSeckGeeeab0DD0AAHi38Uw7AAAAYJtUVFTk5ptvzs0331xq++lPf1p6//TTT29xzubNm5sdd+vWbYu24447Lscdd9ybrltVVZU77rijWdu4ceOaHe+xxx65+uqrc/XVV//VzwEAAO8GdtoBAAAAAABAwYR2AAAAAAAAUDC3xwQAAADeMfPnzy+6BAAAeE+y0w4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAAChYedEFAAAAAFtv5cqVaWxs3GHzNzU1Zc2aNVmyZMkOWyNJKisrU1NTs0PXAACA9wKhHQAAALzHrFy5MrW1tVm/fv0OXeeRRx7JnXfeuUPXaNu2bRoaGgR3AADs8oR2AAAA8B7T2NiY9evXZ9asWamtrS26nG3W0NCQsWPHprGxUWgHAMAuT2gHAAAA71G1tbWpq6srugwAAOAd0KLoAgAAAAAAAGBXJ7QDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAANgJTJkyJQcddNDfZK158+altrY2GzdubNY+ZMiQfO9739uuuU844YRMmzatWdvdd9+dgw46KJs2bdquuQEA4N1MaAcAAADvAi+88EI+9alPpaamJq1bt05VVVVGjBiRhQsXFlLPW4WAX/jCF/LlL385LVu2LLXdfvvtef7553PCCSeU2r797W9n6NChad++fcrKyrJ27dq/uu6Xv/zlfOUrX8kf/vCHUtvIkSPTqlWrzJ49e5s/DwAAvNsJ7QAAAOBd4LjjjssjjzySmTNnZtmyZbn99tszdOjQrFmzpujSmlmwYEFWrFiR4447rln71VdfnVNPPTUtWvzPf2pYv359Ro4cmX/+539+2/P36dMn3bt3z6xZs5q1T5gwIVdfffX2FQ8AAO9iQjsAAAAo2Nq1a3P//ffn61//eo488sh07do1hx56aC644IL8wz/8Q2nMpEmT0rlz5wwZMiRJsmzZsrec9zvf+U5qa2uz++67p3fv3rnuuuua9f/2t7/NiSeemI4dO6Zdu3Y5+OCD8/DDD2fGjBn5l3/5lyxdujRlZWUpKyvLjBkzkiS33HJLPvzhD2f33XcvzfPCCy/k3nvvzahRo5rNf8455+T888/P3/3d323V9Rg1alRuueWWLdoWL16cFStWbNVcAADwXlFedAEAAACwq6uoqEhFRUVuu+22/N3f/V1at269xZgxY8akTZs2ueuuu/Lb3/42H//4x3PmmWfm7//+79OxY8ctxs+ePTsXXXRRrr322vTv3z+PPPJITjvttLRr1y6nnHJKmpqacsQRR+T9739/br/99lRVVWXJkiXZtGlTPvnJT+bxxx/P3XffnZ///OdJkj333DNJcv/99+ekk05qttaCBQvStm3b1NbWviPX49BDD81XvvKVvPrqq6VrUVNTk7333jv3339/unfv/o6sAwAA7yZCOwAAAChYeXl5ZsyYkdNOOy3f/OY3U1dXlyOOOCInnHBC+vXrlwULFmTRokVZvXp1WrduXboF5R577JE5c+bk9NNP32LOiy++ONOmTcuxxx6bJNl3333zxBNP5Fvf+lZOOeWUfO9738sLL7yQX/7yl6XQr0ePHqXzKyoqUl5enqqqqmbzPvPMM+nSpcsWbXvvvXezW2Nujy5dumTDhg1ZtWpVunbt2qz9mWeeeUfWAACAdxuhHQAAALwLHHfccTnmmGNy//3356GHHspdd92Vf/u3f8t3vvOdrFu3Lk1NTenUqVOSZNOmTUmS3//+93/xdpHr1q3LihUrMnHixJx22mml9tdff720Y+7RRx9N//79/+Iuvbfy8ssvN7s15pu1bY82bdok+dMz8f53+/9uAwCAnYXQDgAAAN4ldt9993z4wx/Ohz/84Vx44YWZNGlSLr744nz6059OdXV15s+fnyT5z//8z4wePTr/8R//kcGDB28xT1NTU5LkhhtuyMCBA5v1tWzZMsn/BGNbq7KyMi+99NJfbdseL774YpKkc+fOW7T/7zYAANhZvDP3rQAAAADecR/84Aezbt261NXVZdWqVSkvL0+PHj3ygQ98IEnygQ98IJWVlVuct/fee6dLly75r//6r/To0aPZa999902S9OvXL48++mgpIPvfdtttt2zcuHGL9v79++eJJ57Yom3VqlXvWHD3+OOPZ5999mn22V555ZWsWLEi/fv3f0fWAACAdxuhHQAAABRszZo1OeqoozJr1qz86le/ylNPPZUf/ehH+bd/+7d87GMfy/DhwzNo0KCMHj06c+fOze9///skyb//+79n8eLFf3HOf/mXf8m//uu/5uqrr86yZcvy2GOP5cYbb8wVV1yRJDnxxBNTVVWV0aNHZ+HChfmv//qv3HrrrXnwwQeTJN26dctTTz2VRx99NI2NjXn11VeTJCNGjMiCBQuardW/f/9UVlZm4cKFzdpXrVqVRx99NL/5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dOjQIRMnTkxTU1OzMT/84Q9z0EEHpW3btunatWumTp3arH/+/Plb1FFWVpZVq1aVxmzPn583lG/1GQAAAAAAADuZdevW5cADD8w//uM/5thjj33b561duzbjx4/PsGHD8vzzz2/znD/+8Y/z0EMPpUuXLs3af/3rX2fTpk351re+lR49euTxxx/PaaedlnXr1uXyyy9PkmzcuDFt2rTJCSeckK985St/cf527drlrLPOSr9+/dKuXbssWLAgZ5xxRtq1a5fTTz+9NO6AAw7Iz3/+89JxeXnzKOnBBx/MyJEjc8EFF+Saa65JeXl5li5dmhYtWrztelu1apXx48enrq4uHTp0yNKlS3Paaadl06ZN+epXv1pa65577km/fv2SJGvWrMmBBx6YMWPGlPp79uyZa6+9Nvvtt19efvnlXHnllfn7v//7/OY3v0nnzp2TJCeffHKee+65/OxnP8trr72WU089Naeffnq+973vJUnuuuuunHzyybnmmmvy93//92loaMhpp52WNm3a5Kyzzmr22Z988sm0b9++dLzXXnuV3m/rn58/J7QDAAAAAAB2eR/5yEfykY98ZKvPO/PMM3PSSSelZcuWW+yuertz/u53v8tnPvOZ3HPPPc12kiXJyJEjM3LkyNLxfvvtlyeffDLXX399KQRr165drr/++ixZsuRNQ7v+/funf//+peNu3brlP/7jP3L//fc3C+3Ky8tTVVX1prV+7nOfy9lnn53zzz+/1NarV6+tqne//fbLfvvtVxrTtWvXzJ8/P/fff3+ztSorK0u13HLLLWnbtm2z0O6kk05qNv6KK67I9OnT86tf/SrDhg1LQ0ND7r777vzyl7/MwQcfnCS55pprcvTRR+fyyy9Ply5dcvPNN2f06NE588wzS7VdcMEF+frXv55/+qd/SllZWWn+vfbaKx06dPiL12Vb//z8ObfHBAAAAAAA2AY33nhj/uu//isXX3zxNs+xadOmjBs3LpMnT84BBxzwts75wx/+kI4dO27zmknyyCOP5IEHHsgRRxzRrH358uXp0qVL9ttvv5x88slZuXJlqW/16tV5+OGHs9dee+VDH/pQ9t577xxxxBFZsGDBdtX7m9/8JnffffcWtfy56dOn54QTTki7du3+Yv+GDRvy7W9/O3vuuWcOPPDAJH/aFdihQ4dSYJckw4cPT4sWLUq30Xz11Vez++67N5urTZs2+e1vf5tnnnmmWftBBx2U6urqfPjDH87ChQvf8jNvC6EdAAAAAADAVlq+fHnOP//8zJo1a4tbSG6Nr3/96ykvL8/ZZ5/9tsb/5je/yTXXXJMzzjhjm9bbZ5990rp16xx88MH5p3/6p0yaNKnUN3DgwMyYMSN33313rr/++jz11FM5/PDD88c//jFJ8l//9V9J/vQsudNOOy1333136urqMmzYsCxfvnyr6/3Qhz6U3XffPfvvv38OP/zwXHLJJX9xjkWLFuXxxx9vVusb7rjjjlRUVGT33XfPlVdemZ/97GeprKxMkqxatarZLSyTP+0k7NixY+l5dCNGjMh//Md/ZN68edm0aVOWLVuWadOmJUmee+65JEl1dXW++c1v5tZbb82tt96aD3zgAxk6dGiWLFny5hd6G7g9JgAAAAAAwFbYuHFjTjrppPzLv/xLevbsuc3z1NfX5xvf+EaWLFnS7DaMb+Z3v/tdRo4cmTFjxuS0007bpjXvv//+NDU15aGHHsr555+fHj165MQTT0ySZrd37NevXwYOHJiuXbvmhz/8YSZOnJhNmzYlSc4444yceuqpSf5028158+blu9/9bv71X/91q+r9wQ9+kD/+8Y9ZunRpJk+enMsvvzxf+MIXthg3ffr09O3bN4ceeugWfUceeWQeffTRNDY25oYbbsjxxx9f2g34dpx22mlZsWJFPvrRj+a1115L+/bt89nPfjZTpkwpPaevV69ezW4B+qEPfSgrVqzIlVdemZtvvvltrfN22GkHAAAAAACwFf74xz9m8eLFOeuss1JeXp7y8vJccsklWbp0acrLy3Pvvfe+rXnuv//+rF69OjU1NaV5nnnmmZx77rnp1q1bs7G///3vc+SRR+ZDH/pQvv3tb29z7fvuu2/69u2b0047LZ/73OcyZcqUNx3boUOH9OzZM7/5zW+S/GnHWZJ88IMfbDautra22W003269H/jAB/LBD34wJ554Yr72ta9lypQp2bhxY7Mx69atyy233JKJEyf+xTnatWuXHj165O/+7u8yffr0lJeXZ/r06UmSqqqqrF69utn4119/PS+++GLpWXllZWX5+te/nqampjzzzDNZtWpVKRz88+fu/W+HHnpo6bq8U+y0AwAAAAAA2Art27fPY4891qztuuuuy7333ps5c+Zk3333fVvzjBs3LsOHD2/WNmLEiIwbN660ky350461I488MgMGDMiNN95Y2gG2vTZt2pRXX331TfubmpqyYsWKjBs3LknSrVu3dOnSJU8++WSzccuWLWu2S29b6t20aVNee+210m6+N/zoRz/Kq6++mrFjx271Zxo0aFDWrl2b+vr6DBgwIEly7733ZtOmTRk4cGCz81q2bJn3v//9SZLvf//7GTRoUDp37vym6zz66KOlEPOdIrQDAAAAAAB2eU1NTc12Tj311FN59NFH07Fjx9TU1OSCCy7I7373u9x0001p0aJF+vTp0+z8vfbaK7vvvnuz9r82Z6dOndKpU6dm87Rq1SpVVVWl2zH+7ne/y9ChQ9O1a9dcfvnleeGFF0pj39gtliRPPPFEKUxramrKo48+miQ56KCDkiT//u//npqamvTu3TtJ8n//7//N5Zdf3uxZeuedd15GjRqVrl275ve//30uvvjitGzZsnT7zLKyskyePDkXX3xxDjzwwBx00EGZOXNmfv3rX2fOnDlvu97Zs2enVatW6du3b1q3bp3FixfnggsuyCc/+cm0atWq2fWYPn16Ro8evcV1WrduXb7yla/kH/7hH1JdXZ3Gxsb8+7//e373u99lzJgxSf60A3DkyJE57bTT8s1vfjOvvfZazjrrrJxwwgnp0qVLkqSxsTFz5szJ0KFD88orr+TGG2/Mj370o9x3332lta666qrsu+++OeCAA/LKK6/kO9/5Tu69997MnTv3bX/Xb4fQDgAAAAAA2OUtXrw4Rx55ZOn485//fJLklFNOyYwZM/Lcc89tcQvI7Z3z7fjZz36W3/zmN/nNb36TffbZp1nf5s2bS++PPvroPPPMM0n+9Ky8/v37NxuzadOmXHDBBXnqqadSXl6e7t275+tf/3rOOOOM0hy//e1vc+KJJ2bNmjXp3LlzDjvssDz00EPNdpydc845eeWVV/K5z30uL774Yg488MD87Gc/S/fu3d92veXl5fn617+eZcuWZfPmzenatWvOOuusfO5zn2s2/umnn86CBQuahWNvaNmyZX79619n5syZaWxsTKdOnXLIIYfk/vvvzwEHHFAaN3v27Jx11lkZNmxYWrRokeOOOy5XX311s7lmzpyZ8847L5s3b86gQYMyf/78Zs/P27BhQ84999z87ne/S9u2bdOvX7/8/Oc/b/bdvhPfddnmP/9GeccMGTIk3bp1y0033VR0KcT3AQA7A3+fAwAA7Jr8Hnz7lixZkgEDBqS+vj51dXVFl7PNdpbPsbXemZueAgAAAAAAANtMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwcqLLgAAAAAAAIB3TkNDQ9ElbJf3ev3bSmgHAAAAAACwE6isrEzbtm0zduzYokvZbm3btk1lZWXRZfxNCe0AAAAAAAB2AjU1NWloaEhjY2PRpWy3ysrK1NTUFF3G35TQDgAAAAAAYCdRU1Ozy4VdO4sWRRcAAAAAAAAAuzqhHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABSsvOgCAAAAAACA966VK1emsbFxh83f1NSUNWvWZMmSJTtsjSSprKxMTU3NDl0D3orQDgAAAAAA2CYrV65MbW1t1q9fv0PXeeSRR3LnnXfu0DXatm2bhoYGwR2FEdoBAAAAAADbpLGxMevXr8+sWbNSW1tbdDnbrKGhIWPHjk1jY6PQjsII7QAAAAAAgO1SW1uburq6osuA97QWRRcAAAAAAAAAuzqhHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAADAVpkxY0Y6dOhQdBlJknHjxuWrX/3qDpt/w4YN6datWxYvXrzD1oBEaAcAAAAAAPwFEyZMSFlZWcrKyrLbbrulR48eueSSS/L6668XXVrJ0qVLc+edd+bss8/e5jn+4z/+I5/+9KeTJAMGDMijjz7arH+33XbLeeedly9+8YvbUyr8VUI7AAAAAADgLxo5cmSee+65LF++POeee26mTJmSqVOnFl1WyTXXXJMxY8akoqJim+dYt25dDjrooLccc/LJJ2fBggX5z//8z21eB/4aoR0AAAAAAPAXtW7dOlVVVenatWs+9alPZfjw4bn99ttL/Q888ECS5LDDDisFfG/45S9/mQ9/+MOprKzMnnvumSOOOCJLliwp9W/evDlTpkxJTU1NWrdunS5dujTbMffqq6/mvPPOy/vf//60a9cuAwcOzPz580v9GzduzJw5czJq1Ki3/Ax/bZ1x48bl9NNPf8s53ve+92Xw4MG55ZZb3vqCwXYQ2gEAAAAAAG9LmzZtsmHDhiTJ+vXrM2vWrCTJDTfckJUrV+a8884rjf3jH/+YU045JQsWLMhDDz2U/fffP0cffXT++Mc/JkluvfXWXHnllfnWt76V5cuX57bbbkvfvn1L55911ll58MEHc8stt+RXv/pVxowZk5EjR2b58uVJkl/96lf5wx/+kIMPPvgta/5r67xdhx56aO6///6tPg/ervKiCwAAAAAAAN7dNm/enHnz5uWee+7JZz7zmSTJa6+9lgsuuCCjR49ObW1tzjrrrFxyySWlc4466qhmc3z7299Ohw4dct999+WjH/1oVq5cmaqqqgwfPjytWrVKTU1NDj300CTJypUrc+ONN2blypXp0qVLkuS8887L3XffnRtvvDFf/epX88wzz6Rly5bZa6+93rL2t1pna3Tp0iXPPPPMVp8Hb5eddgAAAAAAwF90xx13pKKiIrvvvns+8pGP5JOf/GSmTJmSJGnbtm0+8IEPlMZWV1dn9erVpePnn38+p512Wvbff//sueeead++fZqamrJy5cokyZgxY/Lyyy9nv/32y2mnnZYf//jHef3115Mkjz32WDZu3JiePXumoqKi9LrvvvuyYsWKJMnLL7+c1q1bp6ysrLTmV7/61WbjV65c+ZbrbI02bdpk/fr1W30evF122gEAAAAAAH/RkUcemeuvvz677bZbunTpkvLy/4kVWrVq1WxsWVlZNm/eXDo+5ZRTsmbNmnzjG99I165d07p16wwaNKh0e80PfOADefLJJ/Pzn/88P/vZz/LpT386U6dOzX333Zempqa0bNky9fX1admyZbN1KioqkiSVlZVZv359NmzYkN122y1JcuaZZ+b4448vjX2j5jdb539/hrfy4osvpnPnzm97PGwtoR0AAAAAAPAXtWvXLj169NimcxcuXJjrrrsuRx99dJLk2WefTWNjY7Mxbdq0yahRozJq1Kj80z/9U3r37p3HHnss/fv3z8aNG7N69eocfvjhf3H+gw46KEnyxBNPlN537NgxHTt23GLsm61TV1f3tj/P448/nv79+7/t8bC1hHYAAAAAAMA7bv/998/NN9+cgw8+OP/93/+dyZMnp02bNqX+GTNmZOPGjRk4cGDatm2bWbNmpU2bNunatWs6deqUk08+OePHj8+0adPSv3//vPDCC5k3b1769euXY445Jp07d05dXV0WLFhQCu3+krdaJ/nTDronn3yyNP6N91VVVamqqiq133///bn00kvf4asE/8Mz7QAAAAAAgHfc9OnT89JLL6Wuri7jxo3L2Wefnb322qvU36FDh9xwww0ZPHhw+vXrl5///Of5P//n/6RTp05JkhtvvDHjx4/Pueeem169emX06NH55S9/mZqamtIckyZNyuzZs9+yjr+2zu23356TTjqpNP6EE05I//79881vfrPU9uCDD+YPf/hDPvGJT7wj1wb+krLNf36DWd4xQ4YMSbdu3XLTTTcVXQrxfQDAzsDf5wAAAO8+S5YsyYABA1JfX79Vt5p8p7z88svp1atXfvCDH2TQoEHbPM9f+xyf/OQnc+CBB+af//mft6dceEt22gEAAAAAAO9J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6tQpH/3oR7NixYpS/9NPP52ysrL84Ac/yBFHHJHdd989s2fPzsaNG/P5z3++dN4XvvCFbN68eYu6W7dunaqqqlRVVeWggw7K+eefn2effTYvvPBCkuT222/P8ccfn4kTJ6ZHjx454IADcuKJJ+YrX/nKdl97AIBdjdAOAAAA4E288sorGTBgQH7605/m8ccfz+mnn55x48Zl0aJFpTGTJ0/Offfdl5/85CeZO3du5s+fnyVLljSb57XXXsull16apUuX5rbbbsvTTz+dCRMmbLHelClTcu211+aBBx7Is88+m+OPPz5XXXVVvve97+WnP/1p5s6dm2uuuaY0ft26dfn85z+fxYsXZ968eWnRokU+/vGPZ9OmTc3mPf/88/PZz342DQ0NGTFiRKZNm5YZM2bku9/9bhYsWJAXX3wxP/7xj9/yWjQ1NWXWrFnp0aNHOnXqlCSpqqrKQw89lGeeeWZrLy0AAP9LedEFAAAAABTljjvuSEVFRbO2jRs3lt6///3vz3nnnVc6/sxnPpN77rknP/zhD3PooYemqakp06dPz6xZszJs2LAkycyZM7PPPvs0m/Mf//EfS+/322+/XH311TnkkEPS1NTUbP3LLrssgwcPTpJMnDgxF1xwQVasWJH99tsvSfKJT3wiv/jFL/LFL34xSXLcccc1W+e73/1uOnfunCeeeCJ9+vQptZ9zzjk59thjS8dXXXVVLrjgglLbN7/5zdxzzz1veX3WrVuX6urq3HHHHWnR4k//H/jFF1+cY489Nt26dUvPnj0zaNCgHH300fnEJz5RGgMAwNvj354AAACAXdaRRx6ZRx99tNnrO9/5Tql/48aNufTSS9O3b9907NgxFRUVueeee7Jy5cokyYoVK7Jhw4YMHDiwdE7Hjh3Tq1evZuvU19dn1KhRqampyR577JEjjjgiSUrzvKFfv36l93vvvXfatm1bCuzeaPvz22ouX748J554Yvbbb7+0b98+3bp1+4vzHnzwwaX3f/jDH/Lcc881q7m8vLzZmL90fRYtWpQRI0bkIx/5SGlnXXV1dR588ME89thj+exnP5vXX389p5xySkaOHLnFbj8AAN6anXYAAADALqtdu3bp0aNHs7bf/va3pfdTp07NN77xjVx11VXp27dv2rVrl3POOScbNmx422usW7cuI0aMyIgRIzJ79ux07tw5K1euzIgRI7aYp1WrVqX3ZWVlzY7faPvzMGzUqFHp2rVrbrjhhnTp0iWbNm1Knz59tpi3Xbt2b7ve/33en1+f73znO9lzzz1zww035LLLLiu19+nTJ3369MmnP/3pnHnmmTn88MNz33335cgjj9ymdQEAdkV22gEAAAC8iYULF+ZjH/tYxo4dmwMPPDD77bdfli1bVurv3r17WrVqlYcffrjU9tJLLzUb8+tf/zpr1qzJ1772tRx++OHp3bt3s91y22rNmjV58skn8+UvfznDhg1LbW1tXnrppb963p577pnq6upmNb/++uupr6//q+eWlZWlRYsWefnll990zAc/+MEkfworAQB4++y0AwAAAHgT+++/f+bMmZMHHngg73vf+3LFFVfk+eefLwVTFRUVmThxYiZPnpxOnTplr732ype+9KVmz3OrqanJbrvtlmuuuSZnnnlmHn/88Vx66aXbXdv73ve+dOrUKd/+9rdTXV2dlStX5vzzz39b5372s5/N1772tey///7p3bt3rrjiiqxdu3aLca+++mpWrVqV5E9h5LXXXpumpqaMGjUqSfKpT30qXbp0yVFHHZV99tknzz33XC677LJ07tw5gwYN2u7PCACwK7HTDgAAAOBNfPnLX05dXV1GjBiRoUOHpqqqKqNHj242ZurUqTn88MMzatSoDB8+PIcddlgGDBhQ6u/cuXNmzJiRH/3oR/ngBz+Yr33ta7n88su3u7YWLVrklltuSX19ffr06ZPPfe5zmTp16ts699xzz824ceNyyimnZNCgQdljjz3y8Y9/fItxd999d6qrq1NdXZ2BAwfml7/8ZX70ox9l6NChSZLhw4fnoYceypgxY9KzZ88cd9xx2X333TNv3rx06tRpuz8jAMCupGzz5s2biy5iZzRkyJB069YtN910U9GlEN8HAOxoS5YsyYABA1JfX5+6urqiywEAAICt4nct7wZ22gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFKy86AIAANh5NDQ0FF0CAAAAbDW/Z3k3ENoBALDdKisr07Zt24wdO7boUgAAAGCbtG3bNpWVlUWXwS5MaAcAwHarqalJQ0NDGhsbd9gakyZNSnV1dS699NIdtgYAAADvPn+r34OVlZWpqanZoWvAWxHaAQDwjqipqdmhP24qKirSqVOn1NXV7bA1AAAAePfxe5BdRYuiCwAAAAAAAIBdndAOAAAAAAAACia0AwAAAAAAgIIJ7QAAYAfo1q1brrrqqqLLAAAA4G/M70G2ldAOAAAAAAAACia0AwAAAAAAgIIJ7QAA2GmsW7cu48ePT0VFRaqrqzNt2rQMHTo055xzTpI/3aLksssuK43p2rVrbr/99rzwwgv52Mc+loqKivTr1y+LFy9uNu+tt96aAw44IK1bt063bt0ybdq0Zv2rV6/OqFGj0qZNm+y7776ZPXv2FrWtXbs2kyZNSufOndO+ffscddRRWbp06Q67FgAAALsSvwfZGQjtAADYaUyePDn33XdffvKTn2Tu3LmZP39+lixZ0mzMlVdemcGDB+eRRx7JMccck3HjxmX8+PEZO3ZslixZku7du2f8+PHZvHlzkqS+vj7HH398TjjhhDz22GOZMmVKLrzwwsyYMaM054QJE/Lss8/mF7/4RebMmZPrrrsuq1evbrbumDFjsnr16tx1112pr69PXV1dhg0blhdffHGHXxcAAICdnd+D7AzKiy4AAADeCU1NTZk+fXpmzZqVYcOGJUlmzpyZffbZp9m4o48+OmeccUaS5KKLLsr111+fQw45JGPGjEmSfPGLX8ygQYPy/PPPp6qqKldccUWGDRuWCy+8MEnSs2fPPPHEE5k6dWomTJiQZcuW5a677sqiRYtyyCGHJEmmT5+e2tra0poLFizIokWLsnr16rRu3TpJcvnll+e2227LnDlzcvrpp+/YiwMAALAT83uQnYWddgAA7BRWrFiRDRs2ZODAgaW2jh07plevXs3G9evXr/R+7733TpL07dt3i7Y3/s/IhoaGDB48uNkcgwcPzvLly7Nx48Y0NDSkvLw8AwYMKPX37t07HTp0KB0vXbo0TU1N6dSpUyoqKkqvp556KitWrNjOTw4AALBr83uQnYWddgAA7FJatWpVel9WVvambZs2bXrH1mxqakp1dXXmz5+/Rd+f/5gDAABgx/F7kHc7O+0AANgpdO/ePa1atcrDDz9canvppZeybNmy7Zq3trY2CxcubNa2cOHC9OzZMy1btkzv3r3z+uuvp76+vtT/5JNPZu3ataXjurq6rFq1KuXl5enRo0ezV2Vl5XbVBwAAsKvze5CdhdAOAICdQkVFRSZOnJjJkyfn3nvvzeOPP54JEyakRYvt+1fec889N/Pmzcull16aZcuWZebMmbn22mtz3nnnJUl69eqVkSNH5owzzsjDDz+c+vr6TJo0KW3atCnNMXz48AwaNCijR4/O3Llz8/TTT+eBBx7Il770pSxevHi76gMAANjV+T3IzkJoBwDATmPq1Kk5/PDDM2rUqAwfPjyHHXZYs2cLbIu6urr88Ic/zC233JI+ffrkoosuyiWXXJIJEyaUxtx4443p0qVLjjjiiBx77LE5/fTTs9dee5X6y8rKcuedd2bIkCE59dRT07Nnz5xwwgl55plnSs9MAAAAYNv5PcjOoGzz5s2biy5iZzRkyJB069YtN910U9GlEN8HAOwMtvXv86FDh+aggw7KVVddtWMKAwAAYIfye5BdhZ12AAAAAAAAUDChHQAAAAAAABSsvOgCAABgR5o/f37RJQAAAFAAvwd5r7HTDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKFh50QUUZeXKlWlsbNxh8zc1NWXNmjVZsmTJDluDt+9v9X1UVlampqZmh64BAAAAAADsfHbJ0G7lypWpra3N+vXrd+g6jzzySO68884dugZv39/i+2jbtm0aGhoEdwAAAAAAwFbZJUO7xsbGrF+/PrNmzUptbW3R5bCTaGhoyNixY9PY2Ci0AwAAAAAAtsouGdq9oba2NnV1dUWXAQAAAAAAwC6uRdEFAAAAAAAAwK5OaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2O5mhQ4fmnHPOKbqMrTJhwoSMHj266DIAAAAAAAAKI7QrwJuFVPPnz09ZWVnWrl37N6/p3WTChAkpKysrvTp16pSRI0fmV7/6VbNxN9xwQw488MBUVFSkQ4cO6d+/f/71X/+1oKoBAAAAAAC2ndCOv5nXXnvtbY8dOXJknnvuuTz33HOZN29eysvL89GPfrTU/93vfjfnnHNOzj777Dz66KNZuHBhvvCFL6SpqWlHlA4AAAAAALBDCe3epdasWZMTTzwx73//+9O2bdv07ds33//+95uNWbduXcaPH5+KiopUV1dn2rRpW8xz88035+CDD84ee+yRqqqqnHTSSVm9enWp/43dfffcc0/69++fNm3a5Kijjsrq1atz1113pba2Nu3bt89JJ52U9evXl867++67c9hhh6VDhw7p1KlTPvrRj2bFihWl/qeffjplZWX5wQ9+kCOOOCK77757Zs+enY0bN+bzn/986bwvfOEL2bx58xZ1t27dOlVVVamqqspBBx2U888/P88++2xeeOGFJMntt9+e448/PhMnTkyPHj1ywAEH5MQTT8xXvvKV7b72AAAAAAAAf2tCu3epV155JQMGDMhPf/rTPP744zn99NMzbty4LFq0qDRm8uTJue+++/KTn/wkc+fOzfz587NkyZJm87z22mu59NJLs3Tp0tx22215+umnM2HChC3WmzJlSq699to88MADefbZZ3P88cfnqquuyve+97389Kc/zdy5c3PNNdeUxq9bty6f//zns3jx4sybNy8tWrTIxz/+8WzatKnZvOeff34++9nPpqGhISNGjMi0adMyY8aMfPe7382CBQvy4osv5sc//vFbXoumpqbMmjUrPXr0SKdOnZIkVVVVeeihh/LMM89s7aUFAAAAAAB41ykvuoBd1R133JGKiopmbRs3biy9f//735/zzjuvdPyZz3wm99xzT374wx/m0EMPTVNTU6ZPn55Zs2Zl2LBhSZKZM2dmn332aTbnP/7jP5be77fffrn66qtzyCGHpKmpqdn6l112WQYPHpwkmThxYi644IKsWLEi++23X5LkE5/4RH7xi1/ki1/8YpLkuOOOa7bOd7/73XTu3DlPPPFE+vTpU2o/55xzcuyxx5aOr7rqqlxwwQWltm9+85u555573vL6rFu3LtXV1bnjjjvSosWfcuaLL744xx57bLp165aePXtm0KBBOfroo/OJT3yiNAYAAAAAAOC9QrpRkCOPPDKPPvpos9d3vvOdUv/GjRtz6aWXpm/fvunYsWMqKipyzz33ZOXKlUmSFStWZMOGDRk4cGDpnI4dO6ZXr17N1qmvr8+oUaNSU1OTPfbYI0cccUSSlOZ5Q79+/Urv995777Rt27YU2L3R9ue31Vy+fHlOPPHE7Lfffmnfvn26dev2F+c9+OCDS+//8Ic/5LnnnmtWc3l5ebMxf+n6LFq0KCNGjMhHPvKR0s666urqPPjgg3nsscfy2c9+Nq+//npOOeWUjBw5covdfgAAAAAAAO92dtoVpF27dunRo0eztt/+9rel91OnTs03vvGNXHXVVenbt2/atWuXc845Jxs2bHjba6xbty4jRozIiBEjMnv27HTu3DkrV67MiBEjtpinVatWpfdlZWXNjt9o+/MwbNSoUenatWtuuOGGdOnSJZs2bUqfPn22mLddu3Zvu97/fd6fX5/vfOc72XPPPXPDDTfksssuK7X36dMnffr0yac//emceeaZOfzww3PfffflyCOP3KZ1AQAAAAAAimCn3bvUwoUL87GPfSxjx47NgQcemP322y/Lli0r9Xfv3j2tWrXKww8/XGp76aWXmo359a9/nTVr1uRrX/taDj/88PTu3bvZbrlttWbNmjz55JP58pe/nGHDhqW2tjYvvfTSXz1vzz33THV1dbOaX3/99dTX1//Vc8vKytKiRYu8/PLLbzrmgx/8YJI/hZUAAAAAAADvJXbavUvtv//+mTNnTh544IG8733vyxVXXJHnn3++FExVVFRk4sSJmTx5cjp16pS99torX/rSl5o9z62mpia77bZbrrnmmpx55pl5/PHHc+mll253be973/vSqVOnfPvb3051dXVWrlyZ888//22d+9nPfjZf+9rXsv/++6d379654oorsnbt2i3Gvfrqq1m1alWSP4WR1157bZqamjJq1Kgkyac+9al0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wZ8HAAAAAACAD88nJtqNHj06jz32WK655prMmzcv06ZNy1577ZVly5YVPVqZGTNmZMGCBRk9enTZ+sUXX5xx48alXbu//UhWrFiR/fffPz/4wQ/Wef9ddtkl2223XaZOnVq2/o1vfCMXX3zxxg0PAAAAAADAh+ITEe1effXVTJ8+Peecc06GDx+e3r17Z/fdd8+pp56aL3/5y6Vjxo8fnx49eqShoSFJMm/evPfc9+qrr05dXV06deqUHXfcMZdffnnZ688//3wOO+ywbLHFFunSpUsGDx6chx9+OFOmTMmZZ56Zxx9/PBUVFamoqMiUKVOSJDfeeGNGjhyZTp06lfZZunRp7rvvvhx00EFl+x9//PE55ZRTsscee6zX93HQQQflxhtvXGtt1qxZWbBgwXrtBQAAAAAAwIevsugBPghdu3ZN165dc9ttt2WPPfZIx44d1zrmkEMOSefOnXPHHXfk+eefz1e/+tV861vfyr777psttthireOvu+66nHHGGbn00kszcODAPPbYY2lsbEyXLl1y1FFHpbW1NcOGDcunP/3pTJs2LTU1NZkzZ07a2tpy6KGH5sknn8ydd96Ze+65J0nSrVu3JMn06dNz+OGHl51rxowZqaqqSl1d3Qfyfey+++4566yzsmrVqtJ3UVtbm549e2b69OnZbrvtPpDzAAAAAAAA8MH4RES7ysrKTJkyJY2NjbniiitSX1+fYcOGZcyYMenfv39mzJiRRx55JC+99FI6duxYugXlpz71qdx888055phj1tpzwoQJOf/883PwwQcnSfr27Zunn346V155ZY466qhcf/31Wbp0aR599NFS9OvXr1/p/V27dk1lZWVqamrK9l24cGF69eq11lrPnj3Lbo25MXr16pU33ngjzc3N6d27d9n6woULP5BzAAAAAAAA8MH5RES75O1n2h144IGZPn16Hnroodxxxx0599xzc/XVV2f58uVpbW3NlltumSRpa2tLkrzwwgvveLvI5cuXZ8GCBTn66KPT2NhYWn/rrbdKV8zNnTs3AwcOfMer9N7L66+/XnZrzHdb2xidO3dO8vYz8f5+/e/XAAAAAAAAKN4nJtolSadOnTJy5MiMHDkyp59+esaPH58JEybkO9/5Trbeeuvcf//9SZKnnnoqo0aNyq233prPfe5za+3T2tqaJPnFL36RIUOGlL3Wvn37JH8LY+ururo6r7zyyvuubYyXX345SdKjR4+11v9+DQAAAAAAgOJ9MPdj/Ae10047Zfny5amvr09zc3MqKyvTr1+/bLPNNkmSbbbZJtXV1Wu9r2fPnunVq1eeffbZ9OvXr+xX3759kyT9+/fP3LlzS4Hs72222WZZvXr1WusDBw7M008/vdZac3PzBxbunnzyyXzmM58p+2wrV67MggULMnDgwA/kHAAAAAAAAHxwPhHRbtmyZdl7770zderU/P73v89zzz2Xm266Keeee26+8pWvZMSIERk6dGhGjRqVu+66Ky+88EKS5LLLLsusWbPecc8zzzwzZ599di6++OLMmzcvTzzxRCZPnpwLLrggSXLYYYelpqYmo0aNysyZM/Pss8/mlltuyYMPPpgk6dOnT5577rnMnTs3LS0tWbVqVZJkv/32y4wZM8rONXDgwFRXV2fmzJll683NzZk7d27mz5+fJHniiSfeMxT+1fTp07PvvvuWrT300EPp2LFjhg4dui5fKQAAAAAAAB+hT0S069q1a4YMGZILL7wwDQ0N2WWXXXL66aensbExl156aSoqKnL77benoaEh48aNy1e/+tUkyZIlS9KzZ8933HP8+PG5+uqrM3ny5Oy6664ZNmxYpkyZUrrSbrPNNstdd92VrbbaKgcccEB23XXX/PSnPy3dPnP06NHZf//9M3z48PTo0SM33HBDkuSII47IU089lWeeeaZ0rvbt22fcuHG57rrryma44oorMnDgwNJz9RoaGjJw4MBMmzat7LgJEyaUfr9y5crcdtttZc/iS5IbbrghRxxxRKqqqtb7+wUAAAAAAODDVbFmzZo1RQ/xUZszZ04GDRqU2bNnp76+/iM//0knnZS//OUvufLKK0trzc3N2XnnnTNnzpz07t17nfb56+eYMGFCJk6cmCT5+c9/nl//+te56667Sse1tLRkhx12yKxZs0rRcVPT0NCQPn365Nprry16FABgA/nvcwAAgE2Tfw+yqfhEXGn3cfPDH/4wvXv3TltbW2mtpqYmkyZNyqJFi9Z5nwULFiRJvvSlL5XWOnTokEsuuaTsuD/96U+5/PLLN9lgBwAAAAAA8I+usugBNkXdu3fPD37wg7XWR40atV77bLfddkmSdu3+1l7Hjx+/1nGDBw/O4MGD129IAAAAAAAAPjKutAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAglUWPUCRmpqaih5ho3zc5wcAAAAAAOBtm2S0q66uTlVVVcaOHVv0KButqqoq1dXVRY8BAAAAAADARtgko11tbW2amprS0tJS9Cgbrbq6OrW1tUWPAQAAAAAAwEbYJKNd8na4E7sAAAAAAAD4R9Cu6AEAAAAAAABgUyfaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABSssugBIEkWLVqUlpaWD23/1tbWLFu2LHPmzPnQzpEk1dXVqa2t/VDPAQAAAAAAfPKIdhRu0aJFqaury4oVKz7U8zz22GO5/fbbP9RzVFVVpampSbgDAAAAAADWi2hH4VpaWrJixYpMnTo1dXV1RY+zwZqamjJ27Ni0tLSIdgAAAAAAwHoR7fiHUVdXl/r6+qLHAAAAAAAA+Mi1K3oAAAAAAAAA2NSJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHf+QJk6cmAEDBnwk57r33ntTV1eX1atXl603NDTk+uuv36i999hjj9xyyy1la1dccUUOOuigjdoXAAAAAAD4ZBHt+FAsXbo03/72t1NbW5uOHTumpqYm++23X2bOnFnIPO8VAU8++eScdtppad++fWlt2rRpefHFFzNmzJjS2sqVK/Pd7343W265Zbp27ZrRo0fnxRdffM/znnbaaTnllFPS1tZWWvvmN7+ZOXPmZPr06Rv3oQAAAAAAgE8M0Y4PxejRo/PYY4/lmmuuybx58zJt2rTstddeWbZsWdGjlZkxY0YWLFiQ0aNHl61ffPHFGTduXNq1+9t/RE444YT813/9V2666ab89re/zQsvvJCDDz74Pff/4he/mNdeey133HFHaW2zzTbL4YcfnosvvviD/TAAAAAAAMDHlmjHB+7VV1/N9OnTc84552T48OHp3bt3dt9995x66qn58pe/XDpm/Pjx6dGjRxoaGpIk8+bNe899r7766tTV1aVTp07Zcccdc/nll5e9/vzzz+ewww7LFltskS5dumTw4MF5+OGHM2XKlJx55pl5/PHHU1FRkYqKikyZMiVJcuONN2bkyJHp1KlTaZ+lS5fmvvvuK7uF5Z///OdMmjQpF1xwQfbee+8MGjQokydPzgMPPJCHHnroXWdu3759DjjggNx4441l6wcddFCmTZuW119//f2/UAAAAAAA4BNPtOMD17Vr13Tt2jW33XZbVq1a9Y7HHHLIIXnppZdyxx13ZOrUqUmSb33rW3n55Zff8fjrrrsuZ5xxRs4666w0NTXlJz/5SU4//fRcc801SZLW1tYMGzYsixcvzrRp0/L444/n5JNPTltbWw499NB873vfy84775wlS5ZkyZIlOfTQQ5Mk06dPz+DBg8vONWPGjFRVVaWurq60Nnv27Lz55psZMWJEaW3HHXdMbW1tHnzwwff8Pnbfffe1boU5ePDgvPXWW3n44Yff870AAAAAAMCmobLoAfjkqayszJQpU9LY2Jgrrrgi9fX1GTZsWMaMGZP+/ftnxowZeeSRR/LSSy+lY8eOpVtQfupTn8rNN9+cY445Zq09J0yYkPPPP790O8q+ffvm6aefzpVXXpmjjjoq119/fZYuXZpHH300W2yxRZKkX79+pfd37do1lZWVqampKdt34cKF6dWr11prPXv2LLs1ZnNzczbbbLN079697NiePXumubn5Pb+PXr165X//93/T1tZW2rOqqirdunXLwoUL3/O9AAAAAADApkG040MxevToHHjggZk+fXoeeuih3HHHHTn33HNz9dVXZ/ny5Wltbc2WW26ZJGlra0uSvPDCC1mwYMFaey1fvjwLFizI0UcfncbGxtL6W2+9lW7duiVJ5s6dm4EDB5aC3bp6/fXXy26N+W5rG6Nz585pa2vLqlWr0rlz57L1FStWfGDnAQAAAAAAPr5EOz40nTp1ysiRIzNy5MicfvrpGT9+fCZMmJDvfOc72XrrrXP//fcnSZ566qmMGjUqt956az73uc+ttU9ra2uS5Be/+EWGDBlS9lr79u2TpCyGrY/q6uq88sor77tWU1OTN954I6+++mrZ1XYvvvjiWlfv/b2XX345Xbp0WWvGl19+OT169NiguQEAAAAAgE8Wz7TjI7PTTjtl+fLlqa+vT3NzcyorK9OvX79ss802SZJtttkm1dXVa72vZ8+e6dWrV5599tn069ev7Fffvn2TJP3798/cuXPf9Zl4m222WVavXr3W+sCBA/P000+vtdbc3FwW7gYNGpQOHTrk3nvvLa0988wzWbRoUYYOHfqen/vJJ5/MwIEDy9YWLFiQlStXrrUOAAAAAABsmkQ7PnDLli3L3nvvnalTp+b3v/99nnvuudx0000599xz85WvfCUjRozI0KFDM2rUqNx111154YUXkiSXXXZZZs2a9Y57nnnmmTn77LNz8cUXZ968eXniiScyefLkXHDBBUmSww47LDU1NRk1alRmzpyZZ599NrfccksefPDBJEmfPn3y3HPPZe7cuWlpacmqVauSJPvtt19mzJhRdq6BAwemuro6M2fOLK1169YtRx99dE488cT8z//8T2bPnp1x48Zl6NCh2WOPPd7z+5g+fXr23Xfftda23XbbbLfdduvxzQIAAAAAAJ9Uoh0fuK5du2bIkCG58MIL09DQkF122SWnn356Ghsbc+mll6aioiK33357GhoaMm7cuHz1q19NkixZsiQ9e/Z8xz3Hjx+fq6++OpMnT86uu+6aYcOGZcqUKaUr7TbbbLPcdddd2WqrrXLAAQdk1113zU9/+tPS7TNHjx6d/fffP8OHD0+PHj1yww03JEmOOOKIPPXUU3nmmWdK52rfvn3GjRuX6667rmyGCy+8MF/60pcyevToNDQ0pKamJrfeeutas1555ZWl3y9evDgPPPBAxo0bV3bMDTfcUPZ8PgAAAAAAYNNWsWbNmjVFD8Gmbc6cORk0aFBmz56d+vr6j/z8J510Uv7yl7+Uxbbm5ubsvPPOmTNnTnr37r1O+8ycOTOf//znc+WVV+aYY45Jkvzbv/1bXnnllVx11VWl45566qnsvffemTdvXrp16/bBfhgA+ARraGhInz59cu211xY9CgAAAB8h/x5kU+FKOzZ5P/zhD9O7d++0tbWV1mpqajJp0qQsWrRonff56609Bw8eXFrbaqut8uMf/7jsuCVLluTaa68V7AAAAAAAgJLKogeAonXv3j0/+MEP1lofNWrUeu3zhS98Ya21733ve2utjRgxYr32BQAAAAAAPvlcaQcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABassegD4q6ampqJH2Cgf9/kBAAAAAIDiiHYUrrq6OlVVVRk7dmzRo2y0qqqqVFdXFz0GAAAAAADwMSPaUbja2to0NTWlpaWl6FE2WnV1dWpra4seAwAAAAAA+JgR7fiHUFtbK3YBAAAAAACbrHZFDwAAAAAAAACbOtEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCVRQ8AALChFi1alJaWlqLH2GjV1dWpra0tegwAAAAACiTaAQAfS4sWLUpdXV1WrFhR9CgbraqqKk1NTcIdAAAAwCZMtAMAPpZaWlqyYsWKTJ06NXV1dUWPs8GampoyduzYtLS0iHYAAAAAmzDRDgD4WKurq0t9fX3RYwAAAADARmlX9AAAAAAAAACwqRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwCboN/97nc56KCD0qtXr1RUVOS2225b5/fOnDkzlZWVGTBgwEbt+a1vfSsVFRW56KKLSmt/yf5jygAAO5lJREFU+tOfcvTRR6dv377p3Llztttuu0yYMCFvvPFG6ZiVK1fmG9/4Rr72ta8lSU488cS19p4xY0Y+97nPZcstt0znzp2z44475sILLyw7ZuLEiamoqCj7teOOO66114MPPpi99947Xbp0yeabb56Ghoa8/vrr6zzvM888k+HDh6dnz57p1KlTtt1225x22ml58803y84zaNCgteY58MADy+bdcccd06VLl/zTP/1TRowYkYcffrhsj5dffjlHHHFENt9883Tv3j1HH310Wltby4751a9+lQEDBqSqqiq9e/fOz372s7LX77///rXmqKioSHNzc+mYjfn7AwAAAMA7qyx6AADgo7d8+fLstttu+eY3v5mDDz54nd/36quv5utf/3r22WefvPjiixu8569//es89NBD6dWrV9n6H/7wh7S1teXKK69Mv3798uSTT6axsTHLly/PeeedlyRZvXp1OnfunDFjxuSss856x/27dOmS4447Lv3790+XLl0yY8aMHHvssenSpUuOOeaY0nE777xz7rnnntKfKyvL/6fRgw8+mP333z+nnnpqLrnkklRWVubxxx9Pu3bt1nneDh065Otf/3rq6+vTvXv3PP7442lsbExbW1t+8pOflM71m9/8Jv3790+SLFu2LLvttlsOOeSQ0uvbb799Lr300my77bZ5/fXXc+GFF2bffffN/Pnz06NHjyTJEUcckSVLluTuu+/Om2++mXHjxuWYY47J9ddfnyS54447csQRR+SSSy7Jvvvum6ampjQ2NqZz58457rjjyj77M888k80337z056222qr0+w39+wMAAADAu6tYs2bNmqKHAACKU1FRkV//+tcZNWrU+x47ZsyYfPazn0379u1z2223Ze7cueu95+LFizNkyJD85je/yYEHHpjjjz8+xx9//Lue82c/+1l+/vOf59lnny1bnzNnTgYNGpRhw4bl/vvvf9/ZDz744HTp0iX/8R//keTtK9fe6zMkyR577JGRI0fmxz/+8fvu/37z/l8nnnhiHn300UyfPr30OWbPnp36+vokyUUXXZQzzjgjS5YsSZcuXd5xj7/85S/p1q1b7rnnnuyzzz5pamrKTjvtlEcffTSDBw9Oktx555054IAD8vzzz6dXr145/PDD8+abb+amm24q7XPJJZfk3HPPzaJFi1JRUZH7778/w4cPzyuvvJLu3bu/7+ddn78/G6uhoSF9+vTJtdde+6GfCwAAgH8c/j3IpsLtMQGAdTJ58uQ8++yzmTBhwgbv0dbWliOPPDInnXRSdt5553V6z5///OdsscUWG3zOJHnsscfywAMPZNiwYWXrf/zjH9OrV69su+22OeKII7Jo0aLSay+99FIefvjhbLXVVtlzzz3Ts2fPDBs2LDNmzNioeefPn58777xzrVn+r0mTJmXMmDHvGuzeeOONXHXVVenWrVt22223JG9fFdi9e/dSsEuSESNGpF27dqXbaK5atSqdOnUq26tz5855/vnns3DhwrL1AQMGZOutt87IkSMzc+bM9/zMAAAAAGw80Q4AeF9//OMfc8opp2Tq1Klr3UJyfZxzzjmprKzMv/zLv6zT8fPnz88ll1ySY489doPO95nPfCYdO3bM4MGD893vfjfjx48vvTZkyJBMmTIld955Z37+85/nueeeyxe+8IW89tprSVK6Um7ixIlpbGzMnXfemfr6+uyzzz754x//uN7z7rnnnunUqVM++9nP5gtf+EJ+9KMfveMejzzySJ588smyWf/qv//7v9O1a9d06tQpF154Ye6+++5UV1cnSZqbm8tuYZm8fbvPLbbYovQ8uv322y+33npr7r333rS1tWXevHk5//zzkyRLlixJkmy99da54oorcsstt+SWW27JNttsk7322itz5sx59y8aAAAAgI3mmXYAwHtavXp1Dj/88Jx55pnZfvvtN3if2bNn59///d8zZ86cVFRUvO/xixcvzv77759DDjkkjY2NG3TO6dOnp7W1NQ899FBOOeWU9OvXL4cddliS5Itf/GLpuP79+2fIkCHp3bt3fvWrX+Xoo49OW1tbkuTYY4/NuHHjkiQDBw7Mvffem1/+8pc5++yz12ve//zP/8xrr72Wxx9/PCeddFLOO++8nHzyyWsdN2nSpOy6667Zfffd13pt+PDhmTt3blpaWvKLX/wiX/va10pXA66LxsbGLFiwIF/60pfy5ptvZvPNN8+//uu/ZuLEiaXn9O2www7ZYYcdSu/Zc889s2DBglx44YWlW4sCAAAA8MFzpR0A8J5ee+21zJo1K8cdd1wqKytTWVmZH/3oR3n88cdTWVmZ++67b532mT59el566aXU1taW9lm4cGG+973vpU+fPmXHvvDCCxk+fHj23HPPXHXVVRs8e9++fbPrrrumsbExJ5xwQiZOnPiux3bv3j3bb7995s+fn+TtK86SZKeddio7rq6uruw2mus67zbbbJOddtophx12WH76059m4sSJWb16ddkxy5cvz4033pijjz76Hffo0qVL+vXrlz322COTJk1KZWVlJk2alCSpqanJSy+9VHb8W2+9lZdffjk1NTVJ3n7+3DnnnJPW1tYsXLgwzc3NpTi47bbbvut3s/vuu5e+FwAAAAA+HK60AwDe0+abb54nnniibO3yyy/Pfffdl5tvvjl9+/Zdp32OPPLIjBgxomxtv/32y5FHHlm6ki15+4q14cOHZ9CgQZk8eXLpCrCN1dbWllWrVr3r662trVmwYEGOPPLIJEmfPn3Sq1evPPPMM2XHzZs3r+wqvQ2Zt62tLW+++Wbpar6/uummm7Jq1aqMHTt2vT/T0KFD8+qrr2b27NkZNGhQkuS+++5LW1tbhgwZUva+9u3b59Of/nSS5IYbbsjQoUPTo0ePdz3P3LlzSxETAAAAgA+HaAcAm6DW1tayK6eee+65zJ07N1tssUVqa2tz6qmnZvHixbn22mvTrl277LLLLmXv32qrrdKpU6ey9ffbc8stt8yWW25Ztk+HDh1SU1NTuh3j4sWLs9dee6V3794577zzsnTp0tKxf71aLEmefvrpUkxrbW3N3LlzkyQDBgxIklx22WWpra3NjjvumCT53e9+l/POO6/sWXrf//73c9BBB6V379554YUXMmHChLRv3750+8yKioqcdNJJmTBhQnbbbbcMGDAg11xzTf7whz/k5ptvXud5r7vuunTo0CG77rprOnbsmFmzZuXUU0/NoYcemg4dOpR9H5MmTcqoUaPW+p6WL1+es846K1/+8pez9dZbp6WlJZdddlkWL16cQw45JMnbVwDuv//+aWxszBVXXJE333wzxx13XMaMGZNevXolSVpaWnLzzTdnr732ysqVKzN58uTcdNNN+e1vf1s610UXXZS+fftm5513zsqVK3P11Vfnvvvuy1133bXOP2sAAAAA1p9oBwCboFmzZmX48OGlP5944olJkqOOOipTpkzJkiVL1roF5MbuuS7uvvvuzJ8/P/Pnz89nPvOZstfWrFlT+v0BBxyQhQsXJnn7WXkDBw4sO6atrS2nnnpqnnvuuVRWVma77bbLOeeck2OPPba0x/PPP5/DDjssy5YtS48ePfL5z38+Dz30UNkVZ8cff3xWrlyZE044IS+//HJ222233H333dluu+3Wed7Kysqcc845mTdvXtasWZPevXvnuOOOywknnFB2/J/+9KfMmDGjLI79Vfv27fOHP/wh11xzTVpaWrLlllvmn//5nzN9+vTsvPPOpeOuu+66HHfccdlnn33Srl27jB49OhdffHHZXtdcc02+//3vZ82aNRk6dGjuv//+sufnvfHGG/ne976XxYsXp6qqKv37988999xT9rP9IH7WAAAAAJSrWPN//y9gAAAfE3PmzMmgQYMye/bs1NfXFz3OBvukfI6PQkNDQ/r06ZNrr7226FEAAAD4CPn3IJuKD+YhMQAAAAAAAMAGE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABSssugBAAA2RlNTU9EjbJSP+/wAAAAAfDBEOwDgY6m6ujpVVVUZO3Zs0aNstKqqqlRXVxc9BgAAAAAFEu0AgI+l2traNDU1paWlpehRNlp1dXVqa2uLHgMAAACAAol2AMDHVm1trdgFAAAAwCdCu6IHAAAAAAAAgE2daAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQsMqiBwAA4JNh0aJFaWlp+dD2b21tzbJlyzJnzpwP7RxJUl1dndra2g/1HAAAAAB/T7QDAGCjLVq0KHV1dVmxYsWHep7HHnsst99++4d6jqqqqjQ1NQl3AAAAwEdKtAMAYKO1tLRkxYoVmTp1aurq6ooeZ4M1NTVl7NixaWlpEe0AAACAj5RoBwDAB6auri719fVFjwEAAADwsdOu6AEAAAAAAABgUyfaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAB8KCZOnJgBAwZ8JOe69957U1dXl9WrV5etNzQ05Prrr9+ovceMGZPzzz+/bO3OO+/MgAED0tbWtlF7AwAAAPyVaAcAwDtaunRpvv3tb6e2tjYdO3ZMTU1N9ttvv8ycObOQed4rAp588sk57bTT0r59+9LatGnT8uKLL2bMmDGltauuuip77bVXNt9881RUVOTVV1993/OedtppOeuss/LnP/+5tLb//vunQ4cOue666zb48wAAAAD8X6IdAADvaPTo0XnsscdyzTXXZN68eZk2bVr22muvLFu2rOjRysyYMSMLFizI6NGjy9YvvvjijBs3Lu3a/e1/8q5YsSL7779/fvCDH6zz/rvssku22267TJ06tWz9G9/4Ri6++OKNGx4AAADg/yfaAQCwlldffTXTp0/POeeck+HDh6d3797Zfffdc+qpp+bLX/5y6Zjx48enR48eaWhoSJLMmzfvPfe9+uqrU1dXl06dOmXHHXfM5ZdfXvb6888/n8MOOyxbbLFFunTpksGDB+fhhx/OlClTcuaZZ+bxxx9PRUVFKioqMmXKlCTJjTfemJEjR6ZTp06lfZYuXZr77rsvBx10UNn+xx9/fE455ZTsscce6/V9HHTQQbnxxhvXWps1a1YWLFiwXnsBAAAAvJPKogcAAOAfT9euXdO1a9fcdttt2WOPPdKxY8e1jjnkkEPSuXPn3HHHHXn++efz1a9+Nd/61rey7777Zosttljr+Ouuuy5nnHFGLr300gwcODCPPfZYGhsb06VLlxx11FFpbW3NsGHD8ulPfzrTpk1LTU1N5syZk7a2thx66KF58sknc+edd+aee+5JknTr1i1JMn369Bx++OFl55oxY0aqqqpSV1f3gXwfu+++e84666ysWrWq9F3U1tamZ8+emT59erbbbrsP5DwAAADApku0AwBgLZWVlZkyZUoaGxtzxRVXpL6+PsOGDcuYMWPSv3//zJgxI4888kheeumldOzYsXQLyk996lO5+eabc8wxx6y154QJE3L++efn4IMPTpL07ds3Tz/9dK688socddRRuf7667N06dI8+uijpejXr1+/0vu7du2aysrK1NTUlO27cOHC9OrVa621nj17lt0ac2P06tUrb7zxRpqbm9O7d++y9YULF34g5wAAAAA2baIdAADvaPTo0TnwwAMzffr0PPTQQ7njjjty7rnn5uqrr87y5cvT2tqaLbfcMknS1taWJHnhhRfe8XaRy5cvz4IFC3L00UensbGxtP7WW2+VrpibO3duBg4c+I5X6b2X119/vezWmO+2tjE6d+6c5O1n4v39+t+vAQAAAGwI0Q4AgHfVqVOnjBw5MiNHjszpp5+e8ePHZ8KECfnOd76TrbfeOvfff3+S5KmnnsqoUaNy66235nOf+9xa+7S2tiZJfvGLX2TIkCFlr7Vv3z7J38LY+qqurs4rr7zyvmsb4+WXX06S9OjRY631v18DAAAA2BAfzP2CAADYJOy0005Zvnx56uvr09zcnMrKyvTr1y/bbLNNkmSbbbZJdXX1Wu/r2bNnevXqlWeffTb9+vUr+9W3b98kSf/+/TN37txSIPt7m222WVavXr3W+sCBA/P000+vtdbc3PyBhbsnn3wyn/nMZ8o+28qVK7NgwYIMHDjwAzkHAAAAsGkT7QAAWMuyZcuy9957Z+rUqfn973+f5557LjfddFPOPffcfOUrX8mIESMydOjQjBo1KnfddVdeeOGFJMlll12WWbNmveOeZ555Zs4+++xcfPHFmTdvXp544olMnjw5F1xwQZLksMMOS01NTUaNGpWZM2fm2WefzS233JIHH3wwSdKnT58899xzmTt3blpaWrJq1aokyX777ZcZM2aUnWvgwIGprq7OzJkzy9abm5szd+7czJ8/P0nyxBNPvGco/Kvp06dn3333LVt76KGH0rFjxwwdOnRdvlIAAACA9yTaAQCwlq5du2bIkCG58MIL09DQkF122SWnn356Ghsbc+mll6aioiK33357GhoaMm7cuHz1q19NkixZsiQ9e/Z8xz3Hjx+fq6++OpMnT86uu+6aYcOGZcqUKaUr7TbbbLPcdddd2WqrrXLAAQdk1113zU9/+tPS7TNHjx6d/fffP8OHD0+PHj1yww03JEmOOOKIPPXUU3nmmWdK52rfvn3GjRuX6667rmyGK664IgMHDiw9V6+hoSEDBw7MtGnTyo6bMGFC6fcrV67MbbfdVvYsviS54YYbcsQRR6Sqqmq9v18AAACAv1exZs2aNUUPAQDAx9ucOXMyaNCgzJ49O/X19R/5+U866aT85S9/yZVXXllaa25uzs4775w5c+akd+/e67TPXz/HhAkTMnHixCTJz3/+8/z617/OXXfdVTqupaUlO+ywQ2bNmlWKjgAAAHw4Ghoa0qdPn1x77bVFjwIfKlfaAQDwsffDH/4wvXv3TltbW2mtpqYmkyZNyqJFi9Z5nwULFiRJvvSlL5XWOnTokEsuuaTsuD/96U+5/PLLBTsAAADgA1NZ9AAAALCxunfvnh/84AdrrY8aNWq99tluu+2SJO3a/e3/t238+PFrHTd48OAMHjx4/YYEAAAAeA+utAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAglUWPQAAAJ8cTU1NRY+wUT7u8wMAAAAfX6IdAAAbrbq6OlVVVRk7dmzRo2y0qqqqVFdXFz0GAAAAsIkR7QAA2Gi1tbVpampKS0tL0aNstOrq6tTW1hY9BgAAALCJEe0AAPhA1NbWil0AAAAAG6hd0QMAAAAAAADApk60AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAAChYZdEDAAAAAAAAH1+LFi1KS0vLh7Z/a2trli1bljlz5nxo50iS6urq1NbWfqjngPdSsWbNmjVFDwEAAAAAAHz8LFq0KHV1dVmxYkXRo2y0qqqqNDU1CXcUxpV2AAAAAADABmlpacmKFSsyderU1NXVFT3OBmtqasrYsWPT0tIi2lEY0Q4AAAAAANgodXV1qa+vL3oM+FhrV/QAAAAAAAAAsKkT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAA4AMzceLEDBgw4CM517333pu6urqsXr26bL2hoSHXX3/9Ru29xx575JZbbilbu+KKK3LQQQdt1L7wbkQ7AAAAAACgZOnSpfn2t7+d2tradOzYMTU1Ndlvv/0yc+bMQuZ5rwh48skn57TTTkv79u1La9OmTcuLL76YMWPGlNZWrlyZ7373u9lyyy3TtWvXjB49Oi+++OJ7nve0007LKaeckra2ttLaN7/5zcyZMyfTp0/fuA8F70C0AwAAAAAASkaPHp3HHnss11xzTebNm5dp06Zlr732yrJly4oercyMGTOyYMGCjB49umz94osvzrhx49Ku3d8SyAknnJD/+q//yk033ZTf/va3eeGFF3LwwQe/5/5f/OIX89prr+WOO+4orW222WY5/PDDc/HFF3+wHwYi2gEAAAAAAP+/V199NdOnT88555yT4cOHp3fv3tl9991z6qmn5stf/nLpmPHjx6dHjx5paGhIksybN+8997366qtTV1eXTp06Zccdd8zll19e9vrzzz+fww47LFtssUW6dOmSwYMH5+GHH86UKVNy5pln5vHHH09FRUUqKioyZcqUJMmNN96YkSNHplOnTqV9li5dmvvuu6/sFpZ//vOfM2nSpFxwwQXZe++9M2jQoEyePDkPPPBAHnrooXeduX379jnggANy4403lq0fdNBBmTZtWl5//fX3/0JhPYh2AAAAAABAkqRr167p2rVrbrvttqxateodjznkkEPy0ksv5Y477sjUqVOTJN/61rfy8ssvv+Px1113Xc4444ycddZZaWpqyk9+8pOcfvrpueaaa5Ikra2tGTZsWBYvXpxp06bl8ccfz8knn5y2trYceuih+d73vpedd945S5YsyZIlS3LooYcmSaZPn57BgweXnWvGjBmpqqpKXV1daW327Nl58803M2LEiNLajjvumNra2jz44IPv+X3svvvua90Kc/DgwXnrrbfy8MMPv+d7YX1VFj0AAAAAAADwj6GysjJTpkxJY2NjrrjiitTX12fYsGEZM2ZM+vfvnxkzZuSRRx7JSy+9lI4dO5ZuQfmpT30qN998c4455pi19pwwYULOP//80u0o+/btm6effjpXXnlljjrqqFx//fVZunRpHn300WyxxRZJkn79+pXe37Vr11RWVqampqZs34ULF6ZXr15rrfXs2bPs1pjNzc3ZbLPN0r1797Jje/bsmebm5vf8Pnr16pX//d//TVtbW2nPqqqqdOvWLQsXLnzP98L6Eu0AAAAAAICS0aNH58ADD8z06dPz0EMP5Y477si5556bq6++OsuXL09ra2u23HLLJElbW1uS5IUXXsiCBQvW2mv58uVZsGBBjj766DQ2NpbW33rrrXTr1i1JMnfu3AwcOLAU7NbV66+/XnZrzHdb2xidO3dOW1tbVq1alc6dO5etr1ix4gM7DySiHQAAAAAA8Hc6deqUkSNHZuTIkTn99NMzfvz4TJgwId/5zney9dZb5/7770+SPPXUUxk1alRuvfXWfO5zn1trn9bW1iTJL37xiwwZMqTstfbt2ydJWQxbH9XV1XnllVfed62mpiZvvPFGXn311bKr7V588cW1rt77ey+//HK6dOmy1owvv/xyevTosUFzw7vxTDsAAAAAAOA97bTTTlm+fHnq6+vT3NycysrK9OvXL9tss02SZJtttkl1dfVa7+vZs2d69eqVZ599Nv369Sv71bdv3yRJ//79M3fu3Hd9Jt5mm22W1atXr7U+cODAPP3002utNTc3l4W7QYMGpUOHDrn33ntLa88880wWLVqUoUOHvufnfvLJJzNw4MCytQULFmTlypVrrcPGEu0AAAAAAIAkybJly7L33ntn6tSp+f3vf5/nnnsuN910U84999x85StfyYgRIzJ06NCMGjUqd911V1544YUkyWWXXZZZ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Nc+BBx5YNu+OO+6YLl265J/+6Z8yYsSIPPzww2V7vPzyyzniiCOy+eabp3v37jn66KPT2tpadsyvfvWrDBgwIFVVVendu3d+9rOflb1+//33rzVHRUVFmpubS8dszN8fAAAAAACAT6rK9X3D8uXLs9tuu+Wb3/xmDj744HV+36uvvpqvf/3r2WefffLiiy9u8J6//vWv89BDD6VXr15l63/4wx/S1taWK6+8Mv369cuTTz6ZxsbGLF++POedd16SZPXq1encuXPGjBmTs8466x3379KlS4477rj0798/Xbp0yYwZM3LsscemS5cuOeaYY0rH7bzzzrnnnntKf66sLP8qH3zwwey///459dRTc8kll6SysjKPP/542rVrt87zdujQIV//+tdTX1+f7t275/HHH09jY2Pa2tryk5/8pHSu3/zmN+nfv3+SZNmyZdltt91yyCGHlF7ffvvtc+mll2bbbbfN66+/ngsvvDD77rtv5s+fnx49eiRJjjjiiCxZsiR333133nzzzYwbNy7HHHNMrr/++iTJHXfckSOOOCKXXHJJ9t133zQ1NaWxsTGdO3fOcccdV/bZn3nmmWy++ealP2+11Val32/o3x8AAAAAAIBPsoo1a9as2eA3V1Tk17/+dUaNGvW+x44ZMyaf/exn0759+9x2222ZO3fueu+5ePHiDBkyJL/5zW9y4IEH5vjjj8/xxx//ruf82c9+lp///Od59tlny9bnzJmTQYMGZdiwYbn//vvfd/aDDz44Xbp0yX/8x38kefvKtff6DEmyxx57ZOTIkfnxj3/8vvu/37z/14knnphHH30006dPL32O2bNnp76+Pkly0UUX5YwzzsiSJUvSpUuXd9zjL3/5S7p165Z77rkn++yzT5qamrLTTjvl0UcfzeDBg5Mkd955Zw444IA8//zz6dWrVw4//PC8+eabuemmm0r7XHLJJTn33HOzaNGiVFRU5P7778/w4cPzyiuvpHv37u/7edfn7w8AAAAAAMAn2UfyTLvJkyfn2WefzYQJEzZ4j7a2thx55JE56aSTsvPOO6/Te/785z9niy222OBzJsljjz2WBx54IMOGDStb/+Mf/5hevXpl2223zRFHHJFFixaVXnvppZfy8MMPZ6uttsqee+6Znj17ZtiwYZkxY8ZGzTt//vzceeeda83yf02aNCljxox512D3xhtv5Kqrrkq3bt2y2267JXn7qsDu3buXgl2SjBgxIu3atSvdRnPVqlXp1KlT2V6dO3fO888/n4ULF5atDxgwIFtvvXVGjhyZmTNnvudnBgAAAAAA4COIdn/84x9zyimnZOrUqWvdQnJ9nHPOOamsrMy//Mu/rNPx8+fPzyWXXJJjjz12g873mc98Jh07dszgwYPz3e9+N+PHjy+9NmTIkEyZMiV33nlnfv7zn+e5557LF77whbz22mtJUrpSbuLEiWlsbMydd96Z+vr67LPPPvnjH/+43vPuueee6dSpUz772c/mC1/4Qn70ox+94x6PPPJInnzyybJZ/+q///u/07Vr13Tq1CkXXnhh7r777lRXVydJmpuby25hmbx9u88tttii9Dy6/fbbL7feemvuvffetLW1Zd68eTn//POTJEuWLEmSbL311rniiityyy235JZbbsk222yTvfbaK3PmzHn3LxoAAAAAAID1f6bd+li9enUOP/zwnHnmmdl+++03eJ/Zs2fn3//93zNnzpxUVFS87/GLFy/O/vvvn0MOOSSNjY0bdM7p06entbU1Dz30UE455ZT069cvhx12WJLki1/8Yum4/v37Z8iQIendu3d+9atf5eijj05bW1uS5Nhjj824ceOSJAMHDsy9996bX/7ylzn77LPXa97//M//zGuvvZbHH388J510Us4777ycfPLJax03adKk7Lrrrtl9993Xem348OGZO3duWlpa8otf/CJf+9rXSlcDrovGxsYsWLAgX/rSl/Lmm29m8803z7/+679m4sSJpef07bDDDtlhhx1K79lzzz2zYMGCXHjhhaVbiwIAAAAAALC2D/VKu9deey2zZs3Kcccdl8rKylRWVuZHP/pRHn/88VRWVua+++5bp32mT5+el156KbW1taV9Fi5cmO9973vp06dP2bEvvPBChg8fnj333DNXXXXVBs/et2/f7LrrrmlsbMwJJ5yQiRMnvuux3bt3z/bbb5/58+cnefuKsyTZaaedyo6rq6sru43mus67zTbbZKeddsphhx2Wn/70p5k4cWJWr15ddszy5ctz44035uijj37HPbp06ZJ+/fpljz32yKRJk1JZWZlJkyYlSWpqavLSSy+VHf/WW2/l5ZdfTk1NTZK3nz93zjnnpLW1NQsXLkxzc3MpDm677bbv+t3svvvupe8FAAAAAACAd/ahXmm3+eab54knnihbu/zyy3Pffffl5ptvTt++fddpnyOPPDIjRowoW9tvv/1y5JFHlq5kS96+Ym348OEZNGhQJk+eXLoCbGO1tbVl1apV7/p6a2trFixYkCOPPDJJ0qdPn/Tq1SvPPPNM2XHz5s0ru0pvQ+Zta2vLm2++Wbqa769uuummrFq1KmPHjl3vzzR06NC8+uqrmT17dgYNGpQkue+++9LW1pYhQ4aUva99+/b59Kc/nSS54YYbMnTo0PTo0eNdzzN37txSxAQAAAAAAOCdrXe0a21tLbty6rnnnsvcuXOzxRZbpLa2NqeeemoWL16ca6+9Nu3atcsuu+xS9v6tttoqnTp1Klt/vz233HLLbLnllmX7dOjQITU1NaXbMS5evDh77bVXevfunfPOOy9Lly4tHfvXq8WS5Omnny7FtNbW1sydOzdJMmDAgCTJZZddltra2uy4445Jkt/97nc577zzyp6l9/3vfz8HHXRQevfunRdeeCETJkxI+/btS7fPrKioyEknnZQJEyZkt912y4ABA3LNNdfkD3/4Q26++eZ1nve6665Lhw4dsuuuu6Zjx46ZNWtWTj311Bx66KHp0KFD2fcxadKkjBo1aq3vafny5TnrrLPy5S9/OVtvvXVaWlpy2WWXZfHixTnkkEOSvH0F4P7775/GxsZcccUVefPNN3PcccdlzJgx6dWrV5KkpaUlN998c/baa6+sXLkykydPzk033ZTf/va3pXNddNFF6du3b3beeeesXLkyV199de67777cdddd6/yzBgAAAAAA2BStd7SbNWtWhg8fXvrziSeemCQ56qijMmXKlCxZsmStW0Bu7J7r4u677878+fMzf/78fOYznyl7bc2aNaXfH3DAAVm4cGGSt5+VN3DgwLJj2tracuqpp+a5555LZWVltttuu5xzzjk59thjS3s8//zzOeyww7Js2bL06NEjn//85/PQQw+VXXF2/PHHZ+XKlTnhhBPy8ssvZ7fddsvdd9+d7bbbbp3nrayszDnnnJN58+ZlzZo16d27d4477riccMIJZcf/6U9/yowZM8ri2F+1b98+f/jDH3LNNdekpaUlW265Zf75n/8506dPz84771w67rrrrstxxx2XffbZJ+3atcvo0aNz8cUXl+11zTXX5Pvf/37WrFmToUOH5v777y97ft4bb7yR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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Circuit(exp).decomp().to_dual_rail().draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "0406fa28", + "metadata": {}, + "outputs": [], + "source": [ + "path_exp = Circuit(exp).to_dual_rail()" + ] + }, + { + "cell_type": "code", + "execution_count": null, "id": "b86a1407-e4ce-4776-ac0e-ce23ea5a9fff", "metadata": {}, "outputs": [], @@ -112,14 +188,24 @@ "free_syms = exp.free_symbols\n", "\n", "path_exp = Circuit(exp).to_dual_rail()\n", - "f_exp = lambda xs: to_float(path_exp.lambdify(*free_syms)(*xs).double().to_tensor().eval().array[0, 0])\n", - "orig_f_exp = lambda xs: to_float(exp.lambdify(*free_syms)(*xs).double().to_tensor().eval().array.item())\n", + "\n", + "f_exp = lambda xs: to_float(path_exp.lambdify(*free_syms)(*xs).eval().tensor.array)\n", + "orig_f_exp = lambda xs: to_float(exp.lambdify(*free_syms)(*xs).eval().array.item())\n", "\n", "def d_f_exp(xs):\n", + " #path_exp.grad(list(free_syms)[0]).draw()#.lambdify(*free_syms)(*xs).draw()\n", " return [\n", - " path_exp.grad(s).lambdify(*free_syms)(*xs).eval().array[0, 0]\n", + " path_exp.grad(s).lambdify(*free_syms)(*xs).eval().tensor.array\n", " for s in free_syms\n", - " ]" + " ]\n", + "\n", + "# def d_f_exp(xs):\n", + "# grads = [path_exp.grad(s) for s in free_syms]\n", + "# vals = [0] * len(grads)\n", + "# for i, g in enumerate(grads):\n", + "# for term in g.lambdify(*free_syms)(*xs).terms:\n", + "# vals[i] += to_float(term.eval().tensor.array)\n", + "# return vals" ] }, { @@ -132,7 +218,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 12, "id": "41ea980c-40c4-4bd2-8731-fc84fb110f41", "metadata": {}, "outputs": [], @@ -147,10 +233,10 @@ " x = x0\n", "\n", " for _ in tqdm(range(20)):\n", + " orig_fx = orig_f_exp(x)\n", " fx = f_exp(x)\n", " dfx = d_f_exp(x)\n", - " orig_fx = orig_f_exp(x)\n", - "\n", + " print(orig_fx)\n", " # verifies that the conversion is correct\n", " assert abs(orig_fx - fx) < 1e-10\n", "\n", @@ -167,7 +253,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "cd5e3e93-5d75-415d-bbcc-14022c9ecf97", "metadata": { "scrolled": true @@ -179,6 +265,42 @@ "text": [ " 0%| | 0/20 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/20 [00:02 \u001b[39m\u001b[32m1\u001b[39m \u001b[43moptimize\u001b[49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[32;43m0.1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[32;43m0.2\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[12]\u001b[39m\u001b[32m, line 13\u001b[39m, in \u001b[36moptimize\u001b[39m\u001b[34m(x0)\u001b[39m\n\u001b[32m 11\u001b[39m orig_fx = orig_f_exp(x)\n\u001b[32m 12\u001b[39m fx = f_exp(x)\n\u001b[32m---> \u001b[39m\u001b[32m13\u001b[39m dfx = \u001b[43md_f_exp\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 14\u001b[39m \u001b[38;5;28mprint\u001b[39m(orig_fx)\n\u001b[32m 15\u001b[39m \u001b[38;5;66;03m# verifies that the conversion is correct\u001b[39;00m\n", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[11]\u001b[39m\u001b[32m, line 17\u001b[39m, in \u001b[36md_f_exp\u001b[39m\u001b[34m(xs)\u001b[39m\n\u001b[32m 14\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34md_f_exp\u001b[39m(xs):\n\u001b[32m 15\u001b[39m path_exp.grad(\u001b[38;5;28mlist\u001b[39m(free_syms)[\u001b[32m0\u001b[39m]).draw()\u001b[38;5;66;03m#.lambdify(*free_syms)(*xs).draw()\u001b[39;00m\n\u001b[32m 16\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m [\n\u001b[32m---> \u001b[39m\u001b[32m17\u001b[39m \u001b[43mpath_exp\u001b[49m\u001b[43m.\u001b[49m\u001b[43mgrad\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mlambdify\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43mfree_syms\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43mxs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m.tensor.array\n\u001b[32m 18\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m s \u001b[38;5;129;01min\u001b[39;00m free_syms\n\u001b[32m 19\u001b[39m ]\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/optyx/optyx/core/channel.py:475\u001b[39m, in \u001b[36mDiagram.eval\u001b[39m\u001b[34m(self, backend, **kwargs)\u001b[39m\n\u001b[32m 472\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m backend \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 473\u001b[39m backend = QuimbBackend()\n\u001b[32m--> \u001b[39m\u001b[32m475\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mbackend\u001b[49m\u001b[43m.\u001b[49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/optyx/optyx/core/backends.py:397\u001b[39m, in \u001b[36mQuimbBackend.eval\u001b[39m\u001b[34m(self, diagram, **extra)\u001b[39m\n\u001b[32m 384\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34meval\u001b[39m(\n\u001b[32m 385\u001b[39m \u001b[38;5;28mself\u001b[39m,\n\u001b[32m 386\u001b[39m diagram: Diagram,\n\u001b[32m 387\u001b[39m **extra: Any) -> EvalResult:\n\u001b[32m 388\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 389\u001b[39m \u001b[33;03m Evaluate the diagram using Quimb.\u001b[39;00m\n\u001b[32m 390\u001b[39m \n\u001b[32m (...)\u001b[39m\u001b[32m 395\u001b[39m \u001b[33;03m The result of the evaluation.\u001b[39;00m\n\u001b[32m 396\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m397\u001b[39m quimb_tn = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_get_quimb_tensor\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdiagram\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 398\u001b[39m tensor_diagram = \u001b[38;5;28mself\u001b[39m._get_discopy_tensor(diagram)\n\u001b[32m 400\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m quimb_tn:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/optyx/optyx/core/backends.py:320\u001b[39m, in \u001b[36mAbstractBackend._get_quimb_tensor\u001b[39m\u001b[34m(self, diagram)\u001b[39m\n\u001b[32m 313\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_get_quimb_tensor\u001b[39m(\n\u001b[32m 314\u001b[39m \u001b[38;5;28mself\u001b[39m,\n\u001b[32m 315\u001b[39m diagram: Diagram\n\u001b[32m 316\u001b[39m ) -> TensorNetwork:\n\u001b[32m 317\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 318\u001b[39m \u001b[33;03m Get the Quimb tensor representation of the diagram.\u001b[39;00m\n\u001b[32m 319\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m320\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_get_discopy_tensor\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdiagram\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mto_quimb\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/.venv/lib/python3.12/site-packages/discopy/tensor.py:451\u001b[39m, in \u001b[36mDiagram.to_quimb\u001b[39m\u001b[34m(self, dtype)\u001b[39m\n\u001b[32m 448\u001b[39m tensors = inputs[:]\n\u001b[32m 449\u001b[39m scan = [(t, \u001b[32m1\u001b[39m) \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m inputs]\n\u001b[32m--> \u001b[39m\u001b[32m451\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m i, (box, off) \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(\u001b[38;5;28mzip\u001b[39m(\u001b[38;5;28mself\u001b[39m.boxes, \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43moffsets\u001b[49m)):\n\u001b[32m 452\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(box, Swap):\n\u001b[32m 453\u001b[39m scan[off], scan[off + \u001b[32m1\u001b[39m] = scan[off + \u001b[32m1\u001b[39m], scan[off]\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/.venv/lib/python3.12/site-packages/discopy/monoidal.py:598\u001b[39m, in \u001b[36mDiagram.offsets\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 595\u001b[39m \u001b[38;5;129m@property\u001b[39m\n\u001b[32m 596\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34moffsets\u001b[39m(\u001b[38;5;28mself\u001b[39m) -> \u001b[38;5;28mlist\u001b[39m[\u001b[38;5;28mint\u001b[39m]:\n\u001b[32m 597\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\" The offset of a box is the length of the type on its left. \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m598\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mlist\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mleft\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mleft\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m_\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m_\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/.venv/lib/python3.12/site-packages/discopy/monoidal.py:598\u001b[39m, in \u001b[36m\u001b[39m\u001b[34m(.0)\u001b[39m\n\u001b[32m 595\u001b[39m \u001b[38;5;129m@property\u001b[39m\n\u001b[32m 596\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34moffsets\u001b[39m(\u001b[38;5;28mself\u001b[39m) -> \u001b[38;5;28mlist\u001b[39m[\u001b[38;5;28mint\u001b[39m]:\n\u001b[32m 597\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\" The offset of a box is the length of the type on its left. \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m598\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mlist\u001b[39m(\u001b[38;5;28mlen\u001b[39m(left) \u001b[38;5;28;01mfor\u001b[39;00m left, _, _ \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m)\n", + "\u001b[31mValueError\u001b[39m: too many values to unpack (expected 3)" + ] } ], "source": [ @@ -187,7 +309,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "3a0c4436-86d9-4a16-9bc2-7eba1cc440f7", "metadata": {}, "outputs": [ @@ -220,11 +342,19 @@ " **{f'x{i}': [v[i] for v in xs] for i in range(len(free_syms))}\n", "}).plot()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c4e312d7", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": ".venv", "language": "python", "name": "python3" }, @@ -238,7 +368,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/docs/notebooks/photon_distinguishability.ipynb b/docs/notebooks/photon_distinguishability.ipynb index bc3e323c..6d4653d1 100644 --- a/docs/notebooks/photon_distinguishability.ipynb +++ b/docs/notebooks/photon_distinguishability.ipynb @@ -61,11 +61,11 @@ " \n", " \n", " \n", - " 2025-07-11T08:56:28.547486\n", + " 2025-09-04T14:45:17.238229\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -90,37 +90,37 @@ "L 439.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pce30823637)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pd22800e47d)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", "
\n", " \n", " \n", + "\" clip-path=\"url(#pd22800e47d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd22800e47d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd22800e47d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd22800e47d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd22800e47d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd22800e47d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd22800e47d)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd22800e47d)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd22800e47d)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -667,7 +667,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -779,7 +779,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -825,11 +825,11 @@ " \n", " \n", " \n", - " 2025-07-11T08:56:28.611310\n", + " 2025-09-04T14:45:18.222738\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -854,62 +854,62 @@ "L 295.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p7e7797de41)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe68549364e)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -1516,7 +1516,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1595,7 +1595,7 @@ "metadata": {}, "outputs": [], "source": [ - "result = channel_BS.double().to_tensor(max_dim=3).eval().array" + "result = channel_BS.eval().prob_dist()" ] }, { @@ -1606,20 +1606,18 @@ }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "{(0, 2): (0.5+0j), (2, 0): (0.5+0j)}\n" - ] + "data": { + "text/plain": [ + "{(0, 2): (0.5+0j), (1, 1): (1.2325951644078304e-32+0j), (2, 0): (0.5+0j)}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "import numpy as np\n", - "\n", - "rounded_result = np.round(result, 3)\n", - "\n", - "non_zero_dict = {idx: val for idx, val in np.ndenumerate(rounded_result) if val != 0}\n", - "print(non_zero_dict)" + "result" ] }, { @@ -1648,6 +1646,15 @@ "execution_count": 8, "metadata": {}, "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], "source": [ "internal_state_1 = np.random.rand(2) + 1j*np.random.rand(2)\n", "internal_state_1 = internal_state_1 / np.linalg.norm(internal_state_1)\n", @@ -1657,16 +1664,16 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([0.40967198+0.60659402j, 0.60777898+0.30792413j])" + "array([0.46805045+0.03203795j, 0.78186157+0.41060301j])" ] }, - "execution_count": 9, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -1677,16 +1684,16 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([0.46117336+0.69994621j, 0.02085841+0.54493978j])" + "array([0.54051796+0.56786515j, 0.46030203+0.41652317j])" ] }, - "execution_count": 10, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -1697,7 +1704,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -1710,33 +1717,33 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ - "result = channel_BS.double().to_tensor(max_dim=3).eval().array" + "result = channel_BS.eval().prob_dist()" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "{(0, 2): (0.435125-0j), (1, 1): (0.129749+0j), (2, 0): (0.435125-0j)}\n" - ] + "data": { + "text/plain": [ + "{(0, 2): (0.4479236685298761+1.66268625707414e-18j),\n", + " (1, 1): (0.10415266294024787-1.7203160321962734e-17j),\n", + " (2, 0): (0.4479236685298761+1.5540474064888597e-17j)}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "import numpy as np\n", - "\n", - "rounded_result = np.round(result, 6)\n", - "\n", - "non_zero_dict = {idx: val for idx, val in np.ndenumerate(rounded_result) if val != 0}\n", - "print(non_zero_dict)" + "result" ] }, { @@ -1748,16 +1755,16 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "0.1297494782905118" + "0.10415266294024783" ] }, - "execution_count": 14, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -1777,7 +1784,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -1791,11 +1798,11 @@ " \n", " \n", " \n", - " 2025-07-11T08:56:29.397725\n", + " 2025-09-04T14:45:30.829444\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -1820,182 +1827,182 @@ "L 439.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p3ee7baf01e)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", "
\n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3e57b90873)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -2704,7 +2711,7 @@ " \n", "
\n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2766,7 +2773,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -2788,7 +2795,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": { "scrolled": true }, @@ -2804,11 +2811,11 @@ " \n", " \n", " \n", - " 2025-07-11T08:56:29.583069\n", + " 2025-09-04T14:45:34.272364\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -2833,262 +2840,262 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p68c9fc5c77)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", "
\n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a148ce87a)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4556,32 +4563,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4616,7 +4623,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4629,7 +4636,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4648,72 +4655,87 @@ "from optyx.photonic import DualRail\n", "from optyx.classical import PostselectBit\n", "from discopy.drawing import Equation\n", + "from optyx.core.channel import Diagram, bit, qubit, mode, qmode\n", "\n", - "bell_state = Z(0, 2) @ Scalar(0.5 ** 0.5)\n", + "bell_state = (Z(0, 2) @ Scalar(0.5 ** 0.5))\n", "dual_rail_encoding = lambda state: DualRail(1, internal_states=[state])\n", - "encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(internal_state_2)\n", "post_select = PostselectBit(1) @ PostselectBit(0)\n", - "experiment = bell_state @ bell_state >> Id(1) @ (encoding_layer >> fusion_channel >> post_select) @ Id(1)\n", - "measure = Measure(2)\n", - "Equation(experiment >> measure, bell_state >> measure).draw(figsize=(8, 8))" + "\n", + "def fusion(internal_state_1, internal_state_2):\n", + " @Diagram.from_callable(dom=bit ** 0, cod=qubit**2)\n", + " def d():\n", + " a = (bell_state @ bell_state)()\n", + " b = (dual_rail_encoding(internal_state_1) @ dual_rail_encoding(internal_state_2))(a[1], a[2])\n", + " c = fusion_channel(*b)\n", + " post_select(c[0], c[1])\n", + " return a[0], a[3]\n", + "\n", + " return d\n", + "\n", + "@Diagram.from_callable(dom=bit ** 0, cod=qubit**2)\n", + "def bell():\n", + " a1, a2 = bell_state()\n", + " return a1, a2\n", + "\n", + "Equation(fusion(internal_state_1, internal_state_2) >> Measure(2), bell >> Measure(2)).draw(figsize=(8, 8))" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "0.25000000000000017" + "array(0.25-0.j)" ] }, - "execution_count": 18, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from optyx.qubits import Discard\n", - "(experiment >> Discard(2)).inflate(2).double().to_tensor(max_dim=3).to_quimb()^..." + "(fusion(internal_state_1, internal_state_2) >> Discard(2)).inflate(2).eval().tensor.array" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ - "fidelity = (experiment >> bell_state.dagger())\n", + "fidelity = (fusion(internal_state_1, internal_state_2) >> bell_state.dagger())\n", "\n", - "normalisation = (experiment >> Discard(2)).inflate(2).double().to_tensor(max_dim=3).to_quimb()^..." + "normalisation = (fusion(internal_state_1, internal_state_2) >> Discard(2)).inflate(2).eval().tensor.array" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "1.0000000000000002" + "(1.0000000000000002-1.83697019872103e-16j)" ] }, - "execution_count": 20, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "f = fidelity.inflate(2).double().to_tensor(max_dim=3).to_quimb()^...\n", + "f = fidelity.inflate(2).eval().tensor.array\n", "f/normalisation" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -4727,7 +4749,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -4736,14 +4758,14 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "inner_product_states = []\n", "inner_product_bell_states = []\n", "\n", - "result_bell = (bell_state.double().to_tensor().to_quimb()^...).data.flatten()\n", + "result_bell = bell_state.eval().tensor.array.flatten()\n", "result_bell = result_bell / np.linalg.norm(result_bell)\n", "\n", "for vector in unit_vectors:\n", @@ -4751,8 +4773,8 @@ " experiment = bell_state @ bell_state >> Id(1) @ (encoding_layer >> fusion_channel\n", " >> post_select) @ Id(1)\n", "\n", - " f = (experiment >> bell_state.dagger()).inflate(2).double().to_tensor(max_dim=3).to_quimb()^...\n", - " normalisation = (experiment >> Discard(2)).inflate(2).double().to_tensor(max_dim=3).to_quimb()^...\n", + " f = (experiment >> bell_state.dagger()).inflate(2).eval().tensor.array\n", + " normalisation = (experiment >> Discard(2)).inflate(2).eval().tensor.array\n", "\n", " inner_product_states.append(np.inner(vector, internal_state_1))\n", " inner_product_bell_states.append(f/normalisation)" @@ -4760,9 +4782,19 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1719: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " return math.isfinite(val)\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1355: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " return np.asarray(x, float)\n" + ] + }, { "data": { "image/svg+xml": [ @@ -4774,11 +4806,11 @@ " \n", " \n", " \n", - " 2025-07-11T08:57:34.456021\n", + " 2025-09-04T14:51:22.415739\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -4810,16 +4842,16 @@ " \n", " \n", + "\" clip-path=\"url(#p33a72152de)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4865,11 +4897,11 @@ " \n", " \n", + "\" clip-path=\"url(#p33a72152de)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4911,11 +4943,11 @@ " \n", " \n", + "\" clip-path=\"url(#p33a72152de)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4952,11 +4984,11 @@ " \n", " \n", + "\" clip-path=\"url(#p33a72152de)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5004,11 +5036,11 @@ " \n", " \n", + "\" clip-path=\"url(#p33a72152de)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5065,11 +5097,11 @@ " \n", " \n", + "\" clip-path=\"url(#p33a72152de)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5335,16 +5367,16 @@ " \n", " \n", + "\" clip-path=\"url(#p33a72152de)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5387,11 +5419,11 @@ " \n", " \n", + "\" clip-path=\"url(#p33a72152de)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5407,11 +5439,11 @@ " \n", " \n", + "\" clip-path=\"url(#p33a72152de)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5439,11 +5471,11 @@ " \n", " \n", + "\" clip-path=\"url(#p33a72152de)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5459,11 +5491,11 @@ " \n", " \n", + "\" clip-path=\"url(#p33a72152de)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5511,11 +5543,11 @@ " \n", " \n", + "\" clip-path=\"url(#p33a72152de)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5814,9 +5846,9 @@ "L 92.228804 231.641477 \n", "L 75.799222 233.407231 \n", "L 59.321307 233.998125 \n", - "\" clip-path=\"url(#p267996ebfb)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#p33a72152de)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -6100,7 +6132,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6128,7 +6160,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -6142,11 +6174,11 @@ " \n", " \n", " \n", - " 2025-07-11T08:57:34.528132\n", + " 2025-09-04T14:51:25.378090\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.0, https://matplotlib.org/\n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -6178,16 +6210,16 @@ " \n", " \n", + "\" clip-path=\"url(#p131f154857)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6264,11 +6296,11 @@ " \n", " \n", + "\" clip-path=\"url(#p131f154857)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6311,11 +6343,11 @@ " \n", " \n", + "\" clip-path=\"url(#p131f154857)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6353,11 +6385,11 @@ " \n", " \n", + "\" clip-path=\"url(#p131f154857)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6406,11 +6438,11 @@ " \n", " \n", + "\" clip-path=\"url(#p131f154857)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6468,11 +6500,11 @@ " \n", " \n", + "\" clip-path=\"url(#p131f154857)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6739,16 +6771,16 @@ " \n", " \n", + "\" clip-path=\"url(#p131f154857)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6765,11 +6797,11 @@ " \n", " \n", + "\" clip-path=\"url(#p131f154857)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6786,11 +6818,11 @@ " \n", " \n", + "\" clip-path=\"url(#p131f154857)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6807,11 +6839,11 @@ " \n", " \n", + "\" clip-path=\"url(#p131f154857)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6828,11 +6860,11 @@ " \n", " \n", + "\" clip-path=\"url(#p131f154857)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6849,11 +6881,11 @@ " \n", " \n", + "\" clip-path=\"url(#p131f154857)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7133,9 +7165,9 @@ "L 147.479683 174.226224 \n", "L 75.82813 217.807169 \n", "L -1 263.379876 \n", - "\" clip-path=\"url(#p984e08da21)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#p131f154857)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -7399,7 +7431,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7437,7 +7469,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": ".venv", "language": "python", "name": "python3" }, @@ -7451,7 +7483,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/optyx/core/backends.py b/optyx/core/backends.py index 0c46726f..9a792f41 100644 --- a/optyx/core/backends.py +++ b/optyx/core/backends.py @@ -392,16 +392,49 @@ def eval( Returns: The result of the evaluation. """ - quimb_tn = self._get_quimb_tensor(diagram) + + if hasattr(diagram, 'terms'): + results = sum(self._process_term(term) for term in diagram.terms) + else: + results = self._process_term(diagram) + + if diagram.is_pure: + state_type = StateType.AMP + else: + state_type = StateType.DM + tensor_diagram = self._get_discopy_tensor(diagram) + return EvalResult( + discopy_tensor.Box( + "Result", + tensor_diagram.dom, + tensor_diagram.cod, + results + ), + output_types=diagram.cod, + state_type=state_type + ) + + def _process_term(self, term: Diagram) -> np.ndarray: + """ + Process a term in a diagram with multiple terms. + + Args: + term (Diagram): The term to process. + + Returns: + np.ndarray: The processed term as a numpy array. + """ + quimb_tn = self._get_quimb_tensor(term) + for t in quimb_tn: dt = t.data.dtype if dt.kind in {'i', 'u', 'b'}: t.modify(data=t.data.astype(np.complex128, copy=False)) if self.hyperoptimiser is None: - results = quimb_tn ^ ... + result = quimb_tn ^ ... else: is_approx = isinstance( self.hyperoptimiser, @@ -426,30 +459,16 @@ def eval( contract = quimb_tn.contract_compressed if \ is_approx else quimb_tn.contract - results = contract( + result = contract( optimize=self.hyperoptimiser, output_inds=sorted(quimb_tn.outer_inds()), **self.contraction_params ) - if not isinstance(results, (complex, float, int)): - results = results.data - - if diagram.is_pure: - state_type = StateType.AMP - else: - state_type = StateType.DM + if not isinstance(result, (complex, float, int)): + result = result.data - return EvalResult( - discopy_tensor.Box( - "Result", - tensor_diagram.dom, - tensor_diagram.cod, - results - ), - output_types=diagram.cod, - state_type=state_type - ) + return result # pylint: disable=too-few-public-methods diff --git a/optyx/core/channel.py b/optyx/core/channel.py index d83c9914..db29fd64 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -108,6 +108,7 @@ from __future__ import annotations +import numpy as np from discopy import tensor from discopy import symmetric, frobenius, hypergraph from discopy.cat import factory @@ -115,6 +116,7 @@ from pyzx import extract_circuit from optyx.core import zx, diagram from optyx.utils.utils import explode_channel +from optyx.core.path import Matrix class Ob(frobenius.Ob): @@ -334,8 +336,7 @@ def to_path(self, dtype: type = complex): cod=frobenius.Category(int, path.Matrix[dtype]), )(self) - def _decomp(self): - + def decomp(self): # pylint: disable=protected-access return frobenius.Functor( ob=lambda x: qubit**len(x), @@ -590,14 +591,10 @@ def dagger(self): cod=self.dom, ) - def _decomp(self): + def decomp(self): # pylint: disable=import-outside-toplevel - from optyx.qubits import QubitChannel - decomposed = zx.decomp(self.kraus) - return explode_channel( - decomposed, - QubitChannel, - Diagram + raise NotImplementedError( + "Decomposition is only implemented for ZX channels." ) def to_dual_rail(self): @@ -658,20 +655,65 @@ def grad(self, var, **params): return self.sum_factory((), self.dom, self.cod) return sum(term.grad(var, **params) for term in self.terms) - def eval(self, n_photons=0, permanent=None, dtype=complex): - """Evaluate the sum of diagrams.""" - # we need to implement the proper sums of qpath diagrams - # this is only a temporary solution, so that the grad tests pass - if permanent is None: - # pylint: disable=import-outside-toplevel - from optyx.core.path import npperm - - permanent = npperm - return sum( - term.to_path(dtype).eval(n_photons, permanent) - for term in self.terms + def get_kraus(self): + if len(self.terms) == 0: + return diagram.Scalar(0) + + return diagram.Diagram.sum_factory( + [term.get_kraus() for term in self.terms] ) + # def to_path(self, dtype: type = complex): + # """Evaluate the sum of diagrams.""" + # array = 0 + # doms = [] + # cods = [] + # creations = [] + # selections = [] + # normalisations = [] + # for term in self.terms: + # path_diagram = term.to_path(dtype) + # array += path_diagram.array + # creations.append(path_diagram.creations) + # selections.append(path_diagram.selections) + # doms.append(path_diagram.dom) + # cods.append(path_diagram.cod) + # normalisations.append(path_diagram.normalisation) + + # assert all(d == doms[0] for d in doms), "All terms must have the same dom" + # assert all(c == cods[0] for c in cods), "All terms must have the same cod" + # assert all(creations[0] == cr for cr in creations), "All creations tuples must be identical" + # assert all(selections[0] == se for se in selections), "All selections tuples must be identical" + # assert all(normalisations[0] == n for n in normalisations), "All normalisations must be identical" + + # array = array/len(self.terms) + + # dom = doms[0] + # cod = cods[0] + + # return Matrix[dtype]( + # array, + # dom, + # cod, + # creations=creations[0], + # selections=selections[0], + # normalisation=normalisations[0] + # ) + + # def eval(self, n_photons=0, permanent=None, dtype=complex): + # """Evaluate the sum of diagrams.""" + # # we need to implement the proper sums of qpath diagrams + # # this is only a temporary solution, so that the grad tests pass + # if permanent is None: + # # pylint: disable=import-outside-toplevel + # from optyx.core.path import npperm + + # permanent = npperm + # return sum( + # term.to_path(dtype).eval(n_photons, permanent) + # for term in self.terms + # ) + class CQMap(Diagram, frobenius.Box): """ diff --git a/optyx/qubits.py b/optyx/qubits.py index d2958768..b84d69bc 100644 --- a/optyx/qubits.py +++ b/optyx/qubits.py @@ -265,13 +265,14 @@ """ # noqa E501 -from typing import Literal +from typing import Literal, Iterable from enum import Enum import numpy as np from pyzx.graph.base import BaseGraph import graphix from discopy import quantum as quantum_discopy from discopy import symmetric +from sympy import Expr, lambdify, Symbol, Mul # from pytket import circuit as tket_circuit from optyx.utils.utils import explode_channel from optyx.core import ( @@ -422,22 +423,28 @@ def _to_optyx_from_graphix(cls, underlying_circuit): class QubitChannel(Channel): """Qubit channel.""" - def _decomp(self): - decomposed = zx.decomp(self.kraus) - return explode_channel( - decomposed, - QubitChannel, - Diagram - ) + # def decomp(self): + # """Decompose into elementary gates.""" + # from optyx.utils.utils import decomp_ar + # from discopy import symmetric + # return symmetric.Functor( + # ob=lambda x: qubit**len(x), + # ar=decomp_ar, + # cod=symmetric.Category(channel.Ty, channel.Diagram), + # )(self) + + # def to_dual_rail(self): + # """Convert to dual-rail encoding.""" + # from optyx.utils.utils import ar_zx2path + # from optyx import qmode + # from discopy import symmetric + + # return symmetric.Functor( + # ob=lambda x: qmode**(2 * len(x)), + # ar=lambda ar : ar_zx2path(ar.decomp()), + # cod=symmetric.Category(channel.Ty, channel.Diagram), + # )(self) - def to_dual_rail(self): - """Convert to dual-rail encoding.""" - kraus_path = zx.zx2path(self.kraus) - return explode_channel( - kraus_path, - Channel, - Diagram - ) # pylint: disable=too-many-locals # pylint: disable=too-many-return-statements @@ -605,7 +612,89 @@ def __init__(self, n_legs_in, n_legs_out, phase=0): qubit**n_legs_in, qubit**n_legs_out, ) + self.data = phase + self.phase = phase + + def lambdify(self, *symbols, **kwargs): + return lambda *xs: type(self)( + len(self.dom), + len(self.cod), + lambdify(symbols, self.phase, **kwargs)(*xs) + ) + + def decomp(self): + n, m = len(self.dom), len(self.cod) + phase = self.phase + rot = Id(1) if phase == 0 else Z(1, 1, phase) + if n == 0: + return X(0, 1) >> H() >> rot >> self._make_spiders(m) + if m == 0: + return X(1, 0) << H() << rot << self._make_spiders(n).dagger() + return self._make_spiders(n).dagger() >> rot >> self._make_spiders(m) + + @staticmethod + def _make_spiders(n): + """Constructs the Z spider 1 -> n from spiders 1 -> 2. + + >>> assert len(make_spiders(6)) == 5 + """ + from optyx import qubits + + spider = qubits.Id(1) + for k in range(n - 1): + spider = spider >> qubits.Z(1, 2) @ qubits.Id(k) + return spider + + def to_dual_rail(self): + """Convert to dual-rail encoding.""" + + from optyx import ( + photonic, + qmode, + classical + ) + from optyx.core import zw + create = photonic.Create(1) + annil = classical.Select(1) + comonoid = Channel("Split", zw.Split(2)) + monoid = Channel("Merge", zw.Merge(2)) + BS = photonic.BS + + n, m = len(self.dom), len(self.cod) + phase = self.phase + if (n, m) == (0, 1): + return create >> comonoid + if (n, m) == (1, 1): + return qmode @ photonic.Phase(phase) + if (n, m, phase) == (2, 1, 0): + return ( + qmode @ + (monoid >> annil) @ + qmode + ) + if (n, m, phase) == (1, 2, 0): + plus = create >> comonoid + bot = ( + (plus >> qmode @ plus @ qmode) @ + (qmode @ plus @ qmode) + ) + mid = qmode**2 @ BS.dagger() @ BS @ qmode**2 + fusion = ( + qmode @ plus.dagger() @ + qmode >> plus.dagger() + ) + return ( + bot >> mid >> (qmode**2 @ + fusion @ qmode**2) + ) + raise NotImplementedError(f"No translation of {self} in QPath.") + def dagger(self): + return type(self)( + len(self.cod), + len(self.dom), + -self.phase + ) # pylint: disable=invalid-name class X(Channel): @@ -623,7 +712,62 @@ def __init__(self, n_legs_in, n_legs_out, phase=0): qubit**n_legs_in, qubit**n_legs_out, ) + self.data = phase + self.phase = phase + + def lambdify(self, *symbols, **kwargs): + return lambda *xs: type(self)( + len(self.dom), + len(self.cod), + lambdify(symbols, self.phase, **kwargs)(*xs), + ) + def decomp(self): + n, m = len(self.dom), len(self.cod) + phase = self.phase + if (n, m) in ((1, 0), (0, 1)): + return self + box = ( + Id(0).tensor(*[H()] * n) >> Z(n, m, phase) >> Id(0).tensor(*[H()] * m) + ) + return box.decomp() + + def to_dual_rail(self): + """Convert to dual-rail encoding.""" + from optyx import ( + photonic, + classical + ) + from optyx.core import zw + + root2 = photonic.Scalar(2**0.5) + unit = photonic.Create(0) + counit = classical.Select(0) + create = photonic.Create(1) + annil = classical.Select(1) + BS = photonic.BS + n, m = len(self.dom), len(self.cod) + phase = 1 + self.phase if self.phase < 0 else self.phase + if (n, m, phase) == (0, 1, 0): + return create @ unit @ root2 + if (n, m, phase) == (0, 1, 0.5): + return unit @ create @ root2 + if (n, m, phase) == (1, 0, 0): + return annil @ counit @ root2 + if (n, m, phase) == (1, 0, 0.5): + return counit @ annil @ root2 + if (n, m, phase) == (1, 1, 0.25): + return BS.dagger() + if (n, m, phase) == (1, 1, -0.25): + return BS + raise NotImplementedError(f"No translation of {self} in QPath.") + + def dagger(self): + return type(self)( + len(self.cod), + len(self.dom), + -self.phase + ) # pylint: disable=invalid-name class H(Channel): @@ -640,6 +784,16 @@ def __init__(self): qubit, ) + def decomp(self): + return H() + + def to_dual_rail(self): + """Convert to dual-rail encoding.""" + from optyx import photonic + return photonic.HadamardBS() + + def dagger(self): + return self class Scalar(Channel): """ @@ -653,7 +807,18 @@ def __init__(self, value: float): qubit**0, qubit**0, ) + self.data = value + def decomp(self): + return Scalar(self.data) + + def to_dual_rail(self): + """Convert to dual-rail encoding.""" + from optyx import photonic + return photonic.Scalar(self.data) + + def dagger(self): + return type(self)(np.conj(self.data)) class BitFlipError(Channel): """ From 13b25c2a90ba0da64e7480e9a69e150087f8a537 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Fri, 5 Sep 2025 22:13:05 +0100 Subject: [PATCH 38/59] Fixing bugs with sums --- docs/notebooks/bosonic-vqe-2.ipynb | 379 +++++++++++++-------- docs/notebooks/optyx-vqe-experiment.ipynb | 384 ++++++++++++++++------ optyx/core/backends.py | 12 +- optyx/core/channel.py | 36 +- optyx/core/diagram.py | 40 +-- optyx/core/zx.py | 128 -------- optyx/qubits.py | 2 +- test/grad.py | 2 +- test/qpath.py | 20 +- test/test_channel.py | 7 +- test/test_qubit.py | 10 +- 11 files changed, 593 insertions(+), 427 deletions(-) diff --git a/docs/notebooks/bosonic-vqe-2.ipynb b/docs/notebooks/bosonic-vqe-2.ipynb index 2d28c183..3ff6d24e 100644 --- a/docs/notebooks/bosonic-vqe-2.ipynb +++ b/docs/notebooks/bosonic-vqe-2.ipynb @@ -17,7 +17,7 @@ " \n", " \n", " \n", - " 2025-09-05T11:56:11.751703\n", + " 2025-09-05T20:09:47.097250\n", " image/svg+xml\n", " \n", " \n", @@ -46,62 +46,62 @@ "L 223.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p661c0a7bc2)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd1650474ac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -878,7 +878,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -916,7 +916,7 @@ " \n", " \n", " \n", - " 2025-09-05T11:56:11.815619\n", + " 2025-09-05T20:09:47.853222\n", " image/svg+xml\n", " \n", " \n", @@ -945,87 +945,87 @@ "L 799.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p05f3bff2b7)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p3b4158f82d)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1674,9 +1674,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1717,7 +1717,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1770,29 +1770,7 @@ }, { "cell_type": "code", - "execution_count": 4, - "id": "68041095", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Create((1, 1, 1)) >> MZI(a_0_0, b_0_0) @ qmode >> qmode @ MZI(a_1_0, b_1_0) >> MZI(a_2_0, b_2_0) @ qmode >> qmode @ MZI(a_3_0, b_3_0) >> qmode @ qmode @ Select((1,)) >> Bosonic operator >> qmode @ qmode @ Select((1,)).dagger() >> qmode @ MZI(a_3_0, b_3_0) >> MZI(a_2_0, b_2_0) @ qmode >> qmode @ MZI(a_1_0, b_1_0) >> MZI(a_0_0, b_0_0) @ qmode >> Create((1, 1, 1)).dagger()\n", - "Create((1, 1, 1)) >> MZI(a_0_0, b_0_0) @ qmode >> qmode @ MZI(a_1_0, b_1_0) >> MZI(a_2_0, b_2_0) @ qmode >> qmode @ MZI(a_3_0, b_3_0) >> qmode @ qmode @ Select((1,)) >> Bosonic operator >> qmode @ qmode @ Select((1,)).dagger() >> qmode @ MZI(a_3_0, b_3_0) >> MZI(a_2_0, b_2_0) @ qmode >> qmode @ MZI(a_1_0, b_1_0) >> MZI(a_0_0, b_0_0) @ qmode >> Create((1, 1, 1)).dagger()\n", - "Create((1, 1, 1)) >> MZI(a_0_0, b_0_0) @ qmode >> qmode @ MZI(a_1_0, b_1_0) >> MZI(a_2_0, b_2_0) @ qmode >> qmode @ MZI(a_3_0, b_3_0) >> qmode @ qmode @ Select((1,)) >> Bosonic operator >> qmode @ qmode @ Select((1,)).dagger() >> qmode @ MZI(a_3_0, b_3_0) >> MZI(a_2_0, b_2_0) @ qmode >> qmode @ MZI(a_1_0, b_1_0) >> MZI(a_0_0, b_0_0) @ qmode >> Create((1, 1, 1)).dagger()\n", - "Create((1, 1, 1)) >> MZI(a_0_0, b_0_0) @ qmode >> qmode @ MZI(a_1_0, b_1_0) >> MZI(a_2_0, b_2_0) @ qmode >> qmode @ MZI(a_3_0, b_3_0) >> qmode @ qmode @ Select((1,)) >> Bosonic operator >> qmode @ qmode @ Select((1,)).dagger() >> qmode @ MZI(a_3_0, b_3_0) >> MZI(a_2_0, b_2_0) @ qmode >> qmode @ MZI(a_1_0, b_1_0) >> MZI(a_0_0, b_0_0) @ qmode >> Create((1, 1, 1)).dagger()\n" - ] - } - ], - "source": [ - "for i in expectation.terms:\n", - " print(i)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "f4e5462d-464d-4b09-8574-6867522b61ea", "metadata": {}, "outputs": [], @@ -1807,32 +1785,18 @@ "\n", "free_syms = list(expectation.free_symbols)\n", "\n", - "#f_exp = lambda xs: to_float(expectation.lambdify(*free_syms)(*xs).eval().array[0, 0])\n", - "\n", - "def f_exp(xs):\n", - " val = 0\n", - " for term in expectation.lambdify(*free_syms)(*xs).terms:\n", - " val += to_float(term.eval().tensor.array)\n", - " return val\n", - "\n", - "# def d_f_exp(xs):\n", - "# return [\n", - "# expectation.grad(s).lambdify(*free_syms)(*xs).eval().array[0, 0]\n", - "# for s in free_syms\n", - "# ]\n", + "f_exp = lambda xs: to_float(expectation.lambdify(*free_syms)(*xs).eval().tensor.array)\n", "\n", "def d_f_exp(xs):\n", - " grads = [expectation.grad(s) for s in free_syms]\n", - " vals = [0] * len(grads)\n", - " for i, g in enumerate(grads):\n", - " for term in g.lambdify(*free_syms)(*xs).terms:\n", - " vals[i] += to_float(term.eval().tensor.array)\n", - " return vals" + " return [\n", + " expectation.grad(s).lambdify(*free_syms)(*xs).eval().tensor.array\n", + " for s in free_syms\n", + " ]" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 7, "id": "24355282-4c9c-40b3-b643-461981f9475f", "metadata": {}, "outputs": [], @@ -1863,7 +1827,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 8, "id": "e96227b0-db8e-4871-8c12-b1d034a4bc86", "metadata": {}, "outputs": [ @@ -1871,14 +1835,7 @@ "name": "stderr", "output_type": "stream", "text": [ - " 0%| | 0/10 [00:00\n", " \n", " \n", - " 2025-09-05T11:59:44.101867\n", + " 2025-09-05T20:15:39.618171\n", " image/svg+xml\n", " \n", " \n", @@ -1938,12 +1905,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1979,7 +1946,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2018,7 +1985,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2052,7 +2019,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2097,7 +2064,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2151,7 +2118,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2183,12 +2150,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2220,7 +2187,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2236,7 +2203,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2252,7 +2219,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2267,7 +2234,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2282,7 +2249,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2331,7 +2298,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2354,17 +2321,151 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "346a4294", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "from optyx.photonic import BBS, Create, Scalar" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, + "id": "eea8a769", + "metadata": {}, + "outputs": [], + "source": [ + "#diagram = BBS(0.3) + BBS(0.9) + BBS(0.5)\n", + "#diagram.draw()\n", + "\n", + "diagram = Create(1) @ Scalar(0.34) + Create(2) @ Scalar(0.56) + Create(3) @ Scalar(0.12)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, "id": "5e2fd068", "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0. +0.j, 0.34+0.j, 0.56+0.j, 0.12+0.j])" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "diagram.eval().tensor.array" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "fa135207", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0. +0.j 0.34+0.j 0. +0.j 0. +0.j]\n", + "-----\n", + "[0. +0.j 0.34+0.j 0. +0.j 0. +0.j]\n", + "======\n", + "[0. +0.j 0. +0.j 0.56+0.j 0. +0.j]\n", + "-----\n", + "[0. +0.j 0. +0.j 0.56+0.j 0. +0.j]\n", + "======\n", + "[0. +0.j 0. +0.j 0. +0.j 0.12+0.j]\n", + "-----\n", + "[0. +0.j 0. +0.j 0. +0.j 0.12+0.j]\n", + "======\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "\n", + "for term in diagram.get_kraus().to_tensor():\n", + " print((term.to_quimb()^...).data)\n", + " print(\"-----\")\n", + " print(term.eval().array)\n", + " print(\"======\")\n", + " assert np.allclose((term.to_quimb()^...).data, term.eval().array)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f20a782f", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/discopy/matrix.py:161: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " self.array = np.array(array, dtype=self.dtype).reshape((dom, cod))\n" + ] + }, + { + "data": { + "text/plain": [ + "array([0, 0, 0, 0])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "diagram.get_kraus().to_tensor().eval().array" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "abf30abe", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor.Sum(terms=(tensor.Diagram(inside=(rigid.Layer(Dim(1), tensor.Box[complex128]('Create(1)', Dim(2), Dim(1), data=array([0.+0.j, 1.+0.j])).dagger(), Dim(1)), rigid.Layer(Dim(2), tensor.Box[complex128]('scalar', Dim(1), Dim(1), data=[(0.34+0j)]), Dim(1)), rigid.Layer(Dim(1), tensor.Box[int64]('ZBox(1, 1, mode)', Dim(2), Dim(2), data=array([[1, 0],\n", + " [0, 1]])), Dim(1)), rigid.Layer(Dim(1), tensor.Spider(1, 1, Dim(2)), Dim(1)), rigid.Layer(Dim(1), optyx.core.diagram.EmbeddingTensor('Embedding', Dim(2), Dim(4), data=array([[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],\n", + " [0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j]])), Dim(1))), dom=Dim(1), cod=Dim(4)), tensor.Diagram(inside=(rigid.Layer(Dim(1), tensor.Box[complex128]('Create((2,))', Dim(3), Dim(1), data=array([0.+0.j, 0.+0.j, 1.+0.j])).dagger(), Dim(1)), rigid.Layer(Dim(3), tensor.Box[complex128]('scalar', Dim(1), Dim(1), data=[(0.56+0j)]), Dim(1)), rigid.Layer(Dim(1), tensor.Box[int64]('ZBox(1, 1, mode)', Dim(3), Dim(3), data=array([[1, 0, 0],\n", + " [0, 1, 0],\n", + " [0, 0, 1]])), Dim(1)), rigid.Layer(Dim(1), tensor.Spider(1, 1, Dim(3)), Dim(1)), rigid.Layer(Dim(1), optyx.core.diagram.EmbeddingTensor('Embedding', Dim(3), Dim(4), data=array([[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],\n", + " [0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j],\n", + " [0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j]])), Dim(1))), dom=Dim(1), cod=Dim(4)), tensor.Diagram(inside=(rigid.Layer(Dim(1), tensor.Box[complex128]('Create((3,))', Dim(4), Dim(1), data=array([0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j])).dagger(), Dim(1)), rigid.Layer(Dim(4), tensor.Box[complex128]('scalar', Dim(1), Dim(1), data=[(0.12+0j)]), Dim(1)), rigid.Layer(Dim(1), tensor.Box[int64]('ZBox(1, 1, mode)', Dim(4), Dim(4), data=array([[1, 0, 0, 0],\n", + " [0, 1, 0, 0],\n", + " [0, 0, 1, 0],\n", + " [0, 0, 0, 1]])), Dim(1)), rigid.Layer(Dim(1), tensor.Spider(1, 1, Dim(4)), Dim(1)), rigid.Layer(Dim(1), optyx.core.diagram.EmbeddingTensor('Embedding', Dim(4), Dim(4), data=array([[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],\n", + " [0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j],\n", + " [0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],\n", + " [0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j]])), Dim(1))), dom=Dim(1), cod=Dim(4))))" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "diagram.get_kraus().to_tensor()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "554c80f7", + "metadata": {}, "outputs": [], "source": [] } diff --git a/docs/notebooks/optyx-vqe-experiment.ipynb b/docs/notebooks/optyx-vqe-experiment.ipynb index 6d1f9176..5e318c0d 100644 --- a/docs/notebooks/optyx-vqe-experiment.ipynb +++ b/docs/notebooks/optyx-vqe-experiment.ipynb @@ -97,74 +97,9 @@ "from optyx.core.backends import DiscopyBackend" ] }, - { - "cell_type": "code", - "execution_count": 6, - "id": "28b96946", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from optyx.qubits import Z\n", - "\n", - "Z(1, 1).dagger().draw()" - ] - }, { "cell_type": "code", "execution_count": 7, - "id": "26ece567", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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vWRLstPS0lzLBg4caAcGBtoHDhxwLXv22Wftpk2b2sePH3e7/9///ndbkv3pp5/aFSdO2Me2bLHXzZple3t52eOHDLEPLVpkH9uyxa44caLG/Q8aNMhu1aqVXVRU5Fr28ssv25LslStXuq37+eef25LsNWvW1MahoxHh4WIAHvG73/1OPXv2VEpKivLz87Vw4UKtWLFCf/nLX3TFFVe41luyZIliY2MVEBDgdv+3335b1113naKuuUb577+vkuxsXRsWpoTOnZW+aZPssjKVZGcr//33VZ6f73bfY8eOafXq1RoxYoQCAwNdy0eOHKmAgAC99dZbbutHR0crJCRES5cuNfCVQENGZAF4hGVZmjt3roqKinTffffp4YcfVkxMjO6//37XOuXl5frss8/Uo0cPt/tWVVVp69atio6KUsFHH8kuL5e+e+are9u22nvokIpLSyXbll1RoYIPP1RlSYnr/l9++aUqKioUExPjtl2Hw6GoqCht2bKl2rw9evTwyIVXqN+ILACP6dy5s1JSUrRo0SIdOXJEc+fOldcZz6Pu27dPpaWluuaaa9zud/ToUZ06dUotfHxkV1S43dYyOFiSdLCg4PSC70Jbunu3a53c3FxJUqtWrarN1KpVK3377bfVlrdp00Y7duy4oONE40VkAXhUaGioJOnyyy9XZGSk22353z3M27x5c7flpaWlkiSv48ddZ7Dfa+LrK0k6WVb2w0LbVsnu3bKrqtzu36RJk2rz+Pn5uW4/U/PmzVVaWqqSM86IgZ9DZAF4zP79+zVlyhRFRkZq//79mjZtWo3r2T8KadOmTSVJp06erLbuqfJySZKfw+G+jbIyVX33WlfX/Wt47evJkyddt9c0A1cX43wQWQAeM27cOEnS8uXLdeutt+rpp592e51rixYtJEkF3z/0+52QkBA1adJEhwoLq23z8HfLwn909num7x8m/v5h4zPl5ubq8ssvr7a8oKBA/v7+NQYYOBsiC8AjFi9erPT0dD311FO68sorNWvWLDkcDrcLn5xOp5o2bao9e/a43dfLy0tdunTRFz9aLkmbv/5aV7dsqYAfxdByOOT13cPDkZGR8vHx0eeff+62TllZmbKyshQVFVVtu3v27FFERMSFHi4aKSIL4JI7fvy4xo8fr+7du+uBBx6QdPo52aeeekorVqzQokWLJEm+vr6KiYmp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LVq0UEBAgIYNG6ZDhw797Laio6NlWZbr38CBA123hYaGauTIkZoyZYqR4zgbn0u6NwCAccOGDVNZWZnmz5+vNm3a6NChQ1qzZo3y8/M9PZokybZtVVZWysfHR88//7xGjRolL68fzvkefvhhvf/++1q0aJGCgoI0btw43XLLLT/7S0J8fLzeeecd1+dNmjRxu33UqFGKjo7W9OnTFRISUrsHdRacyQJAA1JYWKhPPvlEf//733XDDTfo6quv1vXXX6/HHntMQ4YMca3z+9//Xr/61a8kSbfddpvee+89SVJ+fr7uvPNOXXHFFfL391eXLl30//7f//vJfb7++uuKiYlRs2bNFB4eruHDh+vw4cOu2zMyMmRZlpYvX67o6Gg1adJE69at05EjR/Thhx8qKSnJtW5RUZHmzZunZ599Vn379lV0dLRee+01bdiwQRs3bvzJOXx9fRUeHu7617x5c7fbO3furMsvv1yLFy8+9y/oRSKyANCABAQEKCAgQEuWLNGpU6eq3V5VVaVBgwZp/fr1euqppyRJ48aNk7e3t6TTD9VGR0fr/fff17Zt2zRmzBjddddd+vTTT8+6z/Lycj311FP64osvtGTJEu3du1f33HNPtfUeffRRpaamKjs7W127dtW6devk7++viIgI1zqZmZkqLy9X//79Xcs6duwop9Opf//73z957JmZmWrZsqU6dOig++67r8Yz9+uvv16ffPLJT26nNvFwMQA0ID4+PkpLS9O9996rF198UT169FCfPn10xx13qGvXrvrggw/06aefKjs7W8XFxZJOX3jUo0cPSdIVV1yhlJQU1/YeeOABrVy5Um+99Zauv/76Gvc5evRo18dt2rTR888/r+uuu07FxcUKCAhw3fbkk0+6zp4l6f/+7//0i1/8wu2h4oMHD8rhcCg4ONhtH7/4xS908ODBnzz2J598Uv3791dOTo7+9Kc/adCgQfr3v//t+gVCki6//HJt2bLlJ7dTmziTBYAGZtiwYfr222+Vnp6ugQMHKiMjQz169FBaWpqysrJ05ZVXqn379jXet7KyUk899ZS6dOmikJAQBQQEaOXKldq3b99Z95eZmamkpCQ5nU41a9ZMffr0kaRq94mJiXH7vLS0VH5+fhd5tD/o06ePunTpoptvvlnvvfeePvvsM2VkZLit07RpU5WUlNTaPn8OkQWA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erVyc3MVEhKiFi1auB4mtizrUhweAFwwIotzkpeXp+3bt2vHjh3avn27tm/frgMHDujo0aM6evSoa70TJ05o2LBhkiSHw6EWLVqoTfs26vfbfpKkosIit+0GhQTJ0cShIwePuC1ft36dvsj8QpL0yCOP1DjTHXfcoZYtW+rKK69U586d1blzZ3Xq1EmdO3dWaGhorR07AFwoIgs35eXl+vTTT7V161ZXTHfs2KHDhw9Lknx8fNSuXTt17txZMTExatGihVauXKmMjAyNGzdOv/vd79SiRQuFhISoadOmsixLtm0r+0S2/Jr66cDeA2778/LyUvvI9tq2+Yd3cfKSlz756BMNGDBAOTk5+vLLL11nxUePHtXLL7+shQsX6uGHH9aJEye0d+9effjhh5o7d64qKiokSS1btnQFt3PnzuratatiY2Pl48OPPIBLx7J//PgdGp2CggKtWLFC7777rpYvX67CwkK3mJ55htiuXTs5HD88f7p48WLdcsstGjJkyE++rOZIxRENThwsSVqwZoHbbS8/87JmPD5Di9YvUpfoLgrxDtHRnKPq3LmzUlJSlJqa6rb+Lbfcoq+//lpbt251W15WVqbdu3e7/XKwfft27d69WxUVFQoODtagQYOUlJSkgQMHup7bRcMyZMgQSVJ6erqHJwGIbKO1a9cuvfvuu3r33Xe1bt06VVZWqnv37rrpppt00003KSoqyi2mNcnNzVXnzp117NgxPfvsswoJCalxvbZt2yrmlzF6YtoTmjllpjbs36CAwADX7cXHi3VL7C06UXxCyQ8lq6VfSz038zlVVlYqKytLYWFhrnXLy8sVHh6uP/zhD3rqqafO6VjLysqUlZWl9957T++++66ysrLk7e2thIQE3XTTTUpKSnK7Ehr1G5FFnWKj0aisrLTfeustu2vXrrYku0mTJvbgwYPtOXPm2Pv37z/v7X300Ue2pJ/9d/fdd9u2bdt7c/faPj4+9rRXp9k7T+50+5fxdYY98JaBdmBgoB0QEGDfdNNN9u7du6vtc/ny5bakGm87V/v27bPnzJljDx482G7SpIktye7atav91ltv2ZWVlRe8XdQNSUlJdlJSkqfHAGzbtm3OZBuBqqoqvfPOO/rzn/+s7du368Ybb9Qf/vAH9e/fX5dddtklnWXU6FHK3pWt19e87nrXJy95Kdg7WMHewfK1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9ElQuco1f9V8t/Vv7XWrJOmdde/oSt8r1dSrqSRpwIABysnJ0ddff+22/i233KKcnBx98cUXFzTf/v379d577+ndd9/Vhx9+qFOnTqlbt26aPHkyZ66o9/jpBTzEy8tLt956q7KysrRr1y799a9/VWlpqR544AE5nU51795dTzzxhDZt2qSysrIL2kdJSYluu+02eXt7a+HCha7AlpSV6PPPPldE9wi39auqqvTVl18pskekqlSlA+UHVG6XS5Kuv/565eTk6Pjx4273iY6O1rZt23Ts2LFzmqmsrEybNm3SE088oaioKDmdTj3wwAM6efKk/vrXv2rXrl3KysrSrbfeSmBR7/GcLFAHtGvXTn/84x/1xz/+UQUFBVq5cqXeffddvfDCC/rLX/4ib29vtWvXTp07d1bnzp3VqVMnde7cWe3bt5fD4Tjrdh944AHt2LFD8+fPV/v27V3Lt+3ZppOlJ3Vla/c/bl50tEhlp8oUFh4mSapSlQorCxXmE6ZWrVpJkr799lt16NDBdZ82bdqoqqpKO3fu1PXXX+9aXlZWpl27dmn79u3asWOHtm/fru3bt2v37t2qrKxU8+bNNWjQID366KMaOHCggoODa+NLCdQpRBaoY5o3b6477rhDd9xxhyoqKvTpp5/qiy++cIXqxRdf1OHDhyXJLb7XXHONQkJCFBISohYtWmjLli169dVXdcstt2jYsGGybVuWZcm2be07sk+SFBQc5Lbvk6UnJUmOJj+Eu7CyUKHeofLz85MkHT16VPv371d+fr6OHj3qegnPP/7xDy1atEh79uxxi6kk/eIXv1CnTp3Uv39/Pfjgg+ratauuv/56+fjwvyA0bPyEA3WYj4+P4uPjq12BnJeXpx07dridIW7dulVHjx5VQUGBqqqqXOv+61//0r/+9S85HA6FhISobYe2evAvD0qSfnxJhl/T0yEtO/XDw9NVqlLCDQn6csuXknTWq6H/9a9/KTw8XFdeeaUrpt+fcZ95RTLQmBBZoB4KDQ1V79691bt372q3lZaW6pe//KV27typV155RWFhYTp69KjrzLO0rFTBIcGSpKLCIrf7BoUEydHEoSMHj7gt79Wzl7xtb3388cd65ZVXdMUVV7jOmD/88EONGTNGa9as0XXXXWfsmIH6iMgCDcwjjzyirVu36rnnntNdd91V7XbbtpV9Ilt+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at26tSzL0qxZs6ptf86cOeratasCAwMVGBiouLg4LV++3G2dxMREWZbl9m/s2LHVtpWWlqauXbsqLi7OdfznM++//vUvxcTEKDg42LXO66+/7rbOj+f4/t/06dNd6wwZMkROp1N+fn5q1aqV7rrrLn377bdu29m6dasSEhLk5+enq666StOmTXO7vby8XE8++aTatm0rPz8/devWTStWrHBbZ+rUqdXm6Nixo9s6P/e9Dg0N1ciRIzVlypRqX8+fQmQBaNiwYSoqKlL37t21a9cupaenKzExUfn5+Z4eTZJk27YqKiokSc8//7xGjRolL68f/vdVUlKigQMH6k9/+tN5b/uzzz7T3Llz1bVr12q3nc92H3nkEV1++eXVlm/YsEFdu3bVO++8o61bt2rUqFEaOXKk3nvvPbf9tGnTRqmpqQoPD69x+1deeaVSU1OVmZmpzz//XH379tXQoUO1fft2t/Xuvfde5ebmuv79OErPPvusJk+erEcffVRvvfWWJLlie67zhoSEaPLkyfr3v//tWmfUqFFauXKla50zZ8jNzdWrr74qy7I0bNgw1zo33HCD3nrrLX311Vd65513lJOTo//6r/9y3X7s2DHdeOONuvrqq5WZmanp06dr6tSpeumll1zrPP7445o7d67+53/+Rzt27NDYsWP1m9/8Rlu2bHE77s6dO7vNs27dOrfbz+V7PWrUKL3xxhs6evToWdepxka9k5SUZCclJXl6DDQQBQUFtiQ7Li7urD9XBQUF9pgxY+yWLVvaTZo0sTt37my/++67tm3bdl5enn3HHXfYl19+ud20aVM7MjLSfvPNN93u36dPH/vBBx90ff6///u/dnR0tB0QEGD/4he/sO+880770KFDrts/+ugjW5K9bNkyu0ePHravr6/90Ucf2YcPH7Yty7K3bdtW45zf36+goOCcjv348eN2u3bt7NWrV1eb8ae2m5mZaUuyMzMzbdu27WXLltkdO3a0t2/fbkuyt2zZ8pP7HTx4sD1q1Kgab7v66qvtmTNnntP8zZs3t1955RXX5z91DLZt20ePHrWbNm1qf/DBBzUex4XM+73u3bvbjz/++FlvHzp0qN23b9+f3MbSpUtty7LssrIy27Zt+x//+IfdvHlz+9SpU651Jk2aZHfo0MH1eatWrezZs2e7beeWW26xf/vb37o+nzJlit2tW7ef3Pf3fu5n6JprrnH7mv8czmSBRi4gIEABAQE6ePCgKisrq91eVVWlQYMGaf369VqwYIF27Nih1NRUeXt7S5JOnjyp6Ohovf/++9q2bZvGjBmju+66S59++ulZ91leXq6nnnpKX3zxhZYsWaK9e/fqnnvuqbbeo48+qtTUVGVnZ6tr165at26d/P39FRERUSvHfv/99+vXv/61+vfvf8HbOHTokO699169/vrr8vf3P6f7FBUVKSQk5IL3WVlZqYULF+rEiRNuZ6GS9MYbbyg0NFSRkZF67LHHVFJS4rpt9erVqqqq0jfffKOIiAgNGjRIknTw4MELnte2ba1Zs0ZfffWVevfuXeM6hw4d0vvvv6/k5OSz7uPo0aN64403FB8fL19fX0nSv//9b/Xu3VsOh8O13oABA/TVV1+poKBA0umH6f38/Ny21bRp02pnqrt379bll1+uNm3a6Le//a327dv3k8d8Ntdff70++eSTc7/DOecYdQZnsqhtb7/9tu3r62t7eXnZ8fHx9mOPPWZ/8cUXtm3b9sqVK20vLy/7q6++Ouft/frXv7YnTJjg+vznzrA+++wzW5J9/Phx27Z/OJtYsmSJ23ozZ86027Rpc9btnM+Z7P/7f//PjoyMtEtLS392xrOdyX7++ef2wIED7aeeesq2bdves2fPz57J/vOf/7QdDsdZz8Z/6kx269at9mWXXWZ7e3vbQUFB9vvvv+92+9y5c+0VK1bYW7dutRcsWGBfccUV9m9+8xvX7X/7299sX19fu0OHDvaKFSvstLQ0W5J99dVXu50tnsu8hYWF9mWXXWb7+PjYTZo0sefNm3fWY/773/9uN2/e3PW1PtMjjzxi+/v725LsX/7yl3ZeXp7rtl/96lf2mDFj3Nb//tGCHTt22LZt23feeafdqVMne9euXXZlZaW9atUqu2nTprbD4XDdZ9myZfZbb71lf/HFF/aKFSvsuLg42+l02seOHas2z8/9DD388MN2YmLiWY/1xziTBaBhw4bpV7/6la6//noNHDhQGRkZ6tGjh9LS0pSVlaUrr7xS7du3r/G+lZWVeuqpp9SlSxeFhIQoICBAK1eu/MkzhczMTCUlJcnpdKpZs2bq06ePJFW7T0xMjNvnpaWl1c5aLsT+/fv14IMP6o033rio7S1cuFDHjx/XY489dk7rf/TRRxo1apRefvllde7c+bz316FDB2VlZWnTpk267777dPfdd2vHjh2u28eMGaMBAwaoS5cu+u1vf6v//d//1eLFi5WTkyPp9KMS5eXlev75513rSae/Hh999NF5zdusWTNlZWXps88+09NPP60//vGPysjIqHHuV199Vb/97W9r/FpPnDhRW7Zs0apVq+Tt7a2RI0fKtu1z/po899xzateunTp27CiHw6Fx48ZVe85+0KBBuvXWW9W1a1cNGDBAy5YtU2Fhoes56fPRtGlTt0cHfg6RBSBJ8vb2VlhYmJ544glt2LBB99xzj6ZMmaKmTZv+5P2mT5+u5557TpMmTdJHH32krKwsDRgwQGVlZTWuf+LECQ0YMECBgYF644039Nlnn2nx4sWSVO0+l112mdvnoaGhrocJL0ZmZqYOHz6sHj16yMfHRz4+Plq7dq2ef/55+fj41PiweU0+++wz/fvf/1aTJk3k4+Oja6+9VtLpXw7uvvtut3XXrl2rpKQkzZw5UyNHjryguR0Oh6699lpFR0frb3/7m7p166bnnnvurOvHxsZKkr7++mtJUqtWrSRJnTp1clsvODi42i84Pzevl5eXrr32WkVFRWnChAn6r//6L/3tb3+rtt4nn3yir776Sr/73e9qnDE0NFTt27fXr371Ky1cuFDLli3Txo0bJUnh4eE6dOiQ2/rff/79BWJhYWFasmSJTpw4of/7v//Tzp07FRAQoDZt2pz16xIcHKz27du7vi7n4+jRowoLCzvn9YksgBp16tRJJ06cUNeuXXXgwAHt2rWrxvXWr1+voUOHasSIEerWrZvatGlz1nUlaefOncrPz1dqaqoSEhLUsWNHHT58+Jxm6t69uw4ePHjRoe3Xr5++/PJLZWVluf7FxMTot7/9rbKyslzPN/+ciRMn6osvvnBtY9myZZKkf/7zn3r66add62VkZOjXv/61/v73v2vMmDEXNfuZqqqqdOrUqbPe/v1Lib6Pa8+ePSVJX331ldt6hYWFuvrqqy9q3rPNMm/ePEVHR6tbt27ntA1Jru3ExcXp448/Vnl5uWud1atXq0OHDmrevLnbff38/HTFFVeooqJC77zzjoYOHXrW/RQXFysnJ8f1dTkf27ZtU/fu3c95fZ/z3gOABiU/P1+33nqrCgsLFRgYqD179ujzzz/XtGnTNHToUPXp00e9e/fWsGHD9Oyzz+raa6/Vzp07ZVmWBg4cqHbt2untt9/Whg0b1Lx5cz377LM6dOhQtbOl7zmdTjkcDv3P//yPxo4dq23btumpp546p1m7d++u0NBQrV+/XjfddJNr+cGDB3Xw4EHXmcmXX36pZs2ayel0ui7Y6devn37zm99o3LhxatasmSIjI922fdlll6lFixZuy8+23aKiIkmn43Xm+gEBAZKktm3b6sorr5R0+iHXm266SQ8++KCGDRvmusjI4XC4ZisrK3M97FtWVqZvvvlGWVlZCggIcJ0dP/bYYxo0aJCcTqeOHz+uN998UxkZGa6XzeTk5OjNN9/U4MGD1aJFC23dulUPP/ywevfu7Xp5Uvv27TV06FA9+OCDeumll1xvrNC6dWvdcMMN5zzv3/72N8XExKht27Y6deqUli1bptdff11z5sxx+5oeO3ZMixYt0owZM6p9Lzdt2qTPPvtMvXr1UvPmzZWTk6MnnnhCbdu2dV3MNXz4cP35z39WcnKyJk2apG3btum5557TzJkz3bbzzTffKCoqSt98842mTp2qqqoqPfLII651UlJSlJSUpKuvvlrffvutpkyZIm9vb915553n9TNUUlKizMxM/fWvf612PGd1zs/eos7gwifUppMnT9qPPvqoHRQUZPv4+Nj+/v52hw4d7Mcff9wuKSmxbdu28/Pz7VGjRtktWrSw/fz87MjISPu9995z3TZ06FA7ICDAbtmypf3444/bI0eOtIcOHerax48vKnrzzTft1q1b202aNLHj4uLs9PR0twuGfurik0ceecS+44473JZNmTLFllTt32uvveZa5+qrr7anTJly1q9DTRc+nW273y//8Utfarrw6e67765xG3369Kl2v59aZ/To0fbVV19tOxwOOywszO7Xr5+9atUq1+379u2ze/fubYeEhNhNmjSxr732WnvixIl2UVGR24xFRUX26NGj7eDgYDsoKMiW5HYB1bnMO3nyZPvaa6+1/fz87ObNm9txcXH2woULq31N586dazdt2tQuLCysdtvWrVvtG264wTVv69at7bFjx9oHDhxwW++LL76we/XqZTdp0sS+4oor7NTUVLfbMzIy7IiICLtJkyZ2ixYt7Lvuusv+5ptv3Na5/fbb7VatWtkOh8O+4oor7Ntvv93++uuv3dY5l5+hN9980+3lQ+fCsu3zeIYZdcKQIUMk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GfL08tT+Pfsdjufi4qKWES21deMv7+LkIhd9tfIr9e7dW5mZmdqyZYv9qvjo0aN68803NX/+fD399NM6ceKE9uzZoy+++EKzZ89WSUmJJKlRo0b24IaHh6tdu3aKiYmRmxv/VADgctms8x+HxCXLzc3Vp59+qo8++khLly5VXl6eQ0zPvUJs0aKFPDx+ef504cKFuuuuu9SvX7+LvqzmSMkR9Y3vK0mat2Kew7o3X3lTU56fogVrFqhtVFsFuAboaOZRhYeHKzExUUlJSQ7j77rrLv3www/avHmzw/KioiLt2rXL4ZeDbdu2adeuXSopKZG/v7/69OmjhIQE3X777fbndlG79OvXT5KUkpLi5JkAtQeRvUw7d+7URx99pI8++kirV69WaWmpOnTooDvuuEN33HGHIiMjHWJakaysLIWHh+vYsWOaOnWqAgICKhwXGhqq6N9E64VJL2ja+Glau2+tfHx97OsLjhforpi7dKLghIY+NVSNPBvp1WmvqrS0VOnp6QoKCrKPLS4uVnBwsJ588klNnDjxks61qKhI6enp+vjjj/XRRx8pPT1drq6u6tq1q+644w4lJCQ43AmNmo3IAgZY+FWlpaXW+++/b7Vr186SZNWrV8/q27evNWvWLGvfvn2Xvb+VK1dakn7145FHHrEsy7L2ZO2x3NzcrElvT7J2nNrh8JH6Q6p1+123W76+vpaPj491xx13WLt27Sp3zKVLl1qSKlx3qfbu3WvNmjXL6tu3r1WvXj1LktWuXTvr/ffft0pLS694v6geEhISrISEBGdPA6hVuJK9iLKyMn344Yd68cUXtW3bNt1222168skn1atXL11zzTVVOpfBQwYrY2eG3lnxjv1dn1zkIn9Xf/m7+svd5n7R7e+8807ZbDYtXLiwUuZz4sQJff755/rXv/6l5cuXKzw8XOPHj9eAAQPk4sIrw2oirmSBysf/DStQVlamBQsWqF27drr33nvVpEkTrVmzRsuWLVP//v2rPLCS9OKEF5X+bboObTikUI9QhXqE6iaPmxTkFvSrgc3IyNDHH398yQ8TX4prrrlG/fv317Jly7RmzRo1adJE9957r9q1a6cFCxaorKzs13cCALUckT3P9u3bFRkZWS6ucXFxTp1XSEiITp06pS5dusjN5iY3m9slv941LCxMJSUlioiIMDK3uLi4crGNjIzU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Tweo1Ygsqg0XFxctXLhQjzzyiAYPHqyxY8eqtLTU2dOqNUpLSzV27FgNGTJEjz76qBYuXMjDxIBhbs6eAHAuDw8PvfHGGwoPD9eYMWO0Y8cOvfvuu9wMdZWOHTumhx56SEuWLNH06dM1atQo2Ww2Z08LqPX4NRbVjs1m01NPPaWPP/5YX375pTp37qy1a9c6e1oO9u3bJ09PT61Zs+ayt92+fbvc3Ny0detWAzMrb+3atYqLi9OXX36pTz75RKNHjyawQBUhsqi2+vTpo6+//lo2m02dO3dW7969jcXWZrP96seECRPs41966SXFxMSoc+fODvv56aefdO+998rf31++vr7q37+/fvzxR4cxbdq00W9/+1v95S9/MXIuZ61du1a9e/dW586d5eLionXr1vEHAIAqxsPFqNbatGmj9PR0ffjhh3rxxRfVuXNn3XbbbRo/fnylvkPRO++8c8F1EyZMUGZmpmJiYiRJR44c0dy5czV37lxZlqVSnXne+GTBSd1yyy3Kz8/Xn//8Z7m7u2vatGnq3r270tPT1bBhQ/s+hw8frr59+yozM1OhoaGVdh7Smbi++OKLWr58ucLDw/X+++9rwIABPP8KOINVhyQkJFgJCQnOngauUGlpqfX+++9b4eHhliTrtttusxYuXGgVFBQYO+abb75pSbJGjhxpXzZ16lTLy8vL+jH3R2vnqZ3WjlM7rB2ndlhj/zbWkmStXb/WPjYjI8NydXW1/vSnPznst6ioyGrQoIH1wgsvVMo8CwoKrIULF1q33XabJckKDw+33n//fau0tLRS9g/gyvCOT6hxysrK9OGHH+pvf/ubvvvuO9WrV089evRQQkKC7rjjDl1//fWVcpxt27bp5ptvVuvWrfX111+rXr16kqSu3buqWMWau3yuw/h7utwjSfpw9Ydq6t5UXi5ekqTevXsrMzNTP/zwg8P4u+66S5mZmfruu++uaH779u3Txx9/rI8++khffPGFTp8+rfbt22vcuHFcuQLVBP8VosZxcXHRPffco/T0dO3cuVMvv/yyTp48qZEjRyokJEQdOnTQCy+8oPXr16uoqOiKjlFYWKh7771Xrq6umj9/vj2whUWF+nbDtwrrEOYwvqysTN9v+V4RHSNUpjLtL96vYqtYktSpUydlZmbq+PHjDttERUVp69atOnbs2CXNqaioSOvXr9cL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SiRJr732mgYPHiwXl1/+sy8sLNTtt9+uP//5z5e97w0bNmj27Nlq165duXWXs99nnnlG1113Xbnla9euVbt27fThhx9q8+bNGjx4sAYNGqSPP/7Y4TjNmzdXUlKSgoODK9x/06ZNlZSUpLS0NH377bfq0aOH+vfvr23btjmMe/zxx5WVlWX/OD9KU6dO1bhx4/Tcc8/p/ffflyR7bC91vgEBARo3bpy+/vpr+5jBgwdr2bJl9jHnziErK0tvv/22bDabBgwYYB9zyy236P3339f333+vDz/8UJmZmbr77rvt648dO6bbbrtNN9xwg9LS0jR58mRNmDBBb7zxhn3M888/r9mzZ+uf//yntm/fruHDh+t3v/udNm3a5HDe4eHhDvNZvXq1w/pL+VkPHjxY7777ro4ePXrBMbWWVYckJCRYCQkJzp4Gaonc3FxLkhUbG3vBf1e5ubnWsGHDrEaNGln16tWzwsPDrY8++siyLMvKzs627r//fuu6666zvLy8rIiICOu9995z2L579+7W6NGj7V//3//9nxUVFWX5+PhY1157rfXAAw9Yhw4dsq9fuXKlJclasmSJ1bFjR8vd3d1auXKldfjwYctms1lbt26tcJ5nt8vNzb2kcz9+/LjVokUL67PPPis3x4vtNy0tzZJkpaWlWZZlWUuWLLFat25tbdu2zZJkbdq06aLH7du3rzV48OAK191www3WtGnTLmn+DRo0sN566y371xc7B8uyrKNHj1peXl7W559/XuF5XMl8z+rQoYP1/PPPX3B9//79rR49elx0H4sXL7ZsNptVVFRkWZZl/etf/7IaNGhgnT592j7m2WeftVq1amX/unHjxtaMGTMc9nPXXXdZDz30kP3r8ePHW+3bt7/osc/6tX9DN954o8P3vK7gSha4Qj4+PvLx8dHBgwdVWlpabn1ZWZn69OmjNWvWaN68edq+fbuSkpLk6uoqSTp16pSioqL0ySefaOvWrRo2bJgefvhhffPNNxc8ZnFxsSZOnKjvvvtOixYt0p49e/Too4+WG/fcc88pKSlJGRkZateunVavXi1vb2+FhYVVyrn/4Q9/0G9/+1v16tXrivdx6NAhPf7443rnnXfk7e19Sdvk5+crICDgio9ZWlqq+fPn68SJEw5XoZL07rvvKjAwUBEREfrTn/6kwsJC+7rPPvtMZWVl+umnnxQWFqY+ffpIkg4ePHjF87UsSytWrND333+vbt26VTjm0KFD+uSTTzR06NALHuPo0aN69913FRcXJ3d3d0nS119/rW7dusnDw8M+rnfv3vr++++Vm5sr6czD9J6eng778vLyKnelumvXLl133XVq3ry5HnroIe3du/ei53whnTp10ldffXVF29Zozq58VeJKFpXtgw8+sNzd3S0XFxcrLi7O+tOf/mR99913lmVZ1rJlyywXFxfr+++/v+T9/fa3v7XGjBlj//rXrrA2bNhgSbKOHz9uWdYvVxOLFi1yGDdt2jSrefPmF9zP5VzJ/r//9/+siIgI6+TJk786xwtdyX777bfW7bffbk2cONGyLMvavXv3r17J/uc//7E8PDwueDV+sSvZzZs3W9dcc43l6upq+fn5WZ988onD+tmzZ1uffvqptXnzZmvevHlWkyZNrN/97nf29X//+98td3d3q1WrVtann35qJScnW5KsG264weFq8VLmm5eXZ11zzTWWm5ubVa9ePWvOnDkXPOd//OMfVoMGDezf63M988wzlre3tyXJ+s1vfmNlZ2fb1916663WsGHDHMaffbRg+/btlmVZ1gMPPGC1adPG2rlzp1VaWmotX77c8vLysjw8POzbLFmyxHr//fet7777zvr000+t2NhYKyQkxDp27Fi5+fzav6Gnn37aio+Pv+C51lZcyQJXYcCAAbr11lvVqVMn3X777UpNTVXHjh2VnJys9PR0NW3aVC1btqxw29LSUk2cOFFt27ZVQECAfHx8tGzZsoteKaSlpSkhIUEhISGqX7++unfvLknltomOjnb4+uTJk+WuWq7Evn37NHr0aL377rtXtb/58+fr+PHj+tOf/nRJ41euXKnBgwfrzTffVHh4+GUfr1WrVkpPT9f69ev1xBNP6JFHHtH27dvt64cNG6bevXurbdu2euihh/R///d/WrhwoTIzMyWdeVSiuLhYr732mn2cdOb7sXLlysuab/369ZWenq4NGzbob3/7m/74xz8qNTW1wnm//fbbeuihhyr8Xo8dO1abNm3S8uXL5erqqkGDBsmyrEv+nrz66qtq0aKFWrduLQ8PD40YMaLcc/Z9+vTRPffco3bt2ql3795asmSJ8vLy7M9JXw4vLy+HRwfqCiILXCVXV1cFBQXphRde0Nq1a/Xoo49q/Pjx8vLyuuh2kydP1quvvqpnn31WK1euVHp6unr37q2ioqIKx584cUK9e/eWr6+v3n33XW3YsEELFy6UpHLbXHPNNQ5fBwYG2h8mvBppaWk6fPiwOnbsKDc3N7m5uWnVqlV67bXX5ObmVuHD5hXZsGGDvv76a9WrV09ubm666aabJJ355eCRRx5xGLtq1SolJCRo2rRpGjRo0BXN28PDQzfddJOioqL097//Xe3bt9err756wfExMTGSpB9++EGS1LhxY0lSmzZtHMb5+/uX+wXn1+br4uKim266SZGRkRozZozuvvtu/f3vfy837quvvtL333+vxx57rMI5BgYGqmXLlrr11ls1f/58LVmyROvWrZMkBQcH69ChQw7jz3599gaxoKAgLVq0SCdOnND//vc/7dixQz4+PmrevPkFvy/+/v5q2bKl/ftyOY4ePaqgoKDL3q6mI7JAJWvTpo1OnDihdu3aaf/+/dq5c2eF49asWaP+/ftr4MCBat++vZo3b37BsZK0Y8cO5eTkKCkpSV27dlXr1q11+PDhS5pThw4ddPDgwasObc+ePbVlyxalp6fbP6Kjo/XQQw8pPT3d/nzzrxk7dqy+++47+z6WLFkiSfrPf/6jv/3tb/Zxqamp+u1vf6t//OMfGjZs2FXN/VxlZWU6ffr0BdeffSnR2bh27txZkvT99987jMvLy9MNN9xwVfO90FzmzJmjqKgotW/f/pL2Icm+n9jYWH355ZcqLi62j/nss8/UqlUrNWjQwGFbT09PNWnSRCUlJfrwww/Vv3//Cx6noKBAmZmZ9u/L5di6das6dOhw2dvVdG7OngBQU+Xk5Oiee+5RXl6efH19tXv3bn377beaNGmS+vfvr+7du6tbt24aMGCApk6dqptuukk7duyQzWbT7bffrhYtWuiDDz7Q2rVr1aBBA02dOlWHDh0qd7V0VkhIiDw8PPTPf/5Tw4cP19atWzVx4sRLmmuHDh0UGBioNWvW6I477rAvP3jwoA4ePGi/MtmyZYvq16+vkJAQ+w07PXv21O9+9zuNGDFC9evXV0REhMO+r7nmGjVs2NBh+YX2m5+fL+lMvM4d7+PjI0kKDQ1V06ZNJZ15yPWOO+7Q6NGjNWDAAPtNRh4eHva5FRUV2R/2LSoq0k8//aT09HT5+PjYr47/9Kc/qU+fPgoJCdHx48f13nvvKTU11f6ymczMTL333nvq27evGjZsqM2bN+vpp59Wt27d7C9Patmypfr376/Ro0frjTfesL+xQrNmzXTLLbdc8nz//ve/Kzo6WqGhoTp9+rSWLFmid955R7NmzXL4nh47dkwLFizQlClTyv0s169frw0bNqhLly5q0KCBMjMz9cILLyg0NNR+M9eDDz6oF198UUOHDtWzzz6rrVu36tVXX9W0adMc9vPTTz8pMjJSP/30kyZMmKCysjI988wz9jGJiYlKSEjQDTfcoAMHDmj8+PFydXXVAw88cFn/hgoLC5WWlqaXX3653PnUes5+UrgqceMTKtOpU6es5557zvLz87Pc3Nwsb29vq1WrVtbzzz9vFRYWWpZlWTk5OdbgwYOthg0bWp6enlZERIT18ccf29f179/f8vHxsRo1amQ9//zz1qBBg6z+/fvbj3H+TUXvvfee1axZM6tevXpWbGyslZKS4nDD0MVuPnnmmWes+++/32HZ+PHjLUnlPv7973/bx9xwww3W+PHjL/h9qOjGpwvt9+zy81/6UtGNT4888kiF++jevXu57S42ZsiQIdYNN9xgeXh4WEFBQVbPnj2t5cuX29fv3bvX6tatmxUQEGDVq1fPuummm6yxY8da+fn5DnPMz8+3hgwZYvn7+1t+fn6WJIcbqC5lvuPGjbNuuukmy9PT02rQoIEVGxtrzZ8/v9z3dPbs2ZaXl5eVl5dXbt3mzZutW265xT7fZs2aWcOHD7f279/vMO67776zunTpYtWrV89q0qSJlZSU5LA+NTXVCgsLs+rVq2c1bNjQevjhh62ffvrJYcx9991nNW7c2PLw8LCaNGli3XfffdYPP/zgMOZS/g299957Di8fqktslnUZz5TXcP369ZN05p1vgMpSU/5dHTx4UOHh4dq4caPDQ5xVaePGjYqKilJaWpo6duzolDlUhtpyHlXlN7/5jUaNGqUHH3zQ2VOpcjwnC9QRwcHBmjNnzhW/zhG4EtnZ2brrrrscHmKuS3hOFqhD7rzzTmdPAXVMYGCgw/O8dQ1XsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAM4Y+2A6hyGRkZzp7CVanp80fVIbIAqkxgYKC8vb01cOBAZ0/lqnl7eyswMNDZ00A1R2QBVJmQkBBlZGQoOzvb2VO5aoGBgQoJCXH2NFDNEVkAVSokJIQ4oc7gxicAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILHAB+/btk6enp9asWVOlx3399dcVEhKi06dPV+lxAVQ+Ios6w2az/erHhAkT7ONfeuklxcTEqHPnzpVy/P/85z8aOHCgWrRoIZvNpvj4+ArHPfrooyoqKtLs2bMr5bgAnMfN2RMAqso777xzwXUTJkxQZmamYmJiJElHjhzR3LlzNXfu3Ivu07Is1fevb//cZrNdcOysWbOUlpamm2++WTk5ORcc5+npqUceeURTp07VyJEjL7pPANUbkUWdMXDgwAqXv/XWW8rMzNTIkSPVp08fSdK8efPk5uamhISECrcptoqVV5qnvNI8/eXNv0iSfij6Qf6u/vJ39Ze7zb3cNu+8846aNGkiFxcXRUREXHSu9957ryZNmqSVK1eqR48el3OaAKoRHi5GnbZt2zaNGjVKHTp00OTJk+3LFy1apJiYGPn4+JTb5mTZSe0p2qOjpUdVpjJJ0pa0LRp8x2C1DG6p+t711ezGZhoyZIjDdtdff71cXC7tP7moqCgFBARo8eLFV3F2AJyNK1nUWYWFhbr33nvl6uqq+fPnq169epKk4uJibdiwQU888US5bYqtYu0v3m+PqyTlHM7RY3c8pgaBDfR44uPy9fPVgf8d0MqUlVc1v44dO1b5TVcAKheRRZ01cuRIbd++XXPnzlXLli3ty/fu3auTJ0/qxhtvLLdNXmmeQ2AladO6TcrPzddbH7+ltlFt7ctf/OuLVzW/5s2bX/R5ZADVHw8Xo05677339Pbbb+vhhx/WoEGDHNadvSmpQYMGDssty1JeaV65fdX3O3PjU+qSVBUXF9uX55XmybKsK55jgwYNdPLkSRUWFl7xPgA4F5FFnbNr1y4NHz5cLVu21L/+9a8Ljjs/kPkF+Tp08JCOHDyiIweP6OiRo5KkTt066bbf3aaZf5up2CaxevLuJ/Xh3A916vQplar0iud59vjcXQzUXEQWdcrp06d13333qaioSPPnz6/wxqaGDRtKknJzcx2WT31lqro262r/uLvz3ZLORPC1//ea5q+ar4eGP6RDBw5p3O/HaUDsABUUFFzxXHNzc+Xt7S0vL68r3gcA5+I5WdQpiYmJ2rRpk1599VV16NChwjEhISHy8vLS7t27HZY/MugRNY9pLktnrjA9vTwd1kfGRCoyJlJPv/S0Ppr/kcY+OlYL5i/Q448/fkVz3b17t8LCwq5oWwDVA5FFnbFw4ULNmDFD/fr106hRoy44zt3dXdHR0fr2228dloeGhsr3Bl8dLT3qsDw/N1++/r4OD+uGtT8Tx6Kioiue78aNG/XQQw9d8fYAnI/Iok7IysrS0KFD5erqqp49e2revHkVjgsNDVVsbKz69++vcePG6dixY/L19bWv93f1L3eH8aJ5i/Te7Pd0a/9bdf2N1+tEwQkteHuBfH191bdvX/u4L7/8Ul9++aWkM+8odeLECf31r3+VJHXr1k3dunWzj01LS9PRo0fVv3//Sv0+AKhaRBZ1wvfff29/jnX06NEXHPfII48oNjZWDz/8sJ577jmlpKQ4vFOUu81dTd2bOrxW9uauN2vzhs1a8v4SZR/OVn2/+up0cydNfG+iw8uAvvjiC734ouPLel544QVJ0vjx4x0iu2DBAoWEhPBuT0ANZ7Ou5jUGNUy/fv0kSSkpKU6eCWqCoUOHaufOnfrqq6/KrTv3bRXPxtZFLhd9W8VLdfr0aTVr1kzPPffcRX8hAFD9cSULXMD48ePVsmVLrVmzptxf4nG3uSvILUiBroEa+MiZK915c+dVystt/v3vf8vd3V3Dhw+/6n0BcC4iC1xASEiITp06ddExNptNx/OO2z+vDMOHDyewQC3B62QBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyQA2wZ88e2Ww2paenX3BMamqqbDab8vLyqmxeAC6OyAK1RFxcnLKysuTn5ydJSk5Olr+/v3MnBdRxbs6eAIDK4eHhoeDgYGdPA8A5uJIFqsCJEyc0aNAg+fj4qHHjxpoyZYri4+P11FNPSZJsNpsWLVrksI2/v7+Sk5Mdlu3YsUNxcXHy9PRURESEVq1aZV937sPFqampGjx4sPLz82Wz2WSz2TRhwgSzJwmgHCILVIGxY8dq1apVWrx4sZYvX67U1FRt3LjxivYzZswYbdq0SbGxsUpISFBOTk65cXFxcZo+fbp8fX2VlZWlrKwsJSYmVsapALgMRBYwrKCgQHPmzNErr7yinj17qm3btpo7d65KSkoue18jRozQgAEDFBYWplmzZsnPz09z5swpN87Dw0N+fn6y2WwKDg5WcHCwfHx8KuN0AFwGIgsYlpmZqaKiIsXExNiXBQQEqFWrVpe9r9jYWPvnbm5uio6OVkZGRqXME0DlI7JANWCz2WRZlsOy4uJiJ80GQGUhsoBhoaGhcnd31/r16+3LcnNztXPnTvvXQUFBysrKsn+9a9cuFRYWltvXunXr7J+XlJQoLS1NYWFhFR7Xw8NDpaWllXEKAK4QL+EBDPPx8dHQoUM1duxYNWzYUI0aNdK4cePk4vLL77g9evTQjBkzFBsbq9LSUj377LNyd3cvt6+ZM2eqRYsWCgsL07Rp05Sbm6shQ4ZUeNxmzZqpoKBAK1asUPv27eXt7S1vb29j5wmgPK5kgSowefJkde3aVQkJCerVq5e6dOmiqKgo+/opU6bo+uuvV9euXfXggw8qMTGxwiAmJSUpKSlJ7du31+rVq5WSkqLAwMAKjxkXF6fhw4frvvvuU1BQkCZNmmTs/ABUzGad/0RQLdavXz9JUkpKipNngtrkSv9dxcfHKzIyUtOnTzcwKwDVAVeyAAAYQmQBADCEG58AJ0lNTXX2FAAYxpUsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgSK2I7L59++Tp6ak1a9ZU6XGfe+45xcTEVOkxAQA1R7WMrM1m+9WPCRMm2Me/9NJLiomJUefOnSttDikpKerYsaM8PT0VEhKi8ePHq6SkxGHMU089pe+++04pKSmVdlwAQO3h5uwJVOSdd9654LoJEyYoMzPTfgV55MgRzZ07V3Pnzr3oPi3LUn3/+vbPbTbbBccuXbpUd955p+Lj4/XPf/5TW7Zs0V//+lcdPnxYs2bNso8LDg5W//799corr6hfv36Xc4oAgDqgWkZ24MCBFS5/6623lJmZqZEjR6pPnz6SpHnz5snNzU0JCQkVblNsFSuvNE95pXn6y5t/kST9UPSD/F395e/qL3ebe7ltEhMT1a5dOy1fvlxubme+Rb6+vnr55Zc1evRotW7d2j723nvv1T333KMff/xRzZs3v6rzBgDULtXy4eKKbNu2TaNGjVKHDh00efJk+/JFixYpJiZGPj4+5bY5WXZSe4r26GjpUZWpTJK0JW2LBt8xWC2DW6q+d301u7GZhgwZYt9m+/bt2r59u4YNG2YPrCQ9+eSTsixLH3zwgcMxevXqJUlavHhxpZ4vAKDmqxGRLSws1L333itXV1fNnz9f9erVkyQVFxdrw4YN6tixY7ltiq1i7S/eb4+rJOUcztFjdzymn/73kx5PfFzPT31efe/rq6/XfW0fs2nTJklSdHS0w/6uu+46NW3a1L7+LD8/P4WGhlb5TVcAgOqvWj5cfL6RI0dq+/btmjt3rlq2bGlfvnfvXp08eVI33nhjuW3ySvMcAitJm9ZtUn5uvt76+C21jWprX/7iX1+0f56VlSVJaty4cbl9Nm7cWAcOHCi3vHnz5tq+ffvlnxgAoFar9ley7733nt5++209/PDDGjRokMO6nJwcSVKDBg0clluWpbzSvHL7qu935san1CWpKi4uti/PK82TZVmSpJMnT0qS/Wr5XJ6envb152rQoIGys7Mv46wAAHVBtY7srl27NHz4cLVs2VL/+te/LjjubCDPyi/I16GDh3Tk4BEdOXhER48clSR16tZJt/3uNs3820zFNonVk3c/qQ/nfqhTp0+pVKWSJC8vL0nS6dOnyx3n1KlT9vXnH/9idysDAOqmahvZ06dP67777lNRUZHmz59f4Y1NDRs2lCTl5uY6LJ/6ylR1bdbV/nF357slnXn97Wv/7zXNXzVfDw1/SIcOHNK434/TgNgBKigokPTLw8RnHzY+V1ZWlq677rpyy3NzcxUYGHh1JwwAqHWq7XOyiYmJ2rRpk1599VV16NChwjEhISHy8vLS7t27HZY/MugRNY9pLktnrnA9vTwd1kfGRCoyJlJPv/S0Ppr/kcY+OlYL5i/Q448/rsjISEnSt99+q06dOtm3OXDggPbv369hw4aVm8fu3bvVvn37qzldAEAtVC0ju3DhQs2YMUP9+vXTqFGjLjjO3d1d0dHR+vbbbx2Wh4aGyvcGXx0tPeqwPD83X77+vg4P7Ya1D5MkFRUVSZLCw8PVunVrvfHGG/r9738vV1dXSdKsWbNks9l09913O+4zP1+ZmZl64oknrvyEAQC1UrWLbFZWloYOHSpXV1f17NlT8+bNq3BcaGioYmNj1b9/f40bN07Hjh2Tr6+vfb2/q3+5O4wXzVuk92a/p1v736rrb7xeJwpOaMHbC+Tr66u+ffvax02ePFn9+vXTbbfdpvvvv19bt27VjBkz9NhjjyksLMxhHp9//rksy1L//v0r+TsBAKjpbNb5dw05WWpqqm655ZZfHffII48oOTlZhw8fVpMmTfTvf/+73DtFnSw76fBa2e3p2zVn6hxt+nqTsg9nq75ffXW6uZMmvjhRUVFRDtsuWrRIL774ojIyMhQUFKRHH31Uf/nLX+Tu7vgOUffff79++uknffXVV1d55qipzr6lJu9hDeB81S6yV2Lo0KHauXNnhaE7920Vz8bWRS4XfVvFS3Xw4EHdeOONmj9/PleydRiRBXAh1e7h4isxfvx4tWzZUmvWrCn3l3jcbe4KcgtSoGugBj5y5kp33tx5lfKSm+nTp6tt27YEFgBQoVoR2ZCQEJ06deqiY2w2m47nHbd/XhmSkpIqZT8AgNqp2r5OFgCAmo7IAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbKVbM+ePbLZbEpPT7/gmNTUVNlsNuXl5VXZvAAAVY/IOkFcXJyysrLk5+cnSUpOTpa/v79zJwUAqHRuzp5AXeTh4aHg4GBnTwMAYBhXsuc5ceKEBg0aJB8fHzVu3FhTpkxRfHy8nnrqKUmSzWbTokWLHLbx9/dXcnKyw7IdO3YoLi5Onp6eioiI0KpVq+zrzn24ODU1VYMHD1Z+fr5sNptsNpsmTJhg9iQBAFWCyJ5n7NixWrVqlRYvXqzly5crNTVVGzduvKL9jBkzRps2bVJsbKwSEhKUk5NTblxcXJymT58uX19fZWVlKSsrS4mJiZVxKgAAJyOy5ygoKNCcOXP0yiuvqGfPnmrbtq3mzp2rkpKSy97XiBEjNGDAAIWFhWnWrFny8/PTnDlzyo3z8PCQn5+fbDabgoODFRwcLB8fn8o4HQCAkxHZc2RmZqqoqEgxMTH2ZQEBAWrVqtVl7ys2Ntb+uZubm6Kjo5WRkVEp8wQA1AxE9jLZbDZZluWwrLi42EmzAQBUZ0T2HKGhoXJ3d9f69evty3Jzc7Vz507710FBQcrKyrJ/vWvXLhUWFpbb17p16+yfl5SUKC0tTWFhYRUe18PDQ6WlpZVxCgCAaoSX8JzDx8dHQ4cO1dixY9WwYUM1atRI48aNk4vLL7+L9OjRQzNmzFBsbKxKS0v17LPPyt3dvdy+Zs6cqRYtWigsLEzTpk1Tbm6uhgwZUuFxmzVrpoKCAq1YsULt27eXt7e3vL29jZ0nAKBqcCV7nsmTJ6tr165KSEhQr1691KVLF0VFRdnXT5kyRddff726du2qBx98UImJiRUGMSkpSUlJSWrfvr1Wr16tlJQUBQYGVnjMuLg4DR8+XPfdd5+CgoI0adIkY+cHAKg6Nuv8JxhrsX79+kmSUlJSLmu7+Ph4RUZGavr06QZmhZruSv9dAaj9uJIFAMAQIgsAgCHc+HQJUlNTnT0FAEANxJUsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwxM3ZEwBM27t3r7Kzs43tPy8vT5K0ceNGY8eQpMDAQIWEhBg9BoDKRWRRq+3du1dhYa1UWHjK+LGioqKM7t/b21MZGd8TWqAGIbKo1bKzs1VYeEpvvy21bu3s2Vy5HTukIUNOKTs7m8gCNQiRRZ3QurXUoYOzZwGgruHGJwAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFngCjz+uHTPPeWXf/ml5OUl5eVV+ZQAVENEFgAAQ4gsAACGEFkAAAxxc/YEgJpq6VIpMNBxWWmpc+YCoHoissAV6t5deu01x2XffCMNGeKc+QCofogscIW8vaXQUMdlP/3knLkAqJ54ThYAAEOILAAAhhBZAAAM4TlZ4Aq8+WbFy7t1k06erNq5AKi+uJIFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEPcnD0BoCrs2OHsGVydmj5/oK4isqjVAgMD5e3tqSFDTjl7KlfN29tTgYGBzp4GgMtAZFGrhYSEKCPje2VnZxs7xlNPPSVJmj59urFjSGd+YQgJCTF6DACVi8ii1gsJCTEaJ39/f0lSx44djR0DQM3EjU8AABhCZAEAMITIAgBgCJEFaoA9e/bIZrMpPT39gmNSU1Nls9mUl5dXZfMCcHFEFqgl4uLilJWVJT8/P0lScnKy/aYsAM7B3cVALeHh4aHg4GBnTwPAObiSBarAiRMnNGjQIPn4+Khx48aaMmWK4uPj7a+xtdlsWrRokcM2/v7+Sk5Odli2Y8cOxcXFydPTUxEREVq1apV93bkPF6empmrw4MHKz8+XzWaTzWbThAkTzJ4kgHKILFAFxo4dq1WrVmnx4sVavny5UlNTtXHjxivaz5gxY7Rp0ybFxsYqISFBOTk55cbFxcVp+vTp8vX1VVZWlrKyspSYmFgZpwLgMhBZwLCCggLNmTNHr7zyinr27Km2bdtq7ty5Kikpuex9jRgxQgMGDFBYWJhmzZolPz8/zZkzp9w4Dw8P+fn5yWazKTg4WMHBwfLx8amM0wFwGYgsYFhmZqaKiooUExNjXxYQEKBWrVpd9r5iY2Ptn7u5uSk6OloZGRmVMk8AlY/IAtWAzWaTZVkOy4qLi500GwCVhcgChoWGhsrd3V3r16+3L8vNzdXOnTvtXwcFBSkrK8v+9a5du1RYWFhuX+vWrbN/XlJSorS0NIWFhVV4XA8PD5WWllbGKQC4QryEBzDMx8dHQ4cO1dixY9WwYUM1atRI48aNk4vLL7/j9ujRQzNmzFBsbKxKS0v17LPPyt3dvdy+Zs6cqRYtWigsLEzTpk1Tbm6uhgwZUuFxmzVrpoKCAq1YsULt27eXt7e3vL29jZ0ngPK4kgWqwOTJk9W1a1clJCSoV69e6tKli6Kiouzrp0yZouuvv15du3bVgw8+qMTExAqDmJSUpKSkJLVv316rV69WSkrKBf/GbFxcnIYPH6777rtPQUFBmjRpkrHzA1Axm3X+E0G1WL9+/SRJKSkpTp4JapMr/XcVHx+vyMhI43+HFoDzcCULAIAhRBYAAEO48QlwktTUVGdPAYBhXMkCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABD3Jw9gXPt3btX2dnZxvafl5cnSdq4caOxY0hSYGCgQkJCjB4DAFD9VZvI7t27V2FhrVRYeMr4saKioozu39vbUxkZ3xNaAKjjqk1ks7OzVVh4Sm+/LbVu7ezZXLkdO6QhQ04pOzubyAJAHVdtIntW69ZShw7OngUAAFePG58AADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGFLrI/v449I995Rf/uWXkpeXlJdX5VMCANQRtT6yAAA4C5EFAMAQIgsAgCFuzp5AVVi6VAoMdFxWWuqcuQAA6o46Ednu3aXXXnNc9s030pAhzpkPAKBuqBOR9faWQkMdl/30k3PmAgCoO3hOFgAAQ4gsAACGEFkAAAyp9c/Jvvlmxcu7dZNOnqzauQAA6hauZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAEDdnT+B8O3Y4ewZXp6bPHwBQeapNZAMDA+Xt7akhQ045eypXzdvbU4GBgc6eBgDAyapNZENCQpSR8b2ys7ONHeOpp56SJE2fPt3YMaQzvzCEhIQYPQYAoPqrNpGVzoTWZJz8/f0lSR07djR2DAAAzuLGJwAADCGyAAAYQmQBADCEyFayPXv2yGazKT09/YJjUlNTZbPZlJeXV2XzAgBUPSLrBHFxccrKypKfn58kKTk52X5TFgCg9qhWdxfXFR4eHgoODnb2NAAAhnEle54TJ05o0KBB8vHxUePGjTVlyhTFx8fbX2Nrs9m0aNEih238/f2VnJzssGzHjh2Ki4uTp6enIiIitGrVKvu6cx8uTk1N1eDBg5Wfny+bzSabzaYJEyaYPUkAQJUgsucZO3asVq1apcWLF2v58uVKTU3Vxo0br2g/Y8aM0aZNmxQbG6uEhATl5OSUGxcXF6fp06fL19dXWVlZysrKUmJiYmWcCgDAyYjsOQoKCjRnzhy98sor6tmzp9q2bau5c+eqpKTksvc1YsQIDRgwQGFhYZo1a5b8/Pw0Z86ccuM8PDzk5+cnm82m4OBgBQcHy8fHpzJOBwDgZET2HJmZmSoqKlJMTIx9WUBAgFq1anXZ+4qNjbV/7ubmpujoaGVkZFTKPAEANQORvUw2m02WZTksKy4udtJsAADVGZE9R2hoqNzd3bV+/Xr7stzcXO3cudP+dVBQkLKysuxf79q1S4WFheX2tW7dOvvnJSUlSktLU1hYWIXH9fDwUGlpaWWcAgCgGuElPOfw8fHR0KFDNXbsWDVs2FCNGjXSuHHj5OLyy+8iPXr00IwZMxQbG6vS0lI9++yzcnd3L7evmTNnqkWLFgoLC9O0adOUm5urIUOGVHjcZs2aqaCgQCtWrFD79u3l7e0tb29vY+cJAKgaXMmeZ/LkyeratasSEhLUq1cvdenSRVFRUfb1U6ZM0fXXX6+uXbvqwQcfVGJiYoVBTEpKUlJSktq3b6/Vq1crJSXlgn9jNi4uTsOHD9d9992noKAgTZo0ydj5AQCqjs06/wnGWqxfv36SpJSUlMvaLj4+XpGRkcb/Di1qpiv9dwWg9uNKFgAAQ4gsAACGcOPTJUhNTXX2FAAANRBXsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCE1PrL79u2Tp6en1qxZU+XHfv311xUSEqLTp09X+bEBANVftYvswIED5enpqZ07d5Zbl5SUJJvNpo8//ti+7KWXXlJMTIw6d+7sMPann37SvffeK39/f/n6+qp///46ceLEJc9j7dq16tKli7y9vRUcHKxRo0apoKDAYcyjjz6qoqIizZ49+zLPEgBQF1S7yE6dOlXe3t4aPny4w/Ldu3frpZde0oABA3THHXdIko4cOaK5c+eWG1tQUKBbbrlFq1at0p///Ge9+OKL2rRpk9Z9/bU8bTZZZWUXnUN6erp69uypwsJCTZ06VY899pjeeOMN3XPPPQ7jPD099cgjj2jq1KmyLKsSzh4AUKtY1dAbb7xhSbKSk5Pty26//XbL19fX2r9/v33Z1KlTLS8vL+v48eMO2//jH/+wJFnffPONVXLihHVs0yZr9fTplquLizWqXz/r0IIF1rFNm6ySEycqPH6fPn2sxo0bW/n5+fZlb775piXJWrZsmcPYb7/91pJkrVixojJOHTVQQkKClZCQ4OxpAKiGqt2VrCQ99thj6ty5sxITE5WTk6P58+fr008/1V//+lc1adLEPm7RokWKiYmRj4+Pw/YffPCBbr75ZkXeeKNyPvlEhRkZuikoSF3Dw5Wyfr2soiIVZmQo55NPVJyT47DtsWPH9Nlnn2ngwIHy9fW1Lx80aJB8fHz0/vvvO4yPiopSQECAFi9ebOA7AQCoyaplZG02m2bPnq38/Hw98cQTevrppxUdHa0//OEP9jHFxcXasGGDOnbs6LBtWVmZNm/erKjISOWuXCmruFj6+aHcDqGh2nPokApOnpQsS1ZJiXK/+EKlhYX27bds2aKSkhJFR0c77NfDw0ORkZHatGlTufl27NjRKTdeAQCqt2oZWUkKDw9XYmKiFixYoCNHjmj27Nlycfllunv37tXJkyd14403Omx39OhRnT59Wg3d3GSVlDisa+TvL0k6mJt7ZsHPoT25a5d9TFZWliSpcePG5ebUuHFjHThwoNzy5s2ba/v27Vd0ngCA2qvaRlaSAgMDJUnXXXedIiIiHNbl/Pwwb4MGDRyWnzx5UpLkcvy4/Qr2rHru7pKkU0VFvyy0LBXu2mW/Gers9vXq1Ss3H09PT/v6czVo0EAnT55U4TlXxAAAVNvI7tu3T+PHj1dERIT27dunSZMmVTjOOi+kXl5ekqTTp06VG3u6uFiS5Onh4biPoiKV/fxaV/v2Fbz29dSpU/b1Fc3BZrNd9JwAAHVLtY3siBEjJElLly7VPffco7/97W/68ccf7esbNmwoSco9+9DvzwICAlSvXj0dyssrt8/DPy8LPu/q91xnHyY++7DxubKysnTdddeVW56bmytvb+8KAwwAqLuqZWQXLlyolJQUTZw4UU2bNtX06dPl4eHhcONTSEiIvLy8tHv3bodtXVxc1LZtW3133nJJ2vjDD7qhUSP5nBdDm4eHXH5+eDgiIkJubm769ttvHcYUFRUpPT1dkZGR5fa7e/duhYWFXenpAgBqqWoX2ePHj2vUqFHq0KGDRo4cKenMc7ITJ07Up59+qgULFkiS3N3dFR0dXS6GknT33XcrPTNT6eeE9ocDB7R6+3YlxMQ4jN114IByfHxk+/mmKj8/P/Xq1Uvz5s3T8ePH7ePeeecdFRQUlHtDCknauHGj4uLirv7kAQC1is06/0lNJxs9erRmzJihdevW6eabb7YvLy0tVadOnXTw4EHt2LFD9evX15QpUzRu3DgdPnzY4TWtx48fV4fISOXn5OiJvn3l7uqq2UuXqrSsTJ+//LICz4612RT84IPq1rWrVn35pX37s9Fs06aNhg0bpv3792vKlCnq1q2bli1b5jDftLQ0RUdH6/PPP1fPnj3NfnNQLfXr10+SlJKS4uSZAKhuqtWVbFpammbOnKknn3zSIbCS5Orqqtdff10HDx7U888/L0l6+OGHVVpaWu5/bvXr11fqqlXq1r27pi9apH988IHahIRo4fPPOwTW5uZ25lMXx29Dx44d9fnnn8vLy0tPP/203njjDQ0dOlQffPBBuTkvWLBAISEh6tGjR2V9GwAAtUS1u5K9XEOHDtXOnTv11VdfVbi+tLBQhTt36uQPP8j6+aU7Ng8PebdoIa8WLeTq7X3Fxz59+rSaNWum5557TqNHj77i/aBm40oWwIW4OXsCV2v8+PFq2bKl1qxZU+4v8UiSq7e36kdGyqddO/vLdFzq1St39Xol/v3vf8vd3b3cHygAAECqBVeygLNxJQvgQqrVc7IAANQmRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFmgAvv27ZOnp6fWrFlT5cd+/fXXFRISotOnT1f5sQFULiKLOmHgwIHy9PTUzp07y61LSkqSzWbTxx9/bF/20ksvKSYmRp07d3YY+9NPP+nee++Vv7+/fH191b9/f504ceKS57F27Vp16dJF3t7eCg4O1qhRo1RQUOAw5tFHH1VRUZFmz559mWcJoLqxWZZlOXsSgGmHDx9W69atFRkZqS+++MK+fPfu3QoPD1ffvn31wQcfSJKOHDmiJk2aaO7cuXrggQfsYwsKCtSxY0fl5+drzJgxcnd317Rp05STna3f3nqr/rNwoWwuF/69NT09XbGxsQoLC9OwYcO0f/9+vfLKK7rlllu0dOlSh7HPPvus/vOf/2j37t2y2WyV/N0AUGUsoI544403LElWcnKyfdntt99u+fr6Wvv377cvmzp1quXl5WUdP37cYft//OMfliTrm2++sUpOnLCObdpkrZ4+3XJ1cbFG9etnHVqwwDq2aZNVcuJEhcfv06eP1bhxYys/P9++7M0337QkWcuWLXMY++2331qSrBUrVlTGqQNwEh4uRp3x2GOPqXPnzkpMTFROTo7mz5+vTz/9VH/961/VpEkT+7hFixYpJiZGPj4+Dtt/8MEHuvnmmxV5443K+eQTFWZk6KagIHUND1fK+vWyiopUmJGhnE8+UXFOjsO2x44d02effaaBAwfK19fXvnzQoEHy8fHR+++/7zA+KipKAQEBWrx4sYHvBICqQmRRZ9hsNs2ePVv5+fl64okn9PTTTys6Olp/+MMf7GOKi4u1YcMGdezY0WHbsrIybd68WVGRkcpduVJWcbH08zMtHUJDtefQIRWcPClZlqySEuV+8YVKCwvt22/ZskUlJSWKjo522K+Hh4ciIyO1adOmcvPt2LGjU268AlB5iCzqlPDwcCUmJmrBggU6cuSIZs+eLZdznkfdu3evTp48qRtvvNFhu6NHj+r06dNq6OYmq6TEYV0jf39J0sHc3DMLfg7tyV277GOysrIkSY0bNy43p8aNG+vAgQPlljdv3lzbt2+/ovMEUD0QWdQ5gYGBkqTrrrtOERERDutyfn6Yt0GDBg7LT548KUlyOX7cfgV7Vj13d0nSqaKiXxZalgp37ZJVVuawfb169crNx9PT077+XA0aNNDJkydVeM4VMYCahciiTtm3b5/Gjx+viIgI7du3T5MmTapwnHVeSL28vCRJp0+dKjf2dHGxJMnTw8NxH0VFKvv5ta727St47eupU6fs6yuaA3cXAzUXkUWdMmLECEnS0qVLdc899+hvf/ubfvzxR/v6hg0bSpJyzz70+7OAgADVq1dPh/Lyyu3z8M/Lgs+7+j3X2YeJzz5sfK6srCxdd9115Zbn5ubK29u7wgADqBmILOqMhQsXKiUlRRMnTlTTpk01ffp0eXh4ONz4FBISIi8vL+3evdthWxcXF7Vt21bfnbdckjb+8INuaNRIPufF0ObhIZefHx6OiIiQm5ubvv32W4cxRUVFSk9PV2RkZLn97t69W2FhYVd6ugCqASKLOuH48eMaNWqUOnTooJEjR0o685zsxIkT9emnn2rBggWSJHd3d0VHR5eLoSTdfffdSs/MVPo5of3hwAGt3r5dCTExDmN3HTigHB8f+5tT+Pn5qVevXpo3b56OHz9uH/fOO++ooKBA99xzT7njbdy4UXFxcVd/8gCchnd8Qp0wevRozZgxQ+vWrdPNN99sX15aWqpOnTrp4MGD2rFjh+rXr68pU6Zo3LhxOnz4sMNrWo8fP64OkZHKz8nRE337yt3VVbOXLlVpWZk+f/llBZ4da7Mp+MEH1a1rV6368kv79mej2aZNG/s7Pk2ZMkXdunXTsmXLHOablpam6Ohoff755+rZs6fZbw4AY7iSRa2XlpammTNn6sknn3QIrCS5urrq9ddf18GDB/X8889Lkh5++GGVlpYqJSXFYWz9+vWVumqVunXvrumLFukfH3ygNiEhWvj88w6Btbm5nfn0vLdY7Nixoz7//HN5eXnp6aef1htvvKGhQ4fa387xXAsWLFBISIh69OhRWd8GAE7AlSxQgaFDh2rnzp366quvKlxfWliowp07dfKHH2T9/NIdm4eHvFu0kFeLFnL19r7iY58+fVrNmjXTc889p9GjR1/xfgA4H5EFKrB37161bNlSK1asKPeXeM5llZXZX6bjUq/eRf9AwKV6/fXX9fLLL2vXrl0Vvq4WQM1BZAEAMITnZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYIibsydwrr179yo7O9vZ07hqgYGBCgkJcfY0AABOVm0iu3fvXoWFhamwsNDZU7lq3t7eysjIILQAUMdVm8hmZ2ersLBQ8+bNU1hYmLOnc8UyMjI0cOBAZWdnE1kAqOOqTWTPCgsLU8eOHZ09DQAArho3PgEAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwpMZHNj4+Xk899VSl7a9bt2567733Km1/FcnOzlajRo20f/9+o8cBADiX8cgeOXJETzzxhEJCQlSvXj0FBwerd+/eWrNmjelDX7aUlBQdOnRI999/v33ZqVOn9Ic//EENGzaUj4+PBgwYoEOHDv3qvqKiomSz2ewft99+u31dYGCgBg0apPHjxxs5DwBA9eBm+gADBgxQUVGR5s6dq+bNm+vQoUNasWKFcnJyTB/6kliWpdLSUrm5uem1117T4MGD5eLyy+8eTz/9tD755BMtWLBAfn5+GjFihO66665f/SUhLi5OH374of3revXqOawfPHiwoqKiNHnyZAUEBFTuSQEAqgfLoNzcXEuSlZqaetExw4YNswICAixJVmhoqPXRRx9ZlmVZ2dnZ1v33329dd911lpeXlxUREWG99957Dtt3797dGj16tP3r//u//7OioqIsHx8f69prr7UeeOAB69ChQ/b1K1eutCRZS5YssTp27Gi5u7tbK1eutA4fPmzZbDZr69at9rF5eXmWu7u7tWDBAvuyjIwMS5L19ddfV3g+aWlpliSre/fuv/r9ufHGG6233nrrV8cBAGomow8X+/j4yMfHR4sWLdLp06fLrS8rK1OfPn20Zs0aTZw4UZI0YsQIubq6SjrzUG1UVJQ++eQTbd26VcOGDdPDDz+sb7755oLHLC4u1sSJE/Xdd99p0aJF2rNnjx599NFy45577jklJSUpIyND7dq10+rVq+Xt7a2wsDD7mLS0NBUXF6tXr172Za1bt1ZISIi+/vrri557WlqaGjVqpFatWumJJ56o8Mq9U6dO+uqrry66HwBAzWX04WI3NzclJyfr8ccf1+uvv66OHTuqe/fuuv/++9WuXTt9/vnn+uabb5SRkaGCggJJZ2486tixoySpSZMmSkxMtO9v5MiRWrZsmd5//3116tSpwmMOGTLE/nnz5s312muv6eabb1ZBQYF8fHzs61566SXdeuut9q//97//6dprr3V4qPjgwYPy8PCQv7+/wzGuvfZaHTx48KLn/tJLL6lXr17KzMzUn//8Z/Xp00dff/21/RcISbruuuu0adOmi+4HAFBzGb/xacCAATpw4IBSUlJ0++23KzU1VR07dlRycrLS09PVtGlTtWzZssJtS0tLNXHiRLVt21YBAQHy8fHRsmXLtHfv3gseLy0tTQkJCQoJCVH9+vXVvXt3SSq3TXR0tMPXJ0+elKen51We7S+6d++utm3b6s4779THH3+sDRs2KDU11WGMl5eXCgsLK+2YAIDqpUpewuPp6albb71VL7zwgtauXatHH31U48ePl5eX10W3mzx5sl599VU9++yzWrlypdLT09W7d28VFRVVOP7EiRPq3bu3fH199e6772rDhg1auHChJJXb5pprrnH4OjAwULm5uQ7LgoODVVRUpLy8PIflhw4dUnBw8KWcuqQzV9SBgYH64YcfHJYfPXpUQUFBl7wfAEDN4pTXybZp00YnTpxQu3bttH//fu3cubPCcWvWrFH//v01cOBAtW/fXs2bN7/gWEnasWOHcnJylJSUpK5du6p169Y6fPjwJc2pQ4cOOnjwoENoo6Ki5O7urhUrVtiXff/999q7d69iY2Mv8Wyl/fv3KycnR40bN3ZYvnXrVnXo0OGS9wMAqFmMRjYnJ0c9evTQvHnztHnzZu3evVsLFizQpEmT1L9/f3Xv3l3dunXTgAEDtG7dOklnwvrpp59Kklq0aKHPPvtMa9euVUZGhn7/+99f9DWqISEh8vDw0D//+U/9+OOPSklJsd9Q9Ws6dOigwMBAh5fm+Pn5aejQofrjH/+olStXKi0tTYMHD1ZsbKx+85vf2Me1bt3afsV89uHfLVu2aM+ePVqxYoX69++vm266Sb1797ZvU1hYqLS0NN12222X+N0EANQ0xu8ujomJ0bRp09StWzdFRETohRde0OOPP64ZM2ZIkj788EPdfPPN+vOf/yxJevXVV1VaWipJev7559WxY0f17t1b8fHxCg4O1p133nnB4wUFBSk5OVkLFixQmzZtlJSUpFdeeeWS5urq6qrBgwfr3XffdVg+bdo03XHHHRowYIC6deum4OBg/fe//3UY8/333ys/P1+S7DdOPf3002rZsqWGDh2qqKgoffXVVw6vlV28eLFCQkLUtWvXS5ofAKDmsVmWZTl7EpK0ceNGRUVFKS0tzX53cVU7ePCgwsPDtXHjRt1www1XtI9LPY/f/OY3GjVqlB588MErnS4AoJqr8e9dXJmCg4M1Z86ci969XBmys7N111136YEHHjB6HACAcxl/W8Wa5mIPR1eWwMBAPfPMM8aPAwBwLq5kAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhS7f5oe0ZGhrOncFVq+vwBAJWn2kQ2MDBQ3t7eGjhwoLOnctW8vb0VGBjo7GkAAJzMZlmW5exJnLV3715lZ2c7expXLTAwUCEhIc6eBgDAyapVZAEAqE248QkAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCFEFgAAQ4gsAACGEFkAAAwhsgAAGEJkAQAwhMgCAGAIkQUAwBAiCwCAIUQWAABDiCwAAIYQWQAADCGyAAAYQmQBADCEyAIAYAiRBQDAECILAIAhRBYAAEOILAAAhhBZAAAMIbIAABhCZAEAMITIAgBgCJEFAMAQIgsAgCH/H6k1EygoCBGFAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "Circuit(exp).decomp().draw()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "768b5f7e", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABu0AABX0CAYAAACqx9j2AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3XmQVuWdL/BvQyNLIzrQIKACArIEF2zigoqKuCc4jrkkxIXABSQTlxhBo6NR1BivO6MxaG4MuDBDXLJdEw0KQwaMSmwiorTiBiRGQjqIiqhgw/3D8q28gwuL5oh8PlVd9b6/8zzP+Z3TVJflt55zKtatW7cuAAAAAAAAQGEaFd0AAAAAAAAAbO2EdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMEqi24AAAAA2HotWbIk9fX1Rbex2aqrq9OpU6ei2wAAYAsmtAMAAAAKsWTJkvTu3TurVq0qupXN1qJFi9TV1QnuAADYZEI7AAAAoBD19fVZtWpV7rjjjvTu3bvodjZZXV1dTjrppNTX1wvtAADYZEI7AAAAoFC9e/dOTU1N0W0AAEChGhXdAAAAAAAAAGzthHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAGzVTj755Hzve98rqz3zzDNp3759Xn/99U1et76+Pu3atcuf/vSnsvrQoUNzzTXXbPK6AAB8NgntAAAAgI/F0qVLc/rpp6dr165p2rRpdt555wwePDjTp0//RM87efLkbL/99ps0d968efn1r3+dM844o6x+3nnn5fTTT8+2226bJHnrrbcyfPjw7L777qmsrMxxxx33kWtXV1dn2LBhueiii8rqF1xwQS677LK8+uqrm9QzAACfTUI7AAAAYLMtWrQo/fr1y4wZM3LVVVdl/vz5uf/++zNw4MCceuqp7ztnzZo1/+Au13fDDTdkyJAhadmyZam2ZMmS3HvvvRk+fHip1tDQkObNm+eMM87IYYcdtsHrjxgxIlOmTMny5ctLtd122y3dunXLHXfc8bFcAwAAnw1COwAAAGCzfeMb30hFRUXmzJmTL33pS+nRo0f69OmTs846K4888kiSpKKiIhMnTsyxxx6bqqqq/PjHP06SzJw5MzU1NWnWrFm6du2aiy++OO+8805p7WuvvTa77757qqqqsvPOO+cb3/hGVq5cWZo7YsSIvPrqq6moqEhFRUXGjx+fJHn77bczbty47Ljjjqmqqsq+++6bmTNnltZtaGjI3XffncGDB5ddy5133pk999wzO+64Y6lWVVWViRMnZvTo0Wnfvv0G35c+ffqkY8eO+dnPflZWHzx4cKZOnbrB6wAA8NkntAMAAAA2y/Lly3P//ffn1FNPTVVV1XrH//7RlePHj8+//Mu/ZP78+Tn22GOTJBdeeGG++c1vZsGCBbn55pszefLkXHbZZaU5jRo1yvXXX5+nnnoqt956a2bMmJFzzjknSbL//vtnwoQJadWqVV5++eW8/PLLGTduXJLktNNOy8MPP5ypU6fmiSeeyJAhQ3LUUUfl2WefTZI88cQTefXVV/P5z3++rN9Zs2atV9sc++yzT2bNmrVebc6cOXn77bc/tvMAALBlE9oBAAAAm+W5557LunXr0qtXr48ce8IJJ2TEiBHp2rVrOnTokCQZPnx4vva1r6Vr1645/PDDc+mll+bmm28uzTnzzDMzcODAdOnSJYceemi++93v5s4770ySbLPNNtluu+1SUVGR9u3bp3379mnZsmWWLFmSSZMm5a677sqAAQPSrVu3jBs3LgceeGAmTZqUJFm8eHEaN26cdu3alfW4ePHidOzY8eO6PenYsWMWL168Xm316tVZunTpx3YeAAC2bJVFNwAAAABs2datW7fBY99vB9uPfvSjTJ48ufS9oaEhb731VlatWpUWLVrkwQcfzOWXX56nn346r732Wt55552y4+9n/vz5aWhoSI8ePcrqb7/9dtq0aZMkefPNN9O0adNUVFSUjXnzzTfTrFmzDb6mj9K8efOsWrVqvVqS9eoAAGy9hHYAAADAZtl1111TUVGRp59++iPHvt/jM8eMGZPTTz99vXqzZs2yaNGifPGLX8y//uu/5rLLLkvr1q0ze/bsjBw5MqtXr/7A0G7lypVp3Lhxamtr07hx47JjLVu2TJJUV1dn1apVWb16dbbZZpvS8erq6rzyyisfeS0bavny5Wnbtu16tSTr1QEA2HoJ7QAAAIDN0rp16xx55JG58cYbc8YZZ6wXzK1YsaLsvXb/0+LFi9O9e/f3PVZbW5u1a9fmmmuuSaNG777l471HY75nm222SUNDQ1ltr732SkNDQ5YtW5YBAwa879p9+/ZNkixYsKD0+b25CxYs+MB+N9aTTz6ZQw45ZL3aTjvtlOrq6o/tPAAAbNm80w4AAADYbDfeeGMaGhqyzz775J577smzzz6burq6XH/99enfv/+Hzr333ntz8cUX56mnnkpdXV2mTp2aCy64IEnSvXv3rFmzJjfccENeeOGF3H777bnpppvK5nfp0iUrV67M9OnTU19fn1WrVqVHjx458cQTM2zYsPz0pz/Niy++mDlz5uTyyy/Pr371qyTv7nKrqanJ7Nmzy9Y78sgj8/DDD68XBC5YsCCPP/54li9fnldffTWPP/54Hn/88Q+9tlWrVqW2tjZHHHFEWX3WrFnr1QAA2LoJ7QAAAIDN1rVr18ydOzcDBw7M2LFjs9tuu+Xwww/P9OnTM3HixA+dO2HChEybNi1777139ttvv1x33XXp3LlzkmTPPffMtddemyuuuCK77bZbpkyZkssvv7xs/v7775+vf/3r+cpXvpK2bdvmyiuvTJJMmjQpw4YNy9ixY9OzZ88cd9xx+f3vf59OnTqV5o4aNSpTpkwpW+/oo49OZWVlHnzwwbL6Mccck7322iv/7//9v8ycOTN77bVX9tprr9LxP//5z6moqMjMmTNLtV/84hfp1KlT2W6/t956Kz//+c8zevToDbizAABsLSrWbczbogEAAAA+JnPnzk2/fv1SW1ubmpqaQnp4880307Nnz/zkJz8p2xF4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qaqqyr777puZM2eW1m1oaMjdd9+dwYMHl13LnXfemT333DM77rhjqTZlypSsXr06P/7xj9OnT58MHTo0Z5xxxnq76P6nww8/PMuXL89vf/vbUq1x48Y55phjMnXq1I2/0QBsNKEdAAAAALBVWL58ee6///6ceuqpqaqqWu/43z+6cvz48fmXf/mXzJ8/P8cee2yS5MILL8w3v/nNLFiwIDfffHMmT56cyy67rDSnUaNGuf766/PUU0/l1ltvzYwZM3LOOeckSfbff/9MmDAhrVq1yssvv5yXX34548aNS5KcdtppefjhhzN16tQ88cQTGTJkSI466qg8++yzSd593OWrr76az3/+82X9zpo1a73aww8/nIMOOijbbLNNqXbkkUfmmWeeyWuvvfaB92abbbZJ3759M2vWrLL6Pvvss14NgE+G0A4AAAAA2Co899xzWbduXXr16vWRY0844YSMGDEiXbt2TYcOHZIkw4cPz9e+9rV07do1hx9+eC699NLcfPPNpTlnnnlmBg4cmC5duuTQQw/Nd7/73dx5551J3g3Ftttuu1RUVKR9+/Zp3759WrZsmSVLlmTSpEm56667MmDAgHTr1i3jxo3LgQcemEmTJiVJFi9enMaNG6ddu3ZlPS5evDgdO3Ysqy1dujQ77LBDWe2973/7298+9Jo7duyYxYsXr1f74x//6L12AP8AlUU3AAAAAADwj7Bu3boNHvs/d7AlyY9+9KNMnjy59L2hoSFvvfVWVq1alRYtWuTBBx/M5ZdfnqeffjqvvfZa3nnnnbLj72f+/PlpaGhIjx49yupvv/122rRpkyR5880307Rp01RUVJSNefPNN9OsWbMNvqaP0rx586xatWq92tq1a/P222+nefPmH9u5AFif0A4AAAAA2CrsuuuuqaioyNNPP/2RY9/v8ZljxozJ6aefvl69WbNmWbRoUb74xS/mX//1X3PZZZeldevWmT17dkaOHJnVq1d/YGi3cuXKNG7cOLW1tWncuHHZsZYtWyZJqqurs2rVqqxevbrssZfV1dV55ZVXyua0b98+f/nLX8pq731/LwT8IMuXL0+3bt3Wq1VVVQnsAP4BhHYAAAAAwFahdevWOfLII3PjjTfmjDPOWC+YW7FiRdl77f6nxYsXp3v37u97rLa2NmvXrs0111yTRo3efSvRe4/GfM8222yThoaGstpee+2VhoaGLFu2LAMGDHjftfv27ZskWbBgQenze3MXLFhQNrZ///45//zzs2bNmjRp0iRJ8sADD6Rnz55p1arVB15bkjz55JP5X//rf61X22uvvT50HgAfD++0AwAAAAC2GjfeeGMaGhqyzz775J577smzzz6burq6XH/99enfv/+Hzr333ntz8cUX56mnnkpdXV2mTp2aCy64IEnSvXv3rFmzJjfccENeeOGF3H777bnpppvK5nfp0iUrV67M9OnTU19fn1WrVqVHjx458cQTM2zYsPz0pz/Niy++mDlz5uTyyy/Pr371qyRJ27ZtU1NTk9mzZ5etd+SRR+bhhx8uCwJPOOGEbLPNNhk5cmSeeuqp/OQnP8m///u/56yzzvrQa1u0aFFeeumlHHbYYWX1WbNm5YgjjvjwmwrAx0JoBwAAAABsNbp27Zq5c+dm4MCBGTt2bHbbbbccfvjhmT59eiZOnPihcydMmJBp06Zl7733zn777ZfrrrsunTt3TpLsueeeufbaa3PFFVdkt912y5QpU3L55ZeXzd9///3z9a9/PV/5ylfStm3bXHnllUmSSZMmZdiwYRk7dmx69uyZ4447Lr///e/TqVOn0txRo0ZlypQpZesdffTRqayszIMPPliqbbfddpk2bVpefPHF9OvXL2PHjs2FF16YU045pTTmscceS0VFRRYtWlSq/ed//meOOOKI0vUkyUsvvZTf/e53GTFixAbeXQA2R8W6jXn7KgAAAMAW5KCDDkqXLl1y2223Fd0KsAWbO3du+vXrl9ra2tTU1BTSw5tvvpmePXvmJz/5SdmOwBtvvDG//OUv85vf/OYj13jvOi666KJMmTIlCxYsSJMmTbJ69ersuuuu+Y//+I8ccMABpfHf/va388orr+SHP/zhJ3JNAJTzTjsAAAAAgE+55s2b57bbbkt9fX1ZfcyYMVmxYkVef/31bLvtthu01uzZs/O9732v9M67JUuW5N/+7d/KArskadeu3Uc+VhOAj4/QDgAAAABgC3DIIYesV6usrMz555+/UetceeWVZTsGu3fvnu7du683buzYsRvdIwCbzjvtAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAA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OzU1NUW3AfCxaVR0AwAAAAAAALC1E9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAsJX47//+7wwePDgdO3ZMRUVFfv7zn2/w3IceeiiVlZXp27fvZq359a9/PRUVFZkwYUKptmjRoowcOTK77LJLmjdvnm7duuWiiy7K6tWrS2PeeuutDB8+PF/+8peTJGedddZ6a8+ePTsHHHBA2rRpk+bNm6dXr1657rrrysaMHz8+FRUVZT+9evVab62HH344hx56aKqqqtKqVascdNBBefPNNze432eeeSYDBw7MDjvskGbNmqVr16654IILsmbNmrLz9OvXb71+vvCFL5T126tXr1RVVeWf/umfcthhh+XRRx8tW2P58uU58cQT06pVq2y//fYZOXJkVq5cWTbmzjvvTN++fdOiRYt07tw5V111VdnxmTNnrtdHRUVFli5dWhqzOf9+gI9WWXQDAAAAAAD8Y7zxxhvZc88987//9//O8ccfv8HzVqxYkWHDhmXQoEH5y1/+sslr/uxnP8sjjzySjh07ltWffvrprF27NjfffHO6d++eJ598MqNHj84bb7yRq6++OknS0NCQ5s2bZ+jQobnsssved/2qqqqcdtpp2WOPPVJVVZXZs2dnzJgxqaqqyimnnFIa16dPnzz44IOl75WV5f+r/OGHH85RRx2V8847LzfccEMqKyszb968NGrUaIP7bdKkSYYNG5aamppsv/32mTdvXkaPHp21a9fme9/7Xulcv/nNb7LHHnskSf72t79lzz33zJAhQ0rHe/Toke9///vp2rVr3nzzzVx33XU54ogj8txzz6Vt27ZJkhNPPDEvv/xyHnjggaxZsyYjRozIKaeckv/4j/9Iktx333058cQTc8MNN+SII45IXV1dRo8enebNm+e0004ru/ZnnnkmrVq1Kn1v165d6fOm/vsBNkzFunXr1hXdBAAAAMAn4aCDDkqXLl1y2223Fd0KwIcq4u9VRUVFfvazn+W44477yLFDhw7NrrvumsaNG+fnP/95Hn/88Y1e86WXXsq+++6b3/zmN/nCF76QM888M2eeeeYHnvOqq67KxIkT88ILL5TV586dm379+uXggw/OzJkzP7L3448/PlVVVbn99tuTvLtz7cOuIUn222+/HH744bn00ks/cv2P6vfvnXXWWfn973+fWbNmla6jtrY2NTU1SZIJEybkwgsvzMsvv5yqqqr3XeO1117LdtttlwcffDCDBg1KXV1dPve5z+X3v/99Pv/5zydJ7r///hxzzDH505/+lI4dO+aEE07ImjVrctddd5XWueGGG3LllVdmyZIlqaioyMyZMzNw4MC88sor2X777T/yejfm3w+wYTweEwAAAACADzRp0qS88MILueiiizZ5jbVr1+bkk0/O2WefnT59+mzQnFdffTWtW7fe5HMmyR/+8If87ne/y8EHH1xWf/bZZ9OxY8d07do1J554YpYsWVI6tmzZsjz66KNp165d9t9//+ywww45+OCDM3v27M3q97nnnsv999+/Xi9/75ZbbsnQoUM/MLBbvXp1fvjDH2a77bbLnnvumeTdXYHbb799KbBLksMOOyyNGjUqPUbz7bffTrNmzcrWat68ef70pz9l8eLFZfW+ffumQ4cOOfzww/PQQw996DUDHy+hHQAAAAAA7+vZZ5/NueeemzvuuGO9R0hujCuuuCKVlZU544wzNmj8c889lxtuuCFjxozZpPPttNNOadq0aT7/+c/n1FNPzahRo0rH9t1330yePDn3339/Jk6cmBdffDEDBgzI66+/niSlnXLjx4/P6NGjc//996empiaDBg3Ks88+u9H97r///mnWrFl23XXXDBgwIJdccsn7rjFnzpw8+eSTZb2+5957703Lli3TrFmzXHfddXnggQdSXV2dJFm6dGnZIyyTdx/32bp169L76I488sj89Kc/zfTp07N27dosXLgw11xzTZLk5ZdfTpJ06NAhN910U+65557cc8892XnnnXPIIYdk7ty5H3yjgY+Vd9oBAAAAALCehoaGnHDCCbn44ovTo0ePTV6ntrY2//7v/565c+emoqLiI8e/9NJLOeqoozJkyJCMHj16k845a9asrFy5Mo888kjOPffcdO/ePV/96leTJEcffXRp3B577JF99903nTt3zp133pmRI0dm7dq1SZIxY8ZkxIgRSZK99tor06dPz49//ONcfvnlG9XvT37yk7z++uuZN29ezj777Fx99dU555xz1ht3yy23ZPfdd88+++yz3rGBAwfm8ccfT319ff7v//2/+fKXv1zaDbghRo8eneeffz5f/OIXs2bNmrRq1Srf/OY3M378+NJ7+nr27JmePXuW5uy///55/vnnc91115UeLQp8suy0AwAAAABgPa+//noee+yxnHbaaamsrExlZWUuueSSzJs3L5WVlZkxY8YGrTNr1qwsW7YsnTp1Kq2zePHijB07Nl26dCkb++c//zkDBw7M/vvvnx/+8Ieb3Psuu+yS3XffPaNHj863vvWtjB8//gPHbr/99unRo0eee+65JO/uOEuSz33uc2XjevfuXfYYzQ3td+edd87nPve5fPWrX83/+T//J+PHj09DQ0PZmDfeeCNTp07NyJEj33eNqqqqdO/ePfvtt19uueWWVFZW5pZbbkmStG/fPsuWLSsb/84772T58uVp3759knffP3fFFVdk5cqVWbx4cZYuXVoKB7t27fqB92afffYp3Rfgk2enHQAAAAAA62nVqlXmz59fVvvBD36QGTNm5O67784uu+yyQeucfPLJOeyww8pqRx55ZE4++eTSTrbk3R1rAwcOTL9+/TJp0qTSDrDNtXbt2rz99tsfeHzlypV5/vnnc/LJJydJunTpko4dO+aZZ54pG7dw4cKyXXqb0u/atWuzZs2a0m6+99x11115++23c9JJJ230NfXv3z8rVqxIbW1t+vXrlySZMWNG1q5dm3333bdsXuPGjbPjjjsmSf7zP/8z/fv3T9u2bT/wPI8//ngpxAQ+eUI7AAAAAICtxMqVK8t2Tr344ot5/PHH07p163Tq1CnnnXdeXnrppdx2221p1KhRdtttt7L57dq1S7NmzcrqH7VmmzZt0qZNm7J1mjRpkvbt25cex/jSSy/lkEMOSefOnXP11Vfnr3/9a2nse7vFkmTBggWlMG3lypV5/PHHkyR9+/ZNktx4443p1KlTevXqlST57//+71x99dVl79IbN25cBg8enM6dO+fPf/5zLrroojRu3Lj0+MyKioqcffbZueiii7Lnnnumb9++ufXWW/P000/n7rvv3uB+p0yZkiZNmmT33XdP06ZN89hjj+W8887LV77ylTRp0qTsftxyyy057rjj1rtPb7zxRi677LIce+yx6dChQ+rr63PjjTfmpZdeypAhQ5K8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VNttt93SrVu33HHHHR/LNQCfPkI7AAAAAAAK8Y1vfCMVFRWZM2dOvvSlL6VHjx7p06dPzjrrrDzyyCNJkoqKikycODHHHntsqqqq8uMf/zhJMnPmzNTU1KRZs2bp2rVrLr744rzzzjulta+99trsvvvuqaqqys4775xvfOMbWblyZWnuiBEj8uqrr6aioiIVFRUZP358kuTtt9/OuHHjsuOOO6aqqir77rtvZs6cWVq3oaEhd999dwYPHlx2LXfeeWf23HPP7LjjjqVaVVVVJk6cmNGjR6d9+/YbfF/69OmTjh075mc/+1lZffDgwZk6deoGrwNsWYR2AAAAAAD8wy1fvjz3339/Tj311FRVVa13/O8fXTl+/Pj8y7/8S+bPn59jjz02SXLhhRfmm9/8ZhYsWJCbb745kydPzmWXXVaa06hRo1x//fV56qmncuutt2bGjBk555xzkiT7779/JkyYkFatWuXll1/Oyy+/nHHjxiVJTjvttDz88MOZOnVqnnjiiQwZMiRHHXVUnn322STJE088kVdffTWf//zny/qdNWvWerXNsc8++2TWrFnr1ebMmZO33377YzsP8OkhtAMAAAAA4B/uueeey7p169KrV6+PHHvCCSdkxIgR6dq1azp06JAkGT58eL72ta+la9euOfzww3PppZfm5ptvLs0588wzM3DgwHTp0iWHHnpovvvd7+bOO+9MkmyzzTbZbrvtUlFRkfbt26d9+/Zp2bJllixZkkmTJuWuu+7KgAED0q1bt4wbNy4HHnhgJk2alCRZvHhxGjdunHbt2pX1uHjx4nTs2PHjuj3p2LFjFi9evF5t9erVWbp06cd2HuDTo7LoBgAAAAAA2PqsW7dug8e+3w62H/3oR5k8eXLpe0NDQ956662sWrUqLVq0yIMPPpjLL788Tz/9dF577bW88847Zcffz/z589PQ0JAePXqU1d9+++20adMmSfLmm2+madOmqaioKBvz5ptvplmzZht8TR+lefPmWbVq1Xq1JOvVgc8GoR0AAAAAAP9wu+66ayoqKvL0009/5Nj3e3zmmDFjcvrpp69Xb9asWRYtWpQvfvGL+dd//ddcdtllad26dWbPnp2RI0dm9erVHxjarVy5Mo0bN05tbW0aN25cdqxly5ZJkurq6qxatSqrV6/ONttsUzpeXV2dV1555SOvZUMtX748bdu2Xa+WZL068NkgtAMAAAAA4B+udevWOfLII3PjjTfmjDPOWC+YW7FiRdl77f6nxYsXp3v37u97rLa2NmvXrs0111yTRo3efUvUe4/GfM8222yThoaGstpee+2VhoaGLFu2LAMGDHjftfv27ZskWbBgQenze3MXLFjwgf1urCeffDKHHHLIerWddtop1dXVH9t5gE8P77QDAAAAAKAQN954YxoaGrLPPvvknnvuybPPPpu6urpcf/316d+//4fOvffee3PxxRfnqaeeSl1dXaZOnZoLLrggSdK9e/esWbMmN9xwQ1544YXcfvvtuemmm8rmd+nSJStXrsz06dNTX1+fVatWpUePHjnxxBMzbNiw/PSnP82LL76YOXPm5PLLL8+vfvWrJO/ucqupqcns2bPL1jvyyCPz8MMPrxcELliwII8//niWL1+eV199NY8//ngef/zxD722VatWpba2NkcccURZfdasWevVgM8OoR0AAAAAAIXo2rVr5s6dm4EDB2bs2LHZbbfdcvjhh2f69OmZOHHih86dMGFCpk2blr333jv77bdfrrvuunTu3DlJsueee+baa6/NFVdckd122y1TpkzJ5ZdfXjZ///33z9e//vV85StfSdu2bXPllVcmSSZNmpRhw4Zl7Nix6dmzZ4477rj8/ve/T6dOnUpzR40alSlTppStd/TRR6eysjIPPvhgWf2YY47JXnvtlf/3//5fZs6cmb322it77bVX6fif//znVFRUZObMmaXaL37xi3Tq1Klst99bb72Vn//85xk9evQG3FlgS1SxbmPe9gkAAACwBTnooIPSpUuX3HbbbUW3AvCh/L3acHPnzk2/fv1SW1ubmpqaQnp4880307Nnz/zkJz8p2xF444035pe//GV+85vffOQa713HTTfdlHPPPTcvvPBC/umf/ilJst9+++WMM87ICSecUBo/ceLE/OxnP8u0adM+/gsCPhW80w4AAAAAADZC8+bNc9ttt6W+vr6sPmbMmKxYsSKvv/56tt122w1a66GHHsq//du/lQK7+vr6HH/88fnqV79aNq5Jkya54YYbPp4LAD6VhHYAAAAAALCRDjnkkPVqlZWVOf/88zdqnTPPPLNsx2B1dXXOOeec9caNGjVqo3sEtizeaQcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAA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HQAAAAAAsEnq6+uzatWq3HHHHendu3fR7Wyyurq6nHTSSamvrxfaURihHQAAAAAAsFl69+6dmpqaotuALVqjohsAAAAAAACArZ3QDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAIAt2sknn5zvfe97ZbVnnnkm7du3z+uvv77J6y5YsCA77bRT3njjjbL6fvvtl3vuuWeT14X3I7QDAAAAAACSJEuXLs3pp5+erl27pmnTptl5550zePDgTJ8+/RM97+TJk7P99ttv0tx58+bl17/+dc4444yy+nnnnZfTTz892267ban2xBNPZMCAAWnWrFl23nnnXHnllR+69uc+97nst99+ufbaa8vqF1xwQc4999ysXbt2k3qG9yO0AwAAAAAAsmjRovTr1y8zZszIVVddlfnz5+f+++/PwIEDc+qpp77vnDVr1vyDu1zfDTfckCFDhqRly5al2pIlS3Lvvfdm+PDhpdprr72WI444Ip07d05tbW2uuuqqjB8/Pj/84Q8/dP0RI0Zk4sSJeeedd0q1o48+Oq+//nruu+++j/162HoJ7QAAAAAAgHzjG99IRUVF5syZky996Uvp0aNH+vTpk7POOiuPPPJIkqSioiITJ07Msccem6qqqvz4xz9OksycOTM1NTVp1qxZunbtmosvvrgs5Lr22muz++67p6qqKjvvvHO+8Y1vZOXKlaW5I0aMyKuvvpqKiopUVFRk/PjxSZK3334748aNy4477piqqqrsu+++mTlzZmndhoaG3H333Rk8eHDZtdx5553Zc889s+OOO5ZqU6ZMyerVq/PjH/84ffr0ydChQ3PGGWest4vufzr88MOzfPny/Pa3vy3VGjdunGOOOSZTp07d+BsNH0BoBwAAAAAAW7nly5fn/vvvz6mnnpqqqqr1jv/9oyvHjx+ff/mXf8n8+fNz7LHHJkkuvPDCfPOb38yCBQty8803Z/LkybnssstKcxo1apTrr78+Tz31VG699dbMmDEj55xzTpJk//33z4QJE9KqVau8/PLLefnllzNu3LgkyWmnnZaHH344U6dOzRNPPJEhQ4bkqKOOyrPPPpvk3cddvvrqq/n85z9f1u+sWbPWqz388MM56KCDss0225RqRx55ZJ555pm89tprH3hvttlmm/Tt2zezZs0qq++zzz7r1WBzCO0AAAAAAGAr99xzz2XdunXp1avXR4494YQTMmLEiHTt2jUdOnRIkgwfPjxf+9rX0rVr1xx++OG59NJLc/PNN5fmnHnmmRk4cGC6dOmSQw89NN/97ndz5513Jnk3FNtuu+1SUVGR9u3bp3379mnZsmWWLFmSSZMm5a677sqAAQPSrVu3jBs3LgceeGAmTZqUJFm8eHEaN26cdu3alfW4ePHidOzYsay2dOnS7LDDDmW1977/7W9/+9Br7tixYxYvXrxe7Y9//KP32vGxqSy6AQAAAAAAoFjr1q3b4LH/cwdbkvzoRz/K5MmTS98bGhry1ltvZdWqVWnRokUefPDBXH755Xn66afz2muv5Z133ik7/n7mz5+fhoaG9OjRo6z+9ttvp02bNkmSN998M02bNk1FRUXZmDfffDPNmjXb4Gv6KM2bN8+qVavWq61duzZvv/12mjdv/rGdi62X0A4AAAAAALZyu+66ayoqKvL0009/5Nj3e3zmmDFjcvrpp69Xb9asWRYtWpQvfvGL+dd//ddcdtllad26dWbPnp2RI0dm9erVHxjarVy5Mo0bN05tbW0aN25cdqxly5ZJkurq6qxatSqrV68ue+xldXV1XnnllbI57du3z1/+8pey2nvf3wsBP8jy5cvTrVu39WpVVVUCOz42QjsAAAAAANjKtW7dOkceeWRuvPHGnHHGGesFcytWrCh7r93/tHjx4nTv3v19j9XW1mbt2rW55ppr0qjRu2/teu/RmO/ZZptt0tDQUFbba6+90tDQkGXLlmXAgAHvu3bfvn2TJAsWLCh9fm/uggULysb2798/559/ftasWZMmTZokSR544IH07NkzrVq1+sBrS5Inn3wy/+t//a/1anvttdeHzoON4Z12AAAAAABAbrzxxjQ0NGSfffbJPffck2effTZ1dXW5/vrr079//w+de++99+biiy/OU089lbq6ukydOjUXXHBBkqR79+5Zs2ZNbrjhhrzwwgu5/fbbc9NNN5XN79KlS1auXJnp06envr4+q1atSo8ePXLiiSdm2LBh+elPf5oXX3wxc+bMyeWXX55f/epXSZK2bdumpqYms2fPLlvvyCOPzMMPP1wWBJ5wwgnZZpttMnLkyDz11FP5yU9+kn//93/PWWed9aHXtmjRorz00ks57LDDyuqzZs3KEUcc8eE3FTaC0A4AAAAAAEjXrl0zd+7cDBw4MGPHjs1uu+2Www8/PNOnT8/EiRM/dO6ECRMybdq07L333tlvv/1y3XXXpXPnzkmSPffcM9dee22uuOKK7LbbbpkyZUouv/zysvn7779/vv71r+crX/lK2rZtmyuvvDJJMmnSpAwbNixjx45Nz549c9xxx+X3v/99OnXqVJo7atSoTJkypWy9o48+OpWVlXnwwQdLte222y7Tpk3Liy++mH79+mXs2LG58MILc8opp5TGPPbYY6moqMiiRYtKtf/8z//MEUccUbqeJHnppZfyu9/9LiNGjNjAuwsfrWLdxrxdEgAAAGALctBBB6VLly657bbbim4F4EP5e/Xp4vex4ebOnZt+/fqltrY2NTU1hfTw5ptvpmfPnvnJT35StiPwxhtvzC9/+cv85je/+cg13ruOiy66KFOmTMmCBQvSpEmTrF69Orvuumv+4z/+IwcccEBp/Le//e288sor+eEPf/iJXBNbJ++0AwAAAAAAtljNmzfPbbfdlvr6+rL6mDFjsmLFirz++uvZdtttN2it2bNn53vf+17pnXdLlizJv/3bv5UFdknSrl27j3ysJmwsoR0AAAAAALBFO+SQQ9arVVZW5vzzz9+oda688sqyHYPdu3dP9+7d1xs3duzYje4RPop32gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBKotuAAAAAAAA2LLV1dUV3cJm2dL757NBaAcAAAAAAGyS6urqtGjRIieddFLRrWy2Fi1apLq6uug22IoJ7QAAAAAAgE3SqVOn1NXVpb6+/hM7x6hRo9KhQ4dceumln9g5kncDyE6dOn2i54API7QDAAAAAAA2WadOnT7RsKtly5Zp06ZNampqPrFzwKdBo6IbAAAAAAAAgK2d0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAPiZdunTJhAkTim6DLZDQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAIAt2htvvJFhw4alZcuW6dChQ6655poccsghOfPMM5O8+8jK7373u6UxnTt3zi9/+cv89a9/zT//8z+nZcuW2WOPPfLYY4+VrXvPPfekT58+adq0abp06ZJrrrmm7PiyZcsyePDgNG/ePLvsskumTJmyXm8rVqzIqFGj0rZt27Rq1SqHHnpo5s2b94ndC7ZcQjsAAAAAAGCLdvbZZ+e3v/1tfvGLX2TatGmZOXNm5s6dWzbmuuuuywEHHJA//OEP+cIXvpCTTz45w4YNy0knnZS5c+emW7duGTZsWNatW5ckqa2tzZe//OUMHTo08+fPz/jx4/Od73wnkydPLq05fPjw/PGPf8x//dd/5e67784PfvCDLFu2rOy8Q4YMybJly3LfffeltrY2NTU1GTRoUJYvX/6J3xe2LJVFNwAAAAAAALCpVq5cmVtuuSV33HFHBg0alCS59dZbs9NOO5WNO+aYYzJmzJgkyYUXXpiJEydm7733zpAhQ5Ik3/72t9O/f//85S9/Sfv27XPttddm0KBB+c53vpMk6dGjRxYsWJCrrroqw4cPz8KFC3Pfffdlzpw52XvvvZMkt9xyS3r37l065+zZszNnzpwsW7YsTZs2TZJcffXV+fnPf5677747p5xyyid7c9ii2GkHAAAAAABssZ5//vmsXr06++67b6nWunXr9OzZs2zcHnvsUfq8ww47JEl233339Wrv7ZSrq6vLAQccULbGAQcckGeffTYNDQ2pq6tLZWVl+vXrVzreq1evbL/99qXv8+bNy8qVK9OmTZu0bNmy9PPiiy/m+eef38wr57PGTjsAAAAAAOAzr0mTJqXPFRUVH1hbu3btx3bOlStXpkOHDpk5c+Z6x/4+3IPETjsAAAAAAGAL1q1btzRp0iSPPvpoqfbKK69k4cKFm7Vu796989BDD5XVHnroofTo0SONGzdOr1698s4776S2trZ0/JlnnsmKFStK32tqarJ06dJUVlame/fuZT/V1dWb1R+fPUI7AAAAAABgi9WyZcuMHDkyZ599dmbMmJEnn3wyw4cPT6NGmxeBjB07NtOnT8+ll16ahQsX5tZbb833v//9jBs3LknSs2fPHHXUURkzZkweffTR1NbWZtSoUWnevHlpjcMOOyz9+/fPcccdl2nTpmXRokX53e9+l/PPPz+PPfbYZvXHZ4/QDgAAAAAA2KJdddVVGTBgQAYPHpzDDjssBx54YNm75jZFTU1N7rzzzkydOjW77bZbLrzwwlxyySUZPnx4acykSZPSsWPHHHzwwTn++ONzyimnpF27dqXjFRUV+fWvf52DDjooI0aMSI8ePTJ06NAsXry49A49eI932gEAAAAAAFu0li1b5vbbb8/tt99eqv3qV78qfV60aNF6c9atW1f2vUuXLuvVvvSlL+VLX/rSB563ffv2uffee8tqJ598ctn3bbfdNtdff32uv/76j7wOtm522gEAAAAAAEDBhHYAAAAAAABQMI/HBAAAAAAAPnNmzpxZdAuwUey0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAAClZZdAMAAAAAAAB8PJYsWZL6+vqi29hs1dXV6dSpU9Ft/EMJ7QAAAAAAAD4DlixZkt69e2fVqlVFt7LZWrRokbq6uq0quBPaAQAAAAAAfAbU19dn1apVueOOO9K7d++i29lkdXV1Oemkk1JfXy+0AwAAAAAAYMvUu3fv1NTUFN0GG6lR0Q0AAAAAAADA1k5oBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAACw1fvv//7vDB48OB07dkxFRUV+/vOfb/Dchx56KJWVlenbt+9mrfn1r389FRUVmTBhQqm2aNGijBw5MrvsskuaN2+ebt265aKLLsrq1atLY956660MHz48X/7yl5MkZ5111nprz549OwcccEDatGmT5s2bp1evXrnuuuvKxowfPz4VFRVlP7169VpvrYcffjiHHnpoqqqq0qpVqxx00EF58803N7jfZ555JgMHDswOO+yQZs2apWvXrrnggguyZs2asvP069dvvX6+8IUvlPXbq1evVFVV5Z/+6Z9y2GGH5dFHHy1bY/ny5TnxxBPTqlWrbL/99hk5cmRWrlxZNubOO+9M375906JFi3Tu3DlXXXVV2fGZM2eu10dFRUWWLl1aGrM5/37eU7nRMwAAAAAAAD5j3njjjey555753//7f+f444/f4HkrVqzIsGHDMmjQoPzlL3/Z5DV/9rOf5ZFHHknHjh3L6k8//XTWrl2bm2++Od27d8+TTz6Z0aNH54033sjVV1+dJGloaEjz5s0zdOjQXHbZZe+7flVVVU477bTsscceqaqqyuzZszNmzJhUVVXllFNOKY3r06dPHnzwwdL3ysryKOnhhx/OUUcdlfPOOy833HBDKisrM2/evDRq1GiD+23SpEmGDRuWmpqabL/99pk3b15Gjx6dtWvX5nvf+17pXL/5zW+yxx57JEn+9re/Zc8998yQIUNKx3v06JHvf//76dq1a958881cd911OeKII/Lcc8+lbdu2SZITTzwxL7/8ch544IGsWbMmI0aMyCmnnJL/+I//SJLcd999OfHEE3PDDTfkiCOOSF1dXUaPHp3mzZvntNNOK7v2Z555Jq1atSp9b9euXenzpv77+XtCOwAAAAAAYKt39NFH5+ijj97oeV//+tdzwgknpHHjxuvtrtrQNV966aWcfvrp+c1vflO2kyxJjjrqqBx11FGl7127ds0zzzyTiRMnlkKwqqqqTJw4MXPnzv3A0G6vvfbKXnvtVfrepUuX/PSnP82sWbPKQrvKysq0b9/+A3v91re+lTPOOCPnnntuqdazZ8+N6rdr167p2rVraUznzp0zc+bMzJo1q+xc1dXVpV6mTp2aFi1alIV2J5xwQtn4a6+9NrfcckueeOKJDBo0KHV1dbn//vvz+9//Pp///OeTJDfccEOOOeaYXH311enYsWNuv/32HHfccfn6179e6u28887LFVdckVNPPTUVFRWl9du1a5ftt9/+fe/Lpv77+XsejwkAAAAAALAJJk2alBdeeCEXXXTRJq+xdu3anHzyyTn77LPTp0+fDZrz6quvpnXr1pt8ziT5wx/+kN/97nc5+OCDy+rPPvtsOnbsmK5du+bEE0/MkiVLSseWLVuWRx99NO3atcv++++fHXbYIQcffHBmz569Wf0+99xzuf/++9fr5e/dcsstGTp0aKqqqt73+OrVq/PDH/4w2223Xfbcc88k7+4K3H777UuBXZIcdthhadSoUekxmm+//XaaNWtWtlbz5s3zpz/9KYsXLy6r9+3bNx06dMjhhx+ehx566EOveVMI7QAAAAAAADbSs88+m3PPPTd33HHHeo+Q3BhXXHFFKisrc8YZZ2zQ+Oeeey433HBDxowZs0nn22mnndK0adN8/vOfz6mnnppRo0aVju27776ZPHly7r///kycODEvvvhiBgwYkNdffz1J8sILLyR5911yo0ePzv3335+ampoMGjQozz777Eb3u//++6dZs2bZddddM2DAgFxyySXvu8acOXPy5JNPlvX6nnvvvTctW7ZMs2bNct111+WBBx5IdXV1kmTp0qVlj7BM3t1J2Lp169L76I488sj89Kc/zfTp07N27dosXLgw11xzTZLk5ZdfTpJ06NAhN910U+65557cc8892XnnnXPIIYdk7ty5H3yjN4HHYwIAAAAAAGyEhoaGnHDCCbn44ovTo0ePTV6ntrY2//7v/565c+eWPYbxg7z00ks56qijMmTIkIwePXqTzjlr1qysXLkyjzzySM4999x07949X/3qV5Ok7PGOe+yxR/bdd9907tw5d955Z0aOHJm1a9cmScaMGZMRI0Ykefexm9OnT8+Pf/zjXH755RvV709+8pO8/vrrmTdvXs4+++xcffXVOeecc9Ybd8stt2T33XfPPvvss96xgQMH5vHHH099fX3+7//9v/nyl79c2g24IUaPHp3nn38+X/ziF7NmzZq0atUq3/zmNzN+/PjSe/p69uxZ9gjQ/fffP88//3yuu+663H777Rt0ng1hpx0AAAAAAMBGeP311/PYY4/ltNNOS2VlZSorK3PJJZdk3rx5qayszIwZMzZonVmzZmXZsmXp1KlTaZ3Fixdn7Nix6dKlS9nYP//5zxk4cGD233///PCHP9zk3nfZZZfsvvvuGT16dL71rW9l/PjxHzh2++23T48ePfLcc88leXfHWZJ87nOfKxvXu3fvssdobmi/O++8cz73uc/lq1/9av7P//k/GT9+fBoaGsrGvPHGG5k6dWpGjhz5vmtUVVWle/fu2W+//XLLLbeksrIyt9xyS5Kkffv2WbZsWdn4d955J8uXLy+9K6+ioiJXXHFFVq5cmcWLF2fp0qWlcPDv37v3P+2zzz6l+/JxsdMOAAAAAABgI7Rq1Srz588vq/3gBz/IjBkzcvfdd2eXXXbZoHVOPvnkHHbYYWW1I488MieffHJpJ1vy7o61gQMHpl+/fpk0aVJpB9jmWrt2bd5+++0PPL5y5co8//zzOfnkk5MkXbp0SceOHfPMM8+UjVu4cGHZLr1N6Xft2rVZs2ZNaTffe+666668/fbbOemkkzb6mvr3758VK1aktrY2/fr1S5LMmDEja9euzb777ls2r3Hjxtlxxx2TJP/5n/+Z/v37p23bth94nscff7wUYn5chHYAAAAAAMBWb+XKlWU7p1588cU8/vjjad26dTp16pTzzjsvL730Um677bY0atQou+22W9n8du3apVmzZmX1j1qzTZs2adOmTdk6TZo0Sfv27UuPY3zppZdyyCGHpHPnzrn66qvz17/+tTT2vd1iSbJgwYJSmLZy5co8/vjjSZK+ffsmSW688cZ06tQpvXr1SpL893//d66++uqyd+mNGzcugwcPTufOnfPnP/85F110URo3blx6fGZFRUXOPvvsXHTRRdlzzz3Tt2/f3HrrrXn66adz9913b3C/U6ZMSZMmTbL77runadOmeeyxx3LeeeflK1/5Spo0aVJ2P2655ZYcd9xx692nN954I5dddlmOPfbYdOjQIfX19bnxxhvz0ksvZciQIUne3QF41FFHZfTo0bnpppuyZs2anHbaaRk6dGg6duyYJKmvr8/dd9+dQw45JG+99VYmTZqUu+66K7/97W9L55owYUJ22WWX9OnTJ2+99VZ+9KMfZcaMGZk2bdoG/643hNAOAAAAAADY6j322GMZOHBg6ftZZ52VJPna176WyZMn5+WXX17vEZCbu+aGeOCBB/Lcc8/lueeey0477VR2bN26daXPxxxzTBYvXpzk3Xfl7bXXXmVj1q5dm/POOy8vvvhiKisr061bt1xxxRUZM2ZMaY0//elP+epX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aXnqqady5513ZuXKlamtrd3sfFOnTs1VV12VRx99NM8//3xOPvnkzJw5M//2b/+We++9N3Pnzs2VV15Z2v6NN97IOeeck8WLF2fevHlp0aJFPvWpT2Xjxo3Njnv++efnq1/9aurr6zNy5MjMmDEjN910U2644YY88sgjefXVV/PTn/70Ha9FU1NTZs2alV69eqVz585Jkq5du+YXv/hFVq1a9V4vLQDwAdCq6AEAAAAAIEnuueeelJeXN1u2YcOG0uN99903kyZNKj3/yle+kgcffDC33357DjvssDQ1NeX666/PrFmzMnz48CTJzTffnP3226/ZMf/hH/6h9Lhnz5654oorcuihh6apqanZ+S+55JIMGTIkSXL66afn61//elasWJGePXsmST796U/n4YcfznnnnZckOemkk5qd54YbbkiXLl3y7LPPpl+/fqXlEydOzIknnlh6PnPmzHz9618vLbv22mvz4IMPvuP1eeONN1JZWZl77rknLVr86f8v/xvf+EZOPPHE9OjRI717987gwYNz7LHH5tOf/nRpGwDgg8v/WgMAAADwgXD00Ufnl7/8ZbO/H/7wh6X1GzZsyLRp09K/f//stddeKS8vz4MPPpiGhoYkyYoVK7Ju3bocfvjhpX322muv9OnTp9l56urqMnr06FRVVaVjx4456qijkqR0nD8bMGBA6fE+++yT9u3bl4Ldn5f95ddqLl++PJ/97GfTs2fP7L777unRo8dfPe4hhxxSevz666/nhRdeaDZzq1atmm3z167PokWLMnLkyHziE58o3VlXWVmZxx57LEuXLs1Xv/rVrF+/PqeeempGjRq12d1+AMAHjzvtAAAAAPhA6NChQ3r16tVs2e9+97vS4+nTp+e73/1uZs6cmf79+6dDhw6ZOHFi1q1b967P8cYbb2TkyJEZOXJkZs+enS5duqShoSEjR47c7DitW7cuPS4rK2v2/M/L/jKGjR49Ot27d891112Xbt26ZePGjenXr99mx+3QocO7nvf/3e8vr88Pf/jD7LHHHrnuuutyySWXlJb369cv/fr1y5e+9KV84QtfyJFHHpkFCxbk6KOP3qLzAgDvD3faAQAAALBDWLhwYY4//viMHTs2Bx10UHr27Jlly5aV1u+///5p3bp1Hn/88dKy1157rdk2v/71r/PKK6/kO9/5To488sj07du32d1yW+qVV17Jc889lwsvvDDDhw9PdXV1Xnvttb+53x577JHKyspmM69fvz51dXV/c9+ysrK0aNEib7755ttu85GPfCTJn2IlAPDB5k47AAAAAHYIBxxwQObMmZNHH300e+65Zy677LK89NJLpTBVXl6e008/PZMnT07nzp2z995754ILLmj2e25VVVVp06ZNrrzyynzhC1/IM888k2nTpm31bHvuuWc6d+6cH/zgB6msrExDQ0POP//8d7XvV7/61XznO9/JAQcckL59++ayyy7LmjVrNtvurbfeyosvvpjkTzHyqquuSlNTU0aPHp0k+eIXv5hu3brlmGOOyX777ZcXXnghl1xySbp06ZLBgwdv9WsEALYvd9oBAAAAsEO48MILU1NTk5EjR2bYsGHp2rVrTjjhhGbbTJ8+PUceeWRGjx6dESNG5IgjjsigQYNK67t06ZKbbropP/nJT/KRj3wk3/nOd3LppZdu9WwtWrTIbbfdlrq6uvTr1y//9E//lOnTp7+rfc8999yMGzcup556agYPHpyOHTvmU5/61GbbPfDAA6msrExlZWUOP/zwPPHEE/nJT36SYcOGJUlGjBiRX/ziFxkzZkx69+6dk046KbvttlvmzZuXzp07b/VrBAC2r7JNmzZtKnoIAAAAYNezZMmSDBo0KHV1dampqSl6HICdns/dd2/o0KHp0aNHbrnllqJHId4Pdh3utAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAArWqugBAAAAgF1bfX190SMA7BJ83gJ8sIl2AAAAQCEqKirSvn37jB07tuhRAHYZ7du3T0VFRdFjAPBXiHYAAABAIaqqqlJfX5/Gxsbtdo4JEyaksrIy06ZN227nANgW3q/Pq4qKilRVVW3XcwCwZUQ7AAAAoDBVVVXb9R+Py8vL07lz59TU1Gy3cwBsCz6vAGhR9AAAAAAAAACwqxPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAD4gOjRo0dmzpxZ9BgAf5PPK4BtT7QDAAAAAACAgol2AAAAAAAAUDDRDgAAANilvfHGGxk/fnzKy8tTWVmZGTNmZNiwYZk4cWKSP30F3CWXXFLapnv37rn77rvz8ssv5/jjj095eXkGDBiQxYsXNzvuHXfckQMPPDBt27ZNjx49MmPGjGbrV69endGjR6ddu3b58Ic/nNmzZ28225o1azJhwoR06dIlu+++e4455pg89dRT2+1aAB9sPq8Adm6iHQAAALBLmzx5chYsWJC77rorc+fOzfz587NkyZJm21x++eUZMmRInnzyyXzyk5/MuHHjMn78+IwdOzZLlizJ/vvvn/Hjx2fTpk1Jkrq6upx88sk55ZRTsnTp0kydOjUXXXRRbrrpptIxa2tr8/zzz+fhhx/OnDlzcvXVV2f16tXNzjtmzJisXr06999/f+rq6lJTU5Phw4fn1Vdf3e7XBfjg8XkFsHNrVfQAAAAAAEVpamrK9ddfn1mzZmX48OFJkptvvjn77bdfs+2OPfbYnHXWWUmSKVOm5Jprrsmhhx6aMWPGJEnOO++8DB48OC+99FK6du2ayy67LMOHD89FF12UJOndu3eeffbZTJ8+PbW1tVm2bFnuv//+LFq0KIceemiS5Prrr091dXXpnI888kgWLVqU1atXp23btkmSSy+9NHfeeWfmzJmTM888c/teHOADxecVwM7PnXYAAADALmvFihVZt25dDj/88NKyvfbaK3369Gm23YABA0qP99lnnyRJ//79N1v25ztP6uvrM2TIkGbHGDJkSJYvX54NGzakvr4+rVq1yqBBg0rr+/btm06dOpWeP/XUU2lqakrnzp1TXl5e+vvtb3+bFStWbOUrB3Y0Pq8Adn7utAMAAAD4G1q3bl16XFZW9rbLNm7cuM3O2dTUlMrKysyfP3+zdX/5j+UAf8nnFcCOy512AAAAwC5r//33T+vWrfP444+Xlr322mtZtmzZVh23uro6CxcubLZs4cKF6d27d1q2bJm+fftm/fr1qaurK61/7rnnsmbNmtLzmpqavPjii2nVqlV69erV7K+iomKr5gN2PD6vAHZ+oh0AAACwyyovL8/pp5+eyZMn56GHHsozzzyT2tratGixdf9kcu6552bevHmZNm1ali1blptvvjlXXXVVJk2alCTp06dPRo0albPOOiuPP/546urqMmHChLRr1650jBEjRmTw4ME54YQTMnfu3KxcuTKPPvpoLrjggixevHir5gN2PD6vAHZ+oh0AAACwS5s+fXqOPPLIjB49OiNGjMgRRxzR7LebtkRNTU1uv/323HbbbenXr1+mTJmSiy++OLW1taVtbrzxxnTr1i1HHXVUTjzxxJx55pnZe++9S+vLyspy3333ZejQoTnttNPSu3fvnHLKKVm1alXpN6mAXYvPK4CdW9mmTZs2FT0EAAAAwPYwdOjQ9OjRI7fccst72m/YsGE5+OCDM3PmzO0zGMD/w+fVB8uWvh9sH94PdhXutAMAAAAAAICCiXYAAAAAAABQsFZFDwAAAADwQTN//vyiRwB4V3xeAew83GkHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCtSp6AAAAAAAAeC8aGhrS2Ni43Y7f1NSUV155JUuWLNlu5+Dde7/ej4qKilRVVW3Xc8A7Ee0AAAAAANhhNDQ0pLq6OmvXrt2u53nyySdz3333bddz8O69H+9H+/btU19fL9xRGNEOAAAAAIAdRmNjY9auXZtZs2alurq66HHYSdTX12fs2LFpbGwU7SiMaAcAAAAAwA6nuro6NTU1RY8BsM20KHoAAAAAAAAA2NWJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAfAAMGzYsEydOLHqM96S2tjYnnHBC0WPATkG0AwAAAACAd+ntItX8+fNTVlaWNWvWvO8zfZDU1tamrKys9Ne5c+eMGjUqTz/9dLPtrrvuuhx00EEpLy9Pp06dMnDgwHz7298uaGr4YBDtAAAAAACAd/THP/7xXW87atSovPDCC3nhhRcyb968tGrVKscdd1xp/Q033JCJEyfm7LPPzi9/+cssXLgwX/va19LU1LQ9RocdhmgHAAAAAADb0CuvvJLPfvaz2XfffdO+ffv0798/P/rRj5pt88Ybb2T8+PEpLy9PZWVlZsyYsdlxbr311hxyyCHp2LFjunbtms997nNZvXp1af2f7+578MEHM3DgwLRr1y7HHHNMVq9enfvvvz/V1dXZfffd87nPfS5r164t7ffAAw/kiCOOSKdOndK5c+ccd9xxWbFiRWn9ypUrU1ZWlh//+Mc56qijsttuu2X27NnZsGFDzjnnnNJ+X/va17Jp06bN5m7btm26du2arl275uCDD87555+f559/Pi+//HKS5O67787JJ5+c008/Pb169cqBBx6Yz372s/nmN7+51dcedmSiHQAAAAAAbEN/+MMfMmjQoNx777155plncuaZZ2bcuHFZtGhRaZvJkydnwYIFueuuuzJ37tzMnz8/S5YsaXacP/7xj5k2bVqeeuqp3HnnnVm5cmVqa2s3O9/UqVNz1VVX5dFHH83zzz+fk08+OTNnzsy//du/5d57783cuXNz5ZVXlrZ/4403cs4552Tx4sWZN29eWrRokU996lPZuHFjs+Oef/75+epXv5r6+vqMHDkyM2bMyE033ZQbbrghjzzySF599dX89Kc/fcdr0dTUlFmzZqVXr17p3LlzkqRr1675xS9+kVWrVr3XSws7tVZFDwAAAAAAADuSe+65J+Xl5c2WbdiwofR43333zaRJk0rPv/KVr+TBBx/M7bffnsMOOyxNTU25/vrrM2vWrAwfPjxJcvPNN2e//fZrdsx/+Id/KD3u2bNnrrjiihx66KFpampqdv5LLrkkQ4YMSZKcfvrp+frXv54VK1akZ8+eSZJPf/rTefjhh3PeeeclSU466aRm57nhhhvSpUuXPPvss+nXr19p+cSJE3PiiSeWns+cOTNf//rXS8uuvfbaPPjgg+94fd54441UVlbmnnvuSYsWf7qP6Bvf+EZOPPHE9OjRI717987gwYNz7LHH5tOf/nRpG9gV+a8fAAAAAADeg6OPPjq//OUvm/398Ic/LK3fsGFDpk2blv79+2evvfZKeXl5HnzwwTQ0NCRJVqxYkXXr1uXwww8v7bPXXnulT58+zc5TV1eX0aNHp6qqKh07dsxRRx2VJKXj/NmAAQNKj/fZZ5+0b9++FOz+vOwvv1Zz+fLl+exnP5uePXtm9913T48ePf7qcQ855JDS49dffz0vvPBCs5lbtWrVbJu/dn0WLVqUkSNH5hOf+ETpzrrKyso89thjWbp0ab761a9m/fr1OfXUUzNq1KjN7vaDXYk77QAAAAAA4D3o0KFDevXq1WzZ7373u9Lj6dOn57vf/W5mzpyZ/v37p0OHDpk4cWLWrVv3rs/xxhtvZOTIkRk5cmRmz56dLl26pKGhISNHjtzsOK1bty49Lisra/b8z8v+MoaNHj063bt3z3XXXZdu3bpl48aN6dev32bH7dChw7ue9//d7y+vzw9/+MPsscceue6663LJJZeUlvfr1y/9+vXLl770pXzhC1/IkUcemQULFuToo4/eovPCjs6ddgAAAAAAsA0tXLgwxx9/fMaOHZuDDjooPXv2zLJly0rr999//7Ru3TqPP/54adlrr73WbJtf//rXeeWVV/Kd73wnRx55ZPr27dvsbrkt9corr+S5557LhRdemOHDh6e6ujqvvfba39xvjz32SGVlZbOZ169fn7q6ur+5b1lZWVq0aJE333zzbbf5yEc+kuRPsRJ2Ve60AwAAAACAbeiAAw7InDlz8uijj2bPPffMZZddlpdeeqkUpsrLy3P66adn8uTJ6dy5c/bee+9ccMEFzX7PraqqKm3atMmVV16ZL3zhC3nmmWcybdq0rZ5tzz33TOfOnfODH/wglZWVaWhoyPnnn/+u9v3qV7+a73znOznggAPSt2/fXHbZZVmzZs1m27311lt58cUXk/wpRl511VVpamrK6NGjkyRf/OIX061btxxzzDHZb7/98sILL+SSSy5Jly5dMnjw4K1+jbCjcqcdAAAAAABsQxdeeGFqamoycuTIDBs2LF27ds0JJ5zQbJvp06fnyCOPzOjRozNixIgcccQRGTRoUGl9ly5dctNNN+UnP/lJPvKRj+Q73/lOLr300q2erUWLFrnttttSV1eXfv365Z/+6Z8yffr0d7Xvueeem3HjxuXUU0/N4MGD07Fjx3zqU5/abLsHHngglZWVqayszOGHH54nnngiP/nJTzJs2LAkyYgRI/KLX/wiY8aMSe/evXPSSSdlt912y7x589K5c+etfo2woyrbtGnTpqKHAAAAANgehg4dmh49euSWW24pehSAd+Tz6t1bsmRJBg0alLq6utTU1BQ9DjsJ/13xQeBOOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCtih4AAAAAAADeq/r6+qJHYCfivyc+CEQ7AAAAAAB2GBUVFWnfvn3Gjh1b9CjsZNq3b5+Kioqix2AXJtoBAAAAALDDqKqqSn19fRobG7fbOSZMmJDKyspMmzZtu52Dd+/9ej8qKipSVVW1Xc8B70S0AwAAAABgh1JVVbVd40p5eXk6d+6cmpqa7XYO3j3vB7uKFkUPAAAAAAAAALs60Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAADYgfXo0SMzZ84segz+f7wfbCnRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAHiP3njjjYwfPz7l5eWprKzMjBkzMmzYsEycODHJn74i8ZJLLilt071799x99915+eWXc/zxx6e8vDwDBgzI4sWLmx33jjvuyIEHHpi2bdumR48emTFjRrP1q1evzujRo9OuXbt8+MMfzuzZszebbc2aNZkwYUK6dOmS3XffPcccc0yeeuqp7XYtPgi8H+wMRDsAAAAAAHiPJk+enAULFuSuu+7K3LlzM3/+/CxZsqTZNpdffnmGDBmSJ598Mp/85Cczbty4jB8/PmPHjs2SJUuy//77Z/z48dm0aVOSpK6uLieffHJOOeWULF26NFOnTs1FF12Um266qXTM2traPP/883n44YczZ86cXH311Vm9enWz844ZMyarV6/O/fffn7q6utTU1GT48OF59dVXt/t1KYr3g51Bq6IHAAAAAACAHUlTU1Ouv/76zJo1K8OHD0+S3Hzzzdlvv/2abXfsscfmrLPOSpJMmTIl11xzTQ499NCMGTMmSXLeeedl8ODBeemll9K1a9dcdtllGT58eC666KIkSe/evfPss89m+vTpqa2tzbJly3L//fdn0aJFOfTQQ5Mk119/faqrq0vnfOSRR7Jo0aKsXr06bdu2TZJceumlufPOOzNnzpyceeaZ2/fiFMD7wc7CnXYAAAAAAPAerFixIuvWrcvhhx9eWrbXXnulT58+zbYbMGBA6fE+++yTJOnfv/9my/58Z1Z9fX2GDBnS7BhDhgzJ8uXLs2HDhtTX16dVq1YZNGhQaX3fvn3TqVOn0vOnnnoqTU1N6dy5c8rLy0t/v/3tb7NixYqtfOUfTN4PdhbutAMAAAAAgO2gdevWpcdlZWVvu2zjxo3b7JxNTU2prKzM/PnzN1v3lzFpV+T94IPOnXYAAAAAAPAe7L///mndunUef/zx0rLXXnsty5Yt26rjVldXZ+HChc2WLVy4ML17907Lli3Tt2/frF+/PnV1daX1zz33XNasWVN6XlNTkxdffDGtWrVKr169mv1VVFRs1XwfVN4PdhaiHQAAAAAAvAfl5eU5/fTTM3ny5Dz00EN55plnUltbmxYttu6f3M8999zMmzcv06ZNy7Jly3LzzTfnqquuyqRJk5Ikffr0yahRo3LWWWfl8ccfT11dXSZMmJB27dqVjjFixIgMHjw4J5xwQubOnZuVK1fm0UcfzQUXXJDFixdv1XwfVN4PdhaiHQAAAAAAvEfTp0/PkUcemdGjR2fEiBE54ogjmv222ZaoqanJ7bffnttuuy39+vXLlClTcvHFF6e2tra0zY033phu3brlqKOOyoknnpgzzzwze++9d2l9WVlZ7rvvvgwdOjSnnXZaevfunVNOOSWrVq0q/Wbbzsj7wc6gbNOmTZuKHgIAAABgexg6dGh69OiRW265pehRAN6Rz6sPli19P4YNG5aDDz44M2fO3D6D7aK8H+wq3GkHAAAAAAAABRPtAAAAAAAAoGCtih4AAAAAAAB2BvPnzy96BP6C94MdjTvtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQsFZFDwAAAAAA8EHX0NCQxsbG7Xb8pqamvPLKK1myZMl2O0eSVFRUpKqqarueA4AtI9oBAAAAALyDhoaGVFdXZ+3atdv1PE8++WTuu+++7XqO9u3bp76+XrgD+AAS7QAAAAAA3kFjY2PWrl2bWbNmpbq6uuhxtlh9fX3Gjh2bxsZG0Q7gA0i0AwAAAAB4F6qrq1NTU1P0GADspFoUPQAAAAAAAADs6kQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAC8g7vvvrvoEUrGjRuXb33rW9vkWOvWrUuPHj2yePHibXI8ALaOaAcAAAAA7PJqa2tTVlaWsrKytGnTJr169crFF1+c9evXFz1ayVNPPZX77rsvZ5999rve53vf+1569OiR3XbbLePHj2+2rk2bNpk0aVLOO++8bT0qAFtAtAMAAAAASDJq1Ki88MILWb58ec4999xMnTo106dPL3qskiuvvDJjxoxJeXn5u9r+xz/+cc4555x84xvfyJIlS9K7d+8kyauvvlra5vOf/3weeeSR/OpXv9ouMwPw7ol2AAAAAABJ2rZtm65du6Z79+754he/mBEjRjT7asxHH3001dXVKS8vLwW+P3viiSfy8Y9/PBUVFdljjz1y1FFHZcmSJaX1mzZtytSpU1NVVZW2bdumW7duze6Ye+uttzJp0qTsu+++6dChQw4//PDMnz+/tH7Dhg2ZM2dORo8e3Wzmq6++OgcccEB222237LPPPvn0pz9dWnfZZZfljDPOyGmnnZaPfOQj+ed//uckyV133VXaZs8998yQIUNy2223bf0FBGCriHYAAAAAAH9Fu3btsm7dutLzWbNm5dZbb81//dd/paGhIZMmTSqt+/3vf59TTz01jzzySH7xi1/kgAMOyLHHHpvf//73SZI77rgjl19+eb7//e9n+fLlufPOO9O/f//S/l/+8pfz2GOP5bbbbsvTTz+dMWPGZNSoUVm+fHmS5Omnn87rr7+eQw45pLTP4sWLc/bZZ+fiiy/Oc889lwceeCBDhw5N8qffq6urq8uIESNK27do8ad/Dl66dGmz13nYYYfl5z//+ba6bABsoVZFDwAAAAAA8EGyadOmzJs3Lw8++GC+8pWvlJZ//etfL0WzL3/5y7n44otL64455phmx/jBD36QTp06ZcGCBTnuuOPS0NCQrl27ZsSIEWndunWqqqpy2GGHJUkaGhpy4403pqGhId26dUuSTJo0KQ888EBuvPHGfOtb38qqVavSsmXL7L333qVzNDQ0pEOHDjnuuOPSsWPHdO/ePQMHDkySNDY2ZsOGDdlnn302e32NjY3Nnnfr1i2rVq3amksGwDbgTjsAAAAAgCT33HNPysvLs9tuu+UTn/hEPvOZz2Tq1Kml9R/60IdKjysrK7N69erS85deeilnnHFGDjjggOyxxx7Zfffd09TUlIaGhiTJmDFj8uabb6Znz54544wz8tOf/jTr169P8qc73zZs2JDevXunvLy89LdgwYKsWLEiSfLmm2+mbdu2KSsrK53z4x//eLp3756ePXtm3LhxmT17dtauXfueX3e7du22aD8Ati132gEAAAAAJDn66KNzzTXXpE2bNunWrVtatXr7fz4tKyvLpk2bSs9PPfXUvPLKK/nud7+b7t27p23bthk8eHDp6zU/9KEP5bnnnsvPfvaz/Od//me+9KUvZfr06VmwYEGamprSsmXL1NXVpWXLls3OU15eniSpqKjI2rVrs27durRp0yZJ0rFjxyxZsiTz58/P3LlzM2XKlEydOjVPPPFEKioq0rJly7z00kubzV5RUdHs+auvvpouXbps2UUDYJtxpx0AAAAAQJIOHTqkV69eqaqqesdg99csXLgwZ599do499tgceOCBadu27WZfQ9muXbuMHj06V1xxRebPn5/HHnssS5cuzcCBA7Nhw4asXr06vXr1avbXtWvXJMnBBx+cJHn22WebHbNVq1YZMWJE/vVf/zVPP/10Vq5cmYceeiht2rTJoEGDMm/evNK2GzduTJJmv6WXJM8880zpazUBKI477QAAAAAAttIBBxyQW2+9NYccckj+93//N5MnT067du1K62+66aZs2LAhhx9+eNq3b59Zs2alXbt26d69ezp37pzPf/7zGT9+fGbMmJGBAwfm5Zdfzrx58zJgwIB88pOfTJcuXVJTU5NHHnmkFPDuueee/OY3v8nQoUOz55575r777svGjRvTp0+fJMk555yTU089NYccckgOO+ywfPvb306S/P3f/32z2X/+859n2rRp78+FAuBtudMOAAAAAGArXX/99XnttddSU1OTcePG5eyzz87ee+9dWt+pU6dcd911GTJkSAYMGJCf/exn+Y//+I907tw5SXLjjTdm/PjxOffcc9OnT5+ccMIJeeKJJ1JVVVU6xoQJEzJ79uxmx/z3f//3HHPMMamurs61116bH/3oRznwwAOTJJ/5zGdy6aWXZsqUKTn44IPz3HPPJUnpnEny2GOP5fXXX8+nP/3p7Xp9APjbyjb95RcvAwAAAOxEhg4dmh49euSWW24pehRgB7ZkyZIMGjQodXV1qampKWyON998M3369MmPf/zjDB48+D3v/9dex2c+85kcdNBB+ed//udtPe4Ozf9+fLB4P9hVuNMOAAAAAGAH0K5du9xyyy2b/Vbellq3bl369++ff/qnf9omxwNg6/hNOwAAAACAHcSwYcO22bHatGmTCy+8cJsdD4Ct4047AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFaFT0AAAAAAMCOoL6+vugRtsqOPj/Azk60AwAAAAB4BxUVFWnfvn3Gjh1b9ChbrX379qmoqCh6DAD+CtEOAAAAAOAdVFVVpb6+Po2NjdvtHBMmTEhlZWWmTZu23c6R/ClAVlVVbddzALBlRDsAAAAAgL+hqqpqu8au8vLydO7cOTU1NdvtHAB8sLUoegAAAAAAAADY1Yl2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAA8J706NEjM2fOLHoMgJ2KaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAMAO4I033sj48eNTXl6eysrKzJgxI8OGDcvEiROT/OkrKy+55JLSNt27d8/dd9+dl19+Occff3zKy8szYMCALF68uNlx77jjjhx44IFp27ZtevTokRkzZjRbv3r16owePTrt2rXLhz/84cyePXuz2dasWZMJEyakS5cu2X333XPMMcfkqaee2m7XAmBnJNoBAAAAAOwAJk+enAULFuSuu+7K3LlzM3/+/CxZsqTZNpdffnmGDBmSJ598Mp/85Cczbty4jB8/PmPHjs2SJUuy//77Z/z48dm0aVOSpK6uLieffHJOOeWULF26NFOnTs1FF12Um266qXTM2traPP/883n44YczZ86cXH311Vm9enWz844ZMyarV6/O/fffn7q6utTU1GT48OF59dVXt/t1AdhZtCp6AAAAAAAA3llTU1Ouv/76zJo1K8OHD0+S3Hzzzdlvv/2abXfsscfmrLPOSpJMmTIl11xzTQ499NCMGTMmSXLeeedl8ODBeemll9K1a9dcdtllGT58eC666KIkSe/evfPss89m+vTpqa2tzbJly3L//fdn0aJFOfTQQ5Mk119/faqrq0vnfOSRR7Jo0aKsXr06bdu2TZJceumlufPOOzNnzpyceeaZ2/fiAOwk3GkHAAAAAPABt2LFiqxbty6HH354adlee+2VPn36NNtuwIABpcf77LNPkqR///6bLfvznXL19fUZMmRIs2MMGTIky5cvz4YNG1JfX59WrVpl0KBBpfV9+/ZNp06dSs+feuqpNDU1pXPnzikvLy/9/fa3v82KFSu28pUD7DrcaQcAAAAAsJNo3bp16XFZWdnbLtu4ceM2O2dTU1MqKyszf/78zdb9ZdwD4J250w4AAAAA4ANu//33T+vWrfP444+Xlr322mtZtmzZVh23uro6CxcubLZs4cKF6d27d1q2bJm+fftm/fr1qaurK61/7rnnsmbNmtLzmpqavPjii2nVqlV69erV7K+iomKr5gPYlYh2AAAAAAAfcOXl5Tn99NMzefLkPPTQQ3nmmWdSW1ubFi227p94zz333MybNy/Tpk3LsmXLcvPNN+eqq67KpEmTkiR9+vTJqFGjctZZZ+Xxxx9PXV1dJkyYkHbt2pWOMWLEiAwePDgnnHBC5s6dm5UrV+bRRx/NBRdckMWLF2/VfAC7EtEOAAAAAGAHMH369Bx55JEZPXp0RowYkSOOOKLZb81tiZqamtx+++257bbb0q9fv0yZMiUXX3xxamtrS9vceOON6datW4466qiceOKJOfPMM7P33nuX1peVleW+++7L0KFDc9ppp6V379455ZRTsmrVqtJv6AHwt/lNOwAAAACAHUB5eXluvfXW3HrrraVl9957b+nxypUrN9tn06ZNzZ736NFjs2UnnXRSTjrppLc9b9euXXPPPfc0WzZu3Lhmzzt27JgrrrgiV1xxxd98HQD8de60AwAAAAAAgIKJdgAAAAAAAFAwX48JAAAAALCDmj9/ftEjALCNuNMOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFa1X0AAAAAAAAwI6roaEhjY2N2+34TU1NeeWVV7JkyZLtdo4kqaioSFVV1XY9B7wT0Q4AAAAAANgiDQ0Nqa6uztq1a7freZ588sncd9992/Uc7du3T319vXBHYUQ7AAAAAABgizQ2Nmbt2rWZNWtWqqurix5ni9XX12fs2LFpbGwU7SiMaAcAAAAAAGyV6urq1NTUFD0G7NBaFD0AAAAAAAAA7OpEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAFvk7rvvLnqEknHjxuVb3/rWNjveRz/60dxxxx3b7Hjwt4h2AAAAAADA26qtrU1ZWVnKysrSpk2b9OrVKxdffHHWr19f9GglTz31VO67776cffbZ72r7//qv/8ro0aPTrVu3lJWV5eGHH95smwsvvDDnn39+Nm7cuK3Hhb9KtAMAAAAAAN7RqFGj8sILL2T58uU599xzM3Xq1EyfPr3osUquvPLKjBkzJuXl5e9q+zfeeCMHHXRQvve9773tNp/4xCfy+9//Pvfff/+2GhPekWgHAAAAAAC8o7Zt26Zr167p3r17vvjFL2bEiBHNvhrz0UcfTXV1dcrLy0uB78+eeOKJfPzjH09FRUX22GOPHHXUUVmyZElp/aZNmzJ16tRUVVWlbdu26datW7M75t56661MmjQp++67bzp06JDDDz888+fPL63fsGFD5syZk9GjRzeb+eqrr84BBxyQ3XbbLfvss08+/elPl9Z94hOfyCWXXJJPfepTb/uaW7ZsmWOPPTa33XbbFl0zeK9EOwAAAAAA4D1p165d1q1bV3o+a9as3Hrrrfmv//qvNDQ0ZNKkSaV1v//973PqqafmkUceyS9+8YsccMABOfbYY/P73/8+SXLHHXfk8ssvz/e///0sX748d955Z/r371/a/8tf/nIee+yx3HbbbXn66aczZsyYjBo1KsuXL0+SPP3003n99ddzyCGHlPZZvHhxzj777Fx88cV57rnn8sADD2To0KHv+XUedthh+fnPf/6e94Mt0aroAQAAAAAAgB3Dpk2bMm/evDz44IP5yle+Ulr+9a9/vRTNvvzlL+fiiy8urTvmmGOaHeMHP/hBOnXqlAULFuS4445LQ0NDunbtmhEjRqR169apqqrKYYcdliRpaGjIjTfemIaGhnTr1i1JMmnSpDzwwAO58cYb861vfSurVq1Ky5Yts/fee5fO0dDQkA4dOuS4445Lx44d07179wwcOPA9v95u3brl+eefz8aNG9Oihfug2L78FwYAAAAAALyje+65J+Xl5dltt93yiU98Ip/5zGcyderU0voPfehDpceVlZVZvXp16flLL72UM844IwcccED22GOP7L777mlqakpDQ0OSZMyYMXnzzTfTs2fPnHHGGfnpT3+a9evXJ0mWLl2aDRs2pHfv3ikvLy/9LViwICtWrEiSvPnmm2nbtm3KyspK5/z4xz+e7t27p2fPnhk3blxmz56dtWvXvufX3a5du2zcuDFvvfXWe94X3it32gEAAAAAAO/o6KOPzjXXXJM2bdqkW7duadXq7fNCWVlZNm3aVHp+6qmn5pVXXsl3v/vddO/ePW3bts3gwYNLX6/5oQ99KM8991x+9rOf5T//8z/zpS99KdOnT8+CBQvS1NSUli1bpq6uLi1btmx2nvLy8iRJRUVF1q5dm3Xr1qVNmzZJko4dO2bJkiWZP39+5s6dmylTpmTq1Kl54okn0qlTp3f9ul999dV06NAh7dq1e9f7wJYS7QAAAAAAgHfUoUOH9OrVa4v2XbhwYa6++uoce+yxSZLnn38+jY2NzbZp165dRo8endGjR+cf//Ef07dv3yxdujQDBw7Mhg0bsnr16hx55JF/9fgHH3xwkuTZZ58tPU6SVq1aZcSIERkxYkS+8Y1vpFOnTnnooYdy4oknvuvZn3nmmS36Wk3YEqIdAAAAAACw3RxwwAG59dZbc8ghh+R///d/M3ny5GZ3rt10003ZsGFDDj/88LRv3z6zZs1Ku3bt0r1793Tu3Dmf//znM378+MyYMSMDBw7Myy+/nHnz5mXAgAH55Cc/mS5duqSmpiaPPPJIKdrdc889+c1vfpOhQ4dmzz33zH333ZeNGzemT58+SZKmpqb893//d2mG//mf/0mSvPDCC81m//nPf56/+7u/285XCP7Eb9oBAAAAAADbzfXXX5/XXnstNTU1GTduXM4+++zsvffepfWdOnXKddddlyFDhmTAgAH52c9+lv/4j/9I586dkyQ33nhjxo8fn3PPPTd9+vTJCSeckCeeeCJVVVWlY0yYMCGzZ89udsx///d/zzHHHJPq6upce+21+dGPfpQDDzwwSbJ48eIMHDiwdBfdZZddliS59tprS8f4v//3/+bRRx/Naaedtv0uDvyFsk1/+cWyAAAAADuRoUOHpkePHrnllluKHgXgHfm8+mDxfrx7S5YsyaBBg1JXV5eamprC5njzzTfTp0+f/PjHP87gwYPf8/5/7XWcd955ee211/KDH/xgW48Lf5WvxwQAAAAAAHZo7dq1yy233LLZb+Vtjb333jvnnHPONjse/C2iHQAAAAAAsMMbNmzYNj3eueeeu02PB3+L37QDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFKxV0QMAAAAAAAA7tvr6+qJH2Co7+vzsHEQ7AAAAAABgi1RUVKR9+/YZO3Zs0aNstfbt26eioqLoMdiFiXYAAAAAAMAWqaqqSn19fRobG7fbOSZMmJDKyspMmzZtu50j+VOArKqq2q7ngHci2gEAAAAAAFusqqpqu8au8vLydO7cOTU1NdvtHPBB0KLoAQAAAAAAAGBXJ9oBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAsI306NEjM2fOLHoMdkCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAMAO7Y033sj48eNTXl6eysrKzJgxI8OGDcvEiROT/OkrKy+55JLSNt27d8/dd9+dl19+Occff3zKy8szYMCALF68uNlx77jjjhx44IFp27ZtevTokRkzZjRbv3r16owePTrt2rXLhz/84cyePXuz2dasWZMJEyakS5cu2X333XPMMcfkqaee2m7Xgh2XaAcAAAAAAOzQJk+enAULFuSuu+7K3LlzM3/+/CxZsqTZNpdffnmGDBmSJ598Mp/85Cczbty4jB8/PmPHjs2SJUuy//77Z/z48dm0aVOSpK6uLieffHJOOeWULF26NFOnTs1FF12Um266qXTM2traPP/883n44YczZ86cXH311Vm9enWz844ZMyarV6/O/fffn7q6utTU1GT48OF59dVXt/t1YcfSqugBAAAAAAAAtlRTU1Ouv/76zJo1K8OHD0+S3Hzzzdlvv/2abXfsscfmrLPOSpJMmTIl11xzTQ499NCMGTMmSXLeeedl8ODBeemll9K1a9dcdtllGT58eC666KIkSe/evfPss89m+vTpqa2tzbJly3L//fdn0aJFOfTQQ5Mk119/faqrq0vnfOSRR7Jo0aKsXr06bdu2TZJceumlufPOOzNnzpyceeaZ2/fisENxpx0AAAAAALDDWrFiRdatW5fDDz+8tGyvvfZKnz59mm03YMCA0uN99tknSdK/f//Nlv35Trn6+voMGTKk2TGGDBmS5cuXZ8OGDamvr0+rVq0yaNCg0vq+ffumU6dOpedPPfVUmpqa0rlz55SXl5f+fvvb32bFihVb+crZ2bjTDgAAAAAA2Om1bt269LisrOxtl23cuHGbnbOpqSmVlZWZP3/+Zuv+Mu5B4k47AAAAAABgB7b//vundevWefzxx0vLXnvttSxbtmyrjltdXZ2FCxc2W7Zw4cL07t07LVu2TN++fbN+/frU1dWV1j/33HNZs2ZN6XlNTU1efPHFtGrVKr169Wr2V1FRsVXzsfMR7QAAAAAAgB1WeXl5Tj/99EyePDkPPfRQnnnmmdTW1qZFi61LIOeee27mzZuXadOmZdmyZbn55ptz1VVXZdKkSUmSPn36ZNSoUTnrrLPy+OOPp66uLhMmTEi7du1KxxgxYkQGDx6cE044IXPnzs3KlSvz6KOP5oILLsjixYu3aj52PqIdAAAAAACwQ5s+fXqOPPLIjB49OiNGjMgRRxzR7LfmtkRNTU1uv/323HbbbenXr1+mTJmSiy++OLW1taVtbrzxxnTr1i1HHXVUTjzxxJx55pnZe++9S+vLyspy3333ZejQoTnttNPSu3fvnHLKKVm1alXpN/Tgz/ymHQAAAAAAsEMrLy/PrbfemltvvbW07N577y09Xrly5Wb7bNq0qdnzHj16bLbspJNOykknnfS25+3atWvuueeeZsvGjRvX7HnHjh1zxRVX5Iorrvibr4NdmzvtAAAAAAAAoGCiHQAAAAAAABTM12MCAAAAAAA7nfnz5xc9Arwn7rQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBWhU9AADw/mtoaEhjY2PRY2y1ioqKVFVVFT0GAAAAAGw10Q4AdjENDQ2prq7O2rVrix5lq7Vv3z719fXCHQAAAAA7PNEOAHYxjY2NWbt2bWbNmpXq6uqix9li9fX1GTt2bBobG0U7AAAAAHZ4oh0A7KKqq6tTU1NT9BgAAAAAQJIWRQ8AAAAAAAAAuzrRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAKMW7cuHzrW99qtuy5555L165d8/vf/36Lj9vY2Ji99947v/vd75otP+WUUzJjxowtPi4AAAAAbE+iHQDs4F588cV85StfSc+ePdO2bdt86EMfyujRozNv3rztet6bbropnTp12qJ9n3rqqdx33305++yzmy3/+te/nq985Svp2LFjkuQPf/hDamtr079//7Rq1SonnHDC3zx2RUVFxo8fn2984xvNll944YX55je/mddff32LZgYAAACA7Um0A4Ad2MqVKzNo0KA89NBDmT59epYuXZoHHnggRx99dP7xH//xr+7zxz/+8X2ecnNXXnllxowZk/Ly8tKyhoaG3HPPPamtrS0t27BhQ9q1a5ezzz47I0aMeNfHP+200zJ79uy8+uqrpWX9+vXL/vvvn1mzZm2T1wAAAAAA25JoBwA7sC996UspKyvLokWLctJJJ6V379458MADc8455+QXv/hFkqSsrCzXXHNN/v7v/z4dOnTIDTfckCSZP39+ampqsttuu6Vnz575l3/5l6xfv7507Msuuyz9+/dPhw4d8qEPfShf+tKX0tTUVNr3tNNOy+uvv56ysrKUlZVl6tSpSZK33norkyZNyr777psOHTrk8MMPz/z580vH3bBhQ+bMmZPRo0c3ey233357DjrooOy7776lZR06dMg111yTM844I127dn3X1+XAAw9Mt27d8tOf/rTZ8tGjR+e2225718cBAAAAgPeLaAcAO6hXX301DzzwQP7xH/8xHTp02Gz9X3515dSpU/OpT30qS5cuzd///d8nSaZMmZKvfvWrefbZZ/P9738/N910U775zW+W9mnRokWuuOKK/OpXv8rNN9+chx56KF/72teSJB/72Mcyc+bM7L777nnhhRfywgsvZNKkSUmSL3/5y3nsscdy22235emnn86YMWMyatSoLF++PEny9NNP5/XXX88hhxzSbN6f//znmy3bGocddlh+/vOfb7Zs0aJFeeutt7bZeQAAAABgWxDtAGAH9d///d/ZtGlT+vbt+ze3/dznPpfTTjstPXv2TGVlZZKktrY2p556anr27JmPf/zjmTZtWr7//e+X9pk4cWKOPvro9OjRI8ccc0wuueSS3H777UmSNm3aZI899khZWVm6du2arl27pry8PA0NDbnxxhvzk5/8JEceeWT233//TJo0KUcccURuvPHGJMmqVavSsmXL7L333s1mXLVqVbp167atLk+6deuWVatWbbZs3bp1efHFF7fZeQAAAABgW2hV9AAAwJbZtGnTu972r93B9sMf/jA33XRT6fmGDRvyhz/8IWvXrk379u3zs5/9LN/+9rfz61//Ov/7v/+b9evXN1v/1yxdujQbNmxI7969my1/66230rlz5yTJm2++mbZt26asrKzZNm+++WZ22223d/2a/pZ27dpl7dq1my1LstlyAAAAACiaaAcAO6gDDjggZWVl+fWvf/03t/1rX5951lln5Stf+cpmy3fbbbesXLkyxx13XL74xS/mm9/8Zvbaa6888sgjOf3007Nu3bq3jXZNTU1p2bJl6urq0rJly2brysvLkyQVFRVZu3Zt1q1blzZt2pTWV1RU5LXXXvubr+XdevXVV9OlS5fNliXZbDkAAAAAFE20A4Ad1F577ZWRI0fme9/7Xs4+++zNwtyaNWua/a7d/2vVqlXp1avXX11XV1eXjRs3ZsaMGWnR4k/fpv3nr8b8szZt2mTDhg3Nlg0cODAbNmzI6tWrc+SRR/7VYx988MFJkmeffbb0+M/7Pvvss28773v1zDPPZNiwYZst22+//VJRUbHNzgMAAAAA24LftAOAHdj3vve9bNiwIYcddljuuOOOLF++PPX19bniiisyePDgd9z3nnvuyb/8y7/kV7/6Verr63PbbbflwgsvTJL06tUrf/zjH3PllVfmN7/5TW699dZce+21zfbv0aNHmpqaMm/evDQ2Nmbt2rXp3bt3Pv/5z2f8+PH593//9/z2t7/NokWL8u1vfzv33ntvkj/d5VZTU5NHHnmk2fFGjhyZxx57bLMQ+Oyzz+aXv/xlXn311bz++uv55S9/mV/+8pfv+NrWrl2burq6/N3f/V2z5T//+c83WwYAAAAAHwSiHQDswHr27JklS5bk6KOPzrnnnpt+/frl4x//eObNm5drrrnmHfedOXNm5s6dm0MPPTQf/ehHc/nll6d79+5JkoMOOiiXXXZZ/s//+T/p169fZs+enW9/+9vN9v/Yxz6WL3zhC/nMZz6TLl265F//9V+TJDfeeGPGjx+fc889N3369MkJJ5yQJ554IlVVVaV9J0yYkNmzZzc73ic+8Ym0atUqP/vZz5otP/bYYzNw4MD8x3/8R+bPn5+BAwdm4MCBpfX/8z//k7KyssyfP7+07K677kpVVVWzu/3+8Ic/5M4778wZZ5zxLq4sAAAAALy/yjZt2rSp6CEAgPfPkiVLMmjQoNTV1aWmpqaQGd5888306dMnP/7xj5vdEfi9730vd999dx588MG/eYw/v45rr702559/fn7zm99kzz33TJJ89KMfzdlnn53Pfe5zpe2vueaa/PSnP83cuXO3/QsCAD6whg4dmh49euSWW24pehSAd+Tz6oPF+/HB4v1gV+E37QCA9127du1yyy23pLGxsdnys846K2vWrMnvf//7dOzY8V0da+HChfnnf/7nUrBrbGzMiSeemM9+9rPNtmvdunWuvPLKbfMCAAAAAGAbE+0AgEIMGzZss2WtWrXKBRdc8J6OM3HixGZ3DFZUVORrX/vaZttNmDDhPc8IAAAAAO8Xv2kHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAVrVfQAAEAx6uvrix5hq+zo8wMAAADAXxLtAGAXU1FRkfbt22fs2LFFj7LV2rdvn4qKiqLHAAAAAICtJtoBwC6mqqoq9fX1aWxs3G7nmDBhQiorKzNt2rTtdo7kTwGyqqpqu54DAAAAAN4Poh0A7IKqqqq2a+wqLy9P586dU1NTs93OAQAAAAA7kxZFDwAAAAAAAAC7OtEOAAAAAAAACibaAQAAAAAAQMFEOwBgl9ejR4/MnDmz6DEAAAAA2IWJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAIV44403Mn78+JSXl6eysjIzZszIsGHDMnHixCR/+srKSy65pLRN9+7dc/fdd+fll1/O8ccfn/Ly8gwYMCCLFy9udtw77rgjBx54YNq2bZsePXpkxowZzdavXr06o0ePTrt27fLhD384s2fP3my2NWvWZMKECenSpUt23333HHPMMXnqqae227UAAAAAANEOACjE5MmTs2DBgtx1112ZO3du5s+fnyVLljTb5vLLL8+QIUPy5JNP5pOf/GTGjRuX8ePHZ+zYsVmyZEn233//jB8/Pps2bUqS1NXV5eSTT84pp5ySpUuXZurUqbnoooty0003lY5ZW1ub559/Pg8//HDmzJmTq6++OqtXr2523jFjxmT16tW5//77U1dXl5qamgwfPjyvvvrqdr8uAAAAAOyaWhU9AACw62lqasr111+fWbNmZfjw4UmSm2++Ofvtt1+z7Y499ticddZZSZIpU6bkmmuuyaGHHpoxY8YkSc4777wMHjw4L730Urp27ZrLLrssw4cPz0UXXZQk6d27d5599tlMnz49tbW1WbZsWe6///4sWrQohx56aJLk+uuvT3V1demcjzzySBYtWpTVq1enbdu2SZJLL700d955Z+bMmZMzzzxz+14cAAAAAHZJ7rQDAN53K1asyLp163L44YeXlu21117p06dPs+0GDBhQerzPPvskSfr377/Zsj/fKVdfX58hQ4Y0O8aQIUOyfPnybNiwIfX19WnVqlUGDRpUWt+3b9906tSp9Pypp55KU1NTOnfunPLy8tLfb3/726xYsWIrXzkAAAAA/HXutAMAPrBat25delxWVva2yzZu3LjNztnU1JTKysrMnz9/s3V/GfcAAAAAYFtypx0A8L7bf//907p16zz++OOlZa+99lqWLVu2Vcetrq7OwoULmy1buHBhevfunZYtW6Zv375Zv3596urqSuufe+65rFmzpvS8pqYmL774Ylq1apVevXo1+6uoqNiq+QAAAADg7Yh2AMD7rry8PKeffnomT56chx56KM8880xqa2vTosXW/Z8m5557bubNm5dp06Zl2bJlufnmm3PVVVdl0qRJSZI+ffpk1KhROeuss/L444+nrq4uEyZMSLt27UrHGDFiRAYPHpwTTjghc+fOzcqVK/Poo4/mggsuyOLFi7dqPgAAAAB4O6IdAFCI6dOn58gjj8zo0aMzYsSIHHHEEc1+a25L1NTU5Pbbb89tt92Wfv36ZcqUKbn44otTW1tb2ubGG29Mt27dctRRR+XEE0/MmWeemb333ru0vqysLPfdd1+GDh2a0047Lb17984pp5ySVatWlX5DDwAAAAC2Nb9pBwAUory8PLfeemtuvfXW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AAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAADAexg1alS+/e1vN2t77rnnUlVVlf/93//90PM2NjbmkEMOyX//9383ax8xYkQmT578oecFAABg9yS0AwAAdoq1a9fmy1/+crp27Zo2bdrk8MMPz9ChQzNv3rwWXXf69Onp0KHDhzp36dKlefDBB/OVr3ylWfs3vvGNfPnLX0779u2TJL///e9TV1eXY489NuXl5Tn//PPfd+7KysqMHj0611xzTbP2b37zm/nWt76VV1999UPVDAAAwO5JaAcAALS4lStX5oQTTsjDDz+cG264Ic8880x++tOf5owzzsgXv/jFdzznzTff3MlVbu2WW27J8OHDU1FRUWpbvXp17r///tTV1ZXaNm/enLZt2+YrX/lKBg0atM3zjxkzJnfeeWdefvnlUtsxxxyTbt26ZebMmTvkGgAAANg9CO0AAIAW94UvfCFlZWVZsGBBhg0blh49euToo4/O1772tTzxxBNJkrKyskydOjXnnntu9t9///zjP/5jkqS+vj61tbXZb7/90rVr11x77bV56623SnPfeOONOfbYY7P//vvn8MMPzxe+8IU0NTWVzh0zZkxeffXVlJWVpaysLBMmTEiSvPHGG7n88svzkY98JPvvv3/69u2b+vr60rybN2/O7NmzM3To0GbXctddd+W4447LRz7ykVLb/vvvn6lTp+aiiy5KVVXVNn8vRx99dDp37px//dd/bdY+dOjQzJo1a5vnAQAAYPcntAMAAFrUyy+/nJ/+9Kf54he/mP3333+r/j99dOWECRPyN3/zN3nmmWdy7rnnJknGjx+fv/u7v8uyZcvyox/9KNOnT8+3vvWt0jn77LNPbr755vzyl7/MjBkz8vDDD+fKK69Mkpx88sm56aabcsABB2TNmjVZs2ZNLr/88iTJl770pTz++OOZNWtWnn766QwfPjxDhgzJ888/nyR5+umn8+qrr+bEE09sVu8jjzyyVdv2OOmkk/LII49s1bZgwYK88cYbO2wdAAAAdm1COwAAoEX9+te/zpYtW9KrV6/3Hfu3f/u3GTNmTLp27ZpOnTolSerq6vKZz3wmXbt2zVlnnZWJEyfmRz/6UemcSy+9NGeccUa6dOmSM888M9dff33uuuuuJMm+++6bAw88MGVlZamqqkpVVVUqKiqyevXqTJs2LXfffXdOPfXUdOvWLZdffnlOOeWUTJs2LUmyatWqtGrVKoccckizGletWpXOnTvvqK8nnTt3zqpVq7Zq27RpU9auXbvD1gEAAGDXVl50AQAAwJ5ty5Yt2zz2nXaw/fjHP8706dNLx5s3b87vf//7bNy4Me3atcvPfvazTJo0Kb/61a/yu9/9Lm+99Vaz/nfyzDPPZPPmzenRo0ez9jfeeCMdO3ZMkrz++utp06ZNysrKmo15/fXXs99++23zNb2ftm3bZuPGjVu1JdmqHQAAgD2X0A4AAGhRf/mXf5mysrL86le/et+x7/T4zEsuuSRf/vKXt2rfb7/9snLlynz84x/P5z//+XzrW9/KQQcdlEcffTQXXnhhNm3a9K6hXVNTU1q1apVFixalVatWzfoqKiqSJJWVldm4cWM2bdqUfffdt9RfWVmZV1555X2vZVu9/PLLOfjgg7dqS7JVOwAAAHsuoR0AANCiDjrooAwePDg/+MEP8pWvfGWrYG7Dhg3N3mv351atWpXu3bu/Y9+iRYvy9ttvZ/Lkydlnnz88/f+Pj8b8o3333TebN29u1nb88cdn8+bNWbduXU499dR3nPuv/uqvkiTLli0rff7jucuWLXvXej+oZ599NgMGDNiq7bDDDktlZeUOWwcAAIBdm3faAQAALe4HP/hBNm/enJNOOin33HNPnn/++TQ0NOTmm29Ov3793vPc+++/P9dee21++ctfpqGhIbNmzco3v/nNJEn37t3z5ptv5pZbbsl//dd/5Y477sgPf/jDZud36dIlTU1NmTdvXhobG7Nx48b06NEjn/70pzN69Oj8y7/8S1544YUsWLAgkyZNygMPPJDkD7vcamtr8+ijjzabb/DgwXn88ce3CgKXLVuWJUuW5OWXX86rr76aJUuWZMmSJe95bRs3bsyiRYvy13/9183aH3nkka3aAAAA2LMJ7QAAgBbXtWvXLF68OGeccUYuu+yyHHPMMTnrrLMyb968TJ069T3PvemmmzJ37tz06dMnH/3oRzNlypQcccQRSZLjjjsuN954Y77zne/kmGOOyZ133plJkyY1O//kk0/O5z73uXzyk5/MwQcfnO9+97tJkmnTpmX06NG57LLL0rNnz5x//vn5z//8z1RXV5fOHTt2bO68885m833sYx9LeXl5fvaznzVrP/vss3P88cfn3/7t31JfX5/jjz8+xx9/fKn/t7/9bcrKylJfX19qu++++1JdXd1st9/vf//73Hvvvbnooou24ZsFAABgT+HxmAAAwE7RqVOn3Hrrrbn11lvfsX/Lli3v2H7yySfnS1/60rvO+9WvfjVf/epXm7WNGjWq2fHUqVO3Cgdbt26da6+9Ntdee+27zl1XV5dJkybl8ccfL+0ILC8vz1VXXZUbb7wxgwcPLo1duXLlO86xePHiJMn//M//pEOHDjnuuONKfd///vczfvz4ZuOnTZuWk046KR/96EfftS4AAAD2PEI7AACAd9G2bdv80z/9UxobG5u1X3LJJdmwYUP+93//N+3bt9+muebPn5+rrroqf/EXf5EkaWxszAUXXJBPfepTzca1bt06t9xyy465AAAAAHYbQjsAAID3MGDAgK3aysvLc/XVV3+geS699NLU1taWjisrK3PllVduNW7s2LEfuEYAAAB2f95pBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUrL7oAAACA99LQ0FB0Cdtld68fAACAnUNoBwAA7JIqKyvTrl27jBw5suhStlu7du1SWVlZdBkAAADswoR2AADALqm6ujoNDQ1pbGxssTXGjh2bTp06ZeLEiS22RvKHALK6urpF1wAAAGD3JrQDAAB2WdXV1S0adlVUVKRjx46pra1tsTUAAABgW+xTdAEAAAAAAACwtxPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAMBuokuXLrnpppuKLgMAAIAWILQDAAAAAACAggntAAAAAAAAoGBCOwAAgPfw2muvZfTo0amoqEinTp0yefLkDBgwIJdeemmSPzyy8vrrry+NOeKIIzJnzpy89NJLOe+881JRUZHevXtn4cKFzea95557cvTRR6dNmzbp0qVLJk+e3Kx/3bp1GTp0aNq2bZsjjzwyd95551a1bdiwIWPHjs3BBx+cAw44IGeeeWaWLl3aYt8FAAAALUdoBwAA8B6uuOKK/OIXv8h9992XuXPnpr6+PosXL242ZsqUKenfv3+eeuqpnHPOORk1alRGjx6dkSNHZvHixenWrVtGjx6dLVu2JEkWLVqUT3ziExkxYkSeeeaZTJgwIePGjcv06dNLc9bV1eU3v/lNfv7zn2f27Nm57bbbsm7dumbrDh8+POvWrctDDz2URYsWpba2NgMHDszLL7/c4t8LAAAAO1Z50QUAAADsqpqamnL77bdn5syZGThwYJJkxowZOeyww5qNO/vss3PJJZckScaPH5+pU6emT58+GT58eJLk61//evr165cXX3wxVVVVufHGGzNw4MCMGzcuSdKjR48sW7YsN9xwQ+rq6rJ8+fI89NBDWbBgQfr06ZMkuf3221NTU1Na89FHH82CBQuybt26tGnTJknyve99L/fee29mz56diy++uGW/HAAAAHYoO+0AAADexYoVK7Jp06b07du31HbQQQelZ8+ezcb17t279PnQQw9Nkhx77LFbtf1xp1xDQ0P69+/fbI7+/fvn+eefz+bNm9PQ0JDy8vKccMIJpf5evXqlQ4cOpeOlS5emqakpHTt2TEVFRennhRdeyIoVK7bzygEAANjZ7LQDAADYTq1bty59Lisre9e2t99+e4et2dTUlE6dOqW+vn6rvj8N9wAAANg92GkHAADwLrp165bWrVvnySefLLW98sorWb58+XbNW1NTk/nz5zdrmz9/fnr06JFWrVqlV69eeeutt7Jo0aJS/3PPPZcNGzaUjmtra7N27dqUl5ene/fuzX4qKyu3qz4AAAB2PqEdAADAu6ioqMiFF16YK664Ig8//HCeffbZ1NXVZZ99tu+vUpdddlnmzZuXiRMnZvny5ZkxY0ZuvfXWXH755UmSnj17ZsiQIbnkkkvy5JNPZtGiRRk7dmzatm1bmmPQoEHp169fzj///MydOzcrV67MY489lquvvjoLFy7crvoAAADY+YR2AAAA7+GGG27IqaeemqFDh2bQoEE55ZRTmr1r7sOora3NXXfdlVmzZuWYY47J+PHjc91116Wurq40Ztq0aencuXNOP/30XHDBBbn44otzyCGHlPrLysry4IMP5rTTTsuYMWPSo0ePjBgxIqtWrSq9Qw8AAIDdh3faAQAAvIeKiorccccdueOOO0ptDzzwQOnzypUrtzpny5YtzY67dOmyVduwYcMybNiwd123qqoq999/f7O2UaNGNTtu3759br755tx8883vex0AAADs2uy0AwAAAAAAgIIJ7QAAAAAAAKBgHo8JAADwAdXX1xddAgAAAHsYO+0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICClRddAAAAsOOtXr06jY2NRZexy2tqasr69euzePHiokvZLVRWVqa6urroMgAAAPZIQjsAANjDrF69OjU1Ndm4cWPRpewWnnrqqTz44INFl7FbaNeuXRoaGgR3AAAALUBoBwAAe5jGxsZs3LgxM2fOTE1NTdHlsIdoaGjIyJEj09jYKLQDAABoAUI7AADYQ9XU1KS2trboMgAAAIBtsE/RBQAAAAAAAMDeTmgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAElWrlyZsrKyLFmyJElSX1+fsrKybNiwodC6AAAA2DsI7QAAgD3CSy+9lM9//vOprq5OmzZtUlVVlcGDB2f+/Pkfar6TTz45a9asyYEHHpgkmT59ejp06LADKwYAAID/p7zoAgAAAHaEYcOGZdOmTZkxY0a6du2aF198MfPmzcv69es/1Hz77rtvqqqqdnCVAAAA8M7stAMAAHZ7GzZsyCOPPJLvfOc7OeOMM3LEEUfkpJNOyje+8Y2ce+65SZKysrJMnTo1H/vYx9K2bdt07do1s2fPftc5//TxmPX19RkzZkxeffXVlJWVpaysLBMmTNhJVwcAAMDeQGgHAADs9ioqKlJRUZF77703b7zxxruOGzduXIYNG5alS5fm05/+dEaMGJGGhob3nf/kk0/OTTfdlAMOOCBr1qzJmjVrcvnll+/ISwAAAGAvJ7QDAAB2e+Xl5Zk+fXpmzJiRDh06pH///rnqqqvy9NNPNxs3fPjwjB07Nj169MjEiRNz4okn5pZbbnnf+ffdd98ceOCBKSsrS1VVVaqqqlJRUdFSlwMAAMBeSGgHAADsEYYNG5bf/va3mTNnToYMGZL6+vrU1tZm+vTppTH9+vVrdk6/fv22aacdAAAAtDShHQAAsMfYb7/9ctZZZ2XcuHF57LHHUldXl2uuuabosgAAAOB9Ce0AAIA91lFHHZXXXnutdPzEE08063/iiSdSU1OzTXPtu+++2bx58w6tDwAAAP6ovOgCAAAAttf69eszfPjwfPazn03v3r3Tvn37LFy4MN/97ndz3nnnlcbdfffdOfHEE3PKKafkzjvvzIIFC3L77bdv0xpdunRJU1NT5s2bl+OOOy7t2rVLu3btWuqSAAAA2MsI7QAAgN1eRUVF+vbtmylTpmTFihV58803c/jhh+eiiy7KVVddVRp37bXXZtasWfnCF76QTp065Z//+Z9z1FFHbdMaJ598cj73uc/lk5/8ZNavX59rrrkmEyZMaKErAgAAYG8jtAMAAHZ7bdq0yaRJkzJp0qT3HNe5c+fMnTv3Hfu6dOmSLVu2lI4HDBjQ7DhJpk6dmqlTp25/wQAAAPBnvNMOAAAAAAAACia0AwAAAAAAgIJ5PCYAALBX+PNHXQIAAMCuxE47AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYOVFFwAAALSMhoaGoktgD+LPEwAAQMsS2gEAwB6msrIy7dq1y8iRI4suhT1Mu3btUllZWXQZAAAAeyShHQAA7GGqq6vT0NCQxsbGFltj7Nix6dSpUyZOnNhia7Dtdtb9qKysTHV1dYuuAQAAsLcS2gEAwB6ourq6RcOVioqKdOzYMbW1tS22BtvO/QAAANj97VN0AQAAAAAAALC3E9oBAAAAAABAwYR2AAAAAAAAUDChHQAAsMfr0qVLbrrppqLL4P9yPwAAALYmtAMAAAAAAICCCe0AAAAAAACgYEI7AACgRbz22msZPXp0Kioq0qlTp0yePDkDBgzIpZdemuQPj0i8/vrrS2OOOOKIzJkzJy+99FLOO++8VFRUpHfv3lm4cGGzee+5554cffTRadOmTbp06ZLJkyc361+3bl2GDh2atm3b5sgjj8ydd965VW0bNmzI2LFjc/DBB+eAAw7ImWeemaVLl7bYd7ErcD8AAAB2bUI7AACgRVxxxRX5xS9+kfvuuy9z585NfX19Fi9e3GzMlClT0r9//zz11FM555xzMmrUqIwePTojR47M4sWL061bt4wePTpbtmxJkixatCif+MQnMmLEiDzzzDOZMGFCxo0bl+nTp5fmrKury29+85v8/Oc/z+zZs3Pbbbdl3bp1zdYdPnx41q1bl4ceeiiLFi1KbW1tBg4cmJdffrnFv5eiuB8AAAC7tvKiCwAAAPY8TU1Nuf322zNz5swMHDgwSTJjxowcdthhzcadffbZueSSS5Ik48ePz9SpU9OnT58MHz48SfL1r389/fr1y4svvpiqqqrceOONGThwYMaNG5ck6dGjR5YtW5YbbrghdXV1Wb58eR566KEsWLAgffr0SZLcfvvtqampKa356KOPZsGCBVm3bl3atGmTJPne976Xe++9N7Nnz87FF1/csl9OAdwPAACAXZ+ddgAAwA63YsWKbNq0KX379i21HXTQQenZs2ezcb179y59PvTQQ5Mkxx577FZtf9yZ1dDQkP79+zebo3///nn++eezefPmNDQ0pLy8PCeccEKpv1evXunQoUPpeOnSpWlqakrHjh1TUVFR+nnhhReyYsWK7bzyXZP7AQAAsOuz0w4AAChM69atS5/Lysrete3tt9/eYWs2NTWlU6dOqa+v36rvT8OkvZH7AQAAUBw77QAAgB2uW7duad26dZ588slS2yuvvJLly5dv17w1NTWZP39+s7b58+enR48eadWqVXr16pW33norixYtKvU/99xz2bBhQ+m4trY2a9euTXl5ebp3797sp7Kycrvq21W5HwAAALs+oR0AALDDVVRU5MILL8wVV1yRhx9+OM8++2zq6uqyzz7b91eQyy67LPPmzcvEiROzfPnyzJgxI7feemsuv/zyJEnPnj0zZMiQXHLJJXnyySezaNGijB07Nm3bti3NMWjQoPTr1y/nn39+5s6dm5UrV+axxx7L1VdfnYULF25Xfbsq9wMAAGDXJ7QDAABaxA033JBTTz01Q4cOzaBBg3LKKac0e7fZh1FbW5u77rors2bNyjHHHJPx48fnuuuuS11dXWnMtGnT0rlz55x++um54IILcvHFF+eQQw4p9ZeVleXBBx/MaaedljFjxqRHjx4ZMWJEVq1aVXpn257I/QAAANi1eacdAADQIioqKnLHHXfkjjvuKLU98MADpc8rV67c6pwtW7Y0O+7SpctWbcOGDcuwYcPedd2qqqrcf//9zdpGjRrV7Lh9+/a5+eabc/PNN7/vdewp3A8AAIBdm512AAAAAAAAUDChHQAAAAAAABTM4zEBAICdpr6+vugS+BPuBwAAwK7DTjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBg5UUXAAAAAAA70urVq9PY2Fh0GdutsrIy1dXVRZcBAOwkQjsAAAAA9hirV69OTU1NNm7cWHQp261du3ZpaGgQ3AHAXkJoBwAAAMAeo7GxMRs3bszMmTNTU1NTdDkfWkNDQ0aOHJnGxkahHQDsJYR2AAAAAOxxampqUltbW3QZAADbbJ+iCwAAAAAAAIC9ndAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAABgBxs1alS+/e1vN2t77rnnUlVVlf/93//90PM2NjbmkEMOyX//9383ax8xYkQmT578oecFAIontAMAAABgl7V27dp8+ctfTteuXdOmTZscfvjhGTp0aObNm9ei606fPj0dOnT4UOcuXbo0Dz74YL7yla80a//GN76RL3/5y2nfvn2S5Pe//33q6upy7LHHpry8POeff/77zl1ZWZnRo0fnmmuuadb+zW9+M9/61rfy6quvfqiaAYDiCe0AAAAA2CWtXLkyJ5xwQh5++OHccMMNeeaZZ/LTn/40Z5xxRr74xS++4zlvvvnmTq5ya7fcckuGDx+eioqKUtvq1atz//33p66urtS2efPmtG3bNl/5ylcyaNCgbZ5/zJgxufPOO/Pyyy+X2o455ph069YtM2fO3CHXAADsfEI7AAAAAHZJX/jCF1JWVpYFCxZk2LBh6dGjR44++uh87WtfyxNPPJEkKSsry9SpU3Puuedm//33zz/+4z8mSerr61NbW5v99tsvXbt2zbXXXpu33nqrNPeNN96YY489Nvvvv38OP/zwfOELX0hTU1Pp3DFjxuTVV19NWVlZysrKMmHChCTJG2+8kcsvvzwf+chHsv/++6dv376pr68vzbt58+bMnj07Q4cObXYtd911V4477rh85CMfKbXtv//+mTp1ai666KJUVVVt8/dy9NFHp3PnzvnXf/3XZu1Dhw7NrFmztnkeAGDXIrQDAAAAYJfz8ssv56c//Wm++MUvZv/999+q/08fXTlhwoT8zd/8TZ555pmce+65SZLx48fn7/7u77Js2bL86Ec/yvTp0/Otb32rdM4+++yTm2++Ob/85S8zY8aMPPzww7nyyiuTJCeffHJuuummHHDAAVmzZk3WrFmTyy+/PEnypS99KY8//nhmzZqVp59+OsOHD8+QIUPy/PPPJ0mefvrpvPrqqznxxBOb1fvII49s1bY9TjrppDzyyCNbtS1YsCBvvPHGDlsHANh5hHYAAAAA7HJ+/etfZ8uWLenVq9f7jv3bv/3bjBkzJl27dk2nTp2SJHV1dfnMZz6Trl275qyzzsrEiRPzox/9qHTOpZdemjPOOCNdunTJmWeemeuvvz533XVXkmTffffNgQcemLKyslRVVaWqqioVFRVZvXp1pk2blrvvvjunnnpqunXrlssvvzynnHJKpk2bliRZtWpVWrVqlUMOOaRZjatWrUrnzp131NeTzp07Z9WqVVu1bdq0KWvXrt1h6wAAO0950QUAAAAAwJ/bsmXLNo99px1sP/7xjzN9+vTS8ebNm/P73/8+GzduTLt27fKzn/0skyZNyq9+9av87ne/y1tvvdWs/50888wz2bx5c3r06NGs/Y033kjHjh2TJK+//nratGmTsrKyZmNef/317Lffftt8Te+nbdu22bhx41ZtSbZqBwB2D0I7AAAAAHY5f/mXf5mysrL86le/et+x7/T4zEsuuSRf/vKXt2rfb7/9snLlynz84x/P5z//+XzrW9/KQQcdlEcffTQXXnhhNm3a9K6hXVNTU1q1apVFixalVatWzfoqKiqSJJWVldm4cWM2bdqUfffdt9RfWVmZV1555X2vZVu9/PLLOfjgg7dqS7JVOwCwexDaAQAAALDLOeiggzJ48OD84Ac/yFe+8pWtgrkNGzY0e6/dn1u1alW6d+/+jn2LFi3K22+/ncmTJ2efff7w9pg/Phrzj/bdd99s3ry5Wdvxxx+fzZs3Z926dTn11FPfce6/+qu/SpIsW7as9PmP5y5btuxd6/2gnn322QwYMGCrtsMOOyyVlZU7bB0AYOfxTjsAAAAAdkk/+MEPsnnz5px00km555578vzzz6ehoSE333xz+vXr957n3n///bn22mvzy1/+Mg0NDZk1a1a++c1vJkm6d++eN998M7fcckv+67/+K3fccUd++MMfNju/S5cuaWpqyrx589LY2JiNGzemR48e+fSnP53Ro0fnX/7lX/LCCy9kwYIFmTRpUh544IEkf9jlVltbm0cffbTZfIMHD87jjz++VRC4bNmyLFmyJC+//HJeffXVLFmyJEuWLHnPa9u4cWMWLVqUv/7rv27W/sgjj2zVBgDsPoR2AAAAAOySunbtmsWLF+eMM87IZZddlmOOOSZnnXVW5s2bl6lTp77nuTfddFPmzp2bPn365KMf/WimTJmSI444Ikly3HHH5cYbb8x3vvOdHHPMMbnzzjszadKkZueffPLJ+dznPpdPfvKTOfjgg/Pd7343STJt2rSMHj06l112WXr27Jnzzz8///mf/5nq6urSuWPHjs2dd97ZbL6PfexjKS8vz89+9rNm7WeffXaOP/74/Nu//Vvq6+tz/PHH5/jjjy/1//a3v01ZWVnq6+tLbffdd1+qq6ub7fb7/e9/n3vvvTcXXXTRNnyzAMCuyOMxAQAAANhlderUKbfeemtuvfXWd+zfsmXLO7affPLJ+dKXvvSu8371q1/NV7/61WZto0aNanY8derUrcLB1q1b59prr8211177rnPX1dVl0qRJefzxx0s7AsvLy3PVVVflxhtvzODBg0tjV65c+Y5zLF68OEnyP//zP+nQoUOOO+64Ut/3v//9jB8/vtn4adOm5aSTTspHP/rRd60LANi1Ce0AAAAAYAdq27Zt/umf/imNjY3N2i+55JJs2LAh//u//5v27dtv01zz58/PVVddlb/4i79IkjQ2NuaCCy7Ipz71qWbjWrdunVtuuWXHXAAAUAihHQAAAADsYAMGDNiqrby8PFdfffUHmufSSy9NbW1t6biysjJXXnnlVuPGjh37gWsEAHYt3mkHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABSsvugAAAAAA2NEaGhqKLmG77O71AwAfnNAOAAAAgD1GZWVl2rVrl5EjRxZdynZr165dKisriy4DANhJhHYAAAAA7DGqq6vT0NCQxsbGFltj7Nix6dSpUyZOnNhiayR/CCCrq6tbdA0AYNchtAMAAABgj1JdXd2iYVdFRUU6duyY2traFlsDANj77FN0AQAAAAAAALC3E9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAADswbp06ZKbbrqp6DIAgPchtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAANjBXnvttYwePToVFRXp1KlTJk+enAEDBuTSSy9N8odHVl5//fWlMUcccUTmzJmTl156Keedd14qKirSu3fvLFy4sNm899xzT44++ui0adMmXbp0yeTJk5v1r1u3LkOHDk3btm1z5JFH5s4779yqtg0bNmTs2LE5+OCDc8ABB+TMM8/M0qVLW+y7AAC2jdAOAAAAAHawK664Ir/4xS9y3333Ze7cuamvr8/ixYubjZkyZUr69++fp556Kuecc05GjRqV0aNHZ+TIkVm8eHG6deuW0aNHZ8uWLUmSRYsW5ROf+ERGjBiRZ555JhMmTMi4ceMyffr00px1dXX5zW9+k5///OeZPXt2brvttqxbt67ZusOHD8+6devy0EMPZdGiRamtrc3AgQPz8ssvt/j3AgC8u/KiCwAAAACAPUlTU1Nuv/32zJw5MwMHDkySzJgxI4cddlizcWeffXYuueSSJMn48eMzderU9OnTJ8OHD0+SfP3rX0+/fv3y4osvpqqqKjfeeGMGDhyYcePGJUl69OiRZcuW5YYbbkhdXV2WL1+ehx56KAsWLEifPn2SJLfffntqampKaz766KNZsGBB1q1blzZt2iRJvve97+Xee+/N7Nmzc/HFF7fslwMAvCs77QAAAABgB1qxYkU2bdqUvn37ltoOOuig9OzZs9m43r17lz4feuihSZJjjz12q7Y/7pRraGhI//79m83Rv3//PP/889m8eXMaGhpSXl6eE044odTfq1evdOjQoXS8dOnSNDU1pWPHjqmoqCj9vPDCC1mxYsV2XjkAsD3stAMAAACAArRu3br0uays7F3b3n777R22ZlNTUzp16pT6+vqt+v403AMAdj477QAAAABgB+rWrVtat26dJ598stT2yiuvZPny5ds1b01NTebPn9+sbf78+enRo0datWqVXr165a233sqiRYtK/c8991w2bNhQOq6trc3atWtTXl6e7t27N/uprKzcrvoAgO0jtAMAAACAHaiioiIXXnhhrrjiijz88MN59tlnU1dXl3322b5/irvssssyb968TJw4McuXL8+MGTNy66235vLLL0+S9OzZM0OGDMkll1ySJ598MosWLcrYsWPTtm3b0hyDBg1Kv379cv7552fu3LlZuXJlHnvssVx99dVZuHDhdtUHAGwfoR0AAAAA7GA33HBDTj311AwdOjSDBg3KKaec0uxdcx9GbW1t7rrrrsyaNSvHHHNMxo8fn+uuuy51dXWlMdOmTUvnzp1z+umn54ILLsjFF1+cQw45pNRfVlaWBx98MKeddlrGjBmTHj16ZMSIEVm1alXpHXoAQDG80w4AAAAAdrCKiorc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+++/P8uXL8+oUaNK/cOGDctvf/vbzJkzJ0OGDEl9fX1qa2szffr00pjXX3+92aMxP6zKysp87WtfS9++fdOnT5/8n//zfzJy5MitHoPZtm3bJMnGjRu3e00AAIAdQWgHAADAu9p///3TvXv3dO/ePX369MmPf/zjvPbaa/mHf/iH0piqqqp07949PXv2zDnnnJNrr702P/nJT/LrX/+6NGa//fbLWWedlXHjxuWxxx5LXV1drrnmmlJ/ZWVlXnnllWZrV1VV5cUXX2zW9uKLL+aAAw4ohW7bom/fvs1qSZKXX345SUrv5QMAACia0A4AAIBtVlZWln322eddH0+ZJK1atUqS9xxz1FFH5bXXXisdH3/88Vm2bFmzMf369cu8efOatf3Hf/xH+vXr94FqXrJkSTp16tSs7dlnn03r1q1z9NFHf6C5AAAAWkp50QUAAACw63rjjTeydu3aJMkrr7ySW2+9NU1NTRk6dGhpzIYNG7J27dq8/fbbef7553PdddelR48eqampyfr16zN8+PB89rOfTe/evdO+ffssXLgw3/3ud3PeeeeV5hg8eHBmzJjRbO3Pfe5zufXWW3PllVfms5/9bB5++OHcddddeeCBB0pjbr311vzrv/5rKdybMWNG9t133xx//PFJkn/5l3/JP/7jP+bHP/5xs7kfeeSRnHrqqR9oxx4AAEBLEtoBAADwrn7605+Wdqm1b98+vXr1yt13350BAwaUxowZMybJH3bhVVVV5bTTTsu3v/3tlJeXp6KiIn379s2UKVOyYsWKvPnmmzn88MNz0UUX5aqrrirN8elPfzpXXnllnnvuufTs2TNJcuSRR+aBBx7IV7/61Xz/+9/PYYcdlh//+McZPHhw6bzGxsasWLGiWc0TJ07MqlWrUl5enl69euUnP/lJ/r//7/9rNmbWrFmZMGHCjvyqAAAAtovQDgAAgHc0ffr0TJ8+/T3HbNmy5T3727Rpk0mTJmXSpEnvOe6ggw7Kl770pdx444350Y9+VGofMGBAnnrqqXc9b8KECc3Ct8985jP5zGc+855rPfTQQ9lnn322CvIAAACK5J12AAAA7BKuvvrqHHHEEXn77bdbdJ3XXnst06ZNS3m5/44VAADYdfgbCgAAALuEDh06NHtkZkuxww4AANgV2WkHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAA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mWdy++23Z+bMmdl+++2TJJdffnlqampKa06fPj0zZ87MokWL0qJFiyTJr371q9x44425/vrrc+SRR67ei1MA9wMAWJvZaQcAAACstebNm5elS5dmxx13LLWtv/766d69e9m4rbfeuvR5o402SpJstdVWjdr+tTOrrq4uO++8c9kcO++8c5599tksW7YsdXV1adasWXr37l3q79GjR9q1a1c6njNnThoaGtK+fftUVlaWfp577rnMmzdvFb/5msn9AADWZnbaAQAAAHyMddZZp/S5oqLiQ9uWL1/+ma3Z0NCQjh07ZurUqY363hsmrY3cDwDgy8hOOwAAAGCttdlmm2WdddbJgw8+WGp77bXX8swzz6zSvDU1NZkxY0ZZ24wZM9KtW7c0bdo0PXr0yLvvvptZs2aV+ufOnZvFixeXjmtra/Piiy+mWbNm2Xzzzct+qqqqVqm+NZX7AQCszYR2AAAAwFqrsrIyw4YNy0knnZS77747TzzxRIYMGZImTVbtTyYnnnhipkyZktGjR+eZZ57JhAkTcskll2TEiBFJku7du2fvvffOUUcdlQcffDCzZs3K8OHD06pVq9Icffv2TZ8+fbLffvtl8uTJef7553PffffltNNOy8MPP7xK9a2p3A8AYG0mtAMAAADWauedd1523XXXDBgwIH379s0uu+xS9m6zlVFbW5vrrrsukyZNSs+ePXPGGWfk5z//eYYMGVIac+WVV6ZTp07Zfffds//+++fII4/MhhtuWOqvqKjIbbfdlt122y1Dhw5Nt27dctBBB2X+/Pmld7Z9GbkfAMDayjvtAAAAgLVaZWVlrr766lx99dWltltvvbX0+fnnn290zooVK8qOO3fu3Kht4MCBGThw4Ieu26FDh9xyyy1lbYcddljZcZs2bXLRRRfloosu+tjv8WXhfgAAays77QAAAAAAAKBgQjsAAAAAAAAomMdjAgAAALzP1KlTiy6B93A/AIC1gZ12AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwZoVXQAAAAB8nhYsWJD6+vrVNn9DQ0NeeeWVzJ49e7WtwSf3ed2PqqqqVFdXr9Y1AAD4chPaAQAAsNZYsGBBampqsmTJktW6ziOPPJLbbrttta7BJ/d53I/WrVunrq5OcAcAwEoT2gEAALDWqK+vz5IlS3LNNdekpqam6HL4kqirq8ugQYNSX18vtAMAYKUJ7QAAAFjr1NTUpLa2tugyAAAASpoUXQAAAAAAAACs7YR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAABruOeffz4VFRV59NFHkyRTp05NRUVFFi9evMpzn3nmmdl2221XeZ7P25QpU1JTU5Nly5YlSS677LIMGDCg4KoAAGDlCe0AAABgNXv55Zfzgx/8INXV1WnRokU6dOiQ/v37Z8aMGSs130477ZSFCxembdu2SZLx48enXbt2n2HFa76TTz45p59+epo2bZok+f73v5/Zs2dn2rRpBVcGAAArp1nRBQAAAMCX3cCBA7N06dJMmDAhXbp0yUsvvZQpU6bklVdeWan5mjdvng4dOnzGVa75li5dmubNm2f69OmZN29eBg4cWOpr3rx5DjnkkFx00UXZddddC6wSAABWjp12AAAAsBotXrw406ZNy7nnnptvfOMb2WSTTbLDDjvk1FNPzbe+9a0kSUVFRcaNG5d99tknrVq1SpcuXXL99dd/6JzvfTzm1KlTM3To0Lz++uupqKhIRUVFzjzzzA899xe/+EU22mijtGnTJsOGDcvbb79d1v/QQw+lX79+qaqqStu2bbP77rtn9uzZZWOefvrp7LLLLmnZsmW22GKL3HXXXamoqMiNN95YGnPfffdl2223TcuWLbPddtvlxhtvLHvEZ5I88cQT2WeffVJZWZmNNtoohx12WOrr60v9e+yxR3784x/n+OOPT1VVVfr3758kmTRpUvr165eWLVuW1TVgwIDcfPPNeeuttz70+wMAwJpKaAcAAACrUWVlZSorK3PjjTfmnXfe+dBxo0aNysCBAzNnzpwceuihOeigg1JXV/ex8++000658MILs95662XhwoVZuHBhRowY8YFjr7vuupx55pk555xz8vDDD6djx4659NJLy8a88cYbOfzwwzN9+vQ88MAD6dq1a/bdd9+88cYbSZJly5Zlv/32S+vWrfPggw/mt7/9bU477bSyOf7+979nwIAB2WqrrTJ79uyMHj06I0eOLBuzePHi7LnnnunVq1cefvjh3HHHHXnppZdy4IEHlo2bMGFCmjdvnhkzZuSyyy5LkkybNi3bbbddo++33Xbb5d13382DDz74sdcNAADWNB6PCQAAAKtRs2bNMn78+BxxxBG57LLLUltbm9133z0HHXRQtt5669K4Aw44IMOHD0+SjB49On/5y19y8cUXNwrV3q958+Zp27ZtKioqPvaRmRdeeGGGDRuWYcOGJUnOOuus3HXXXWW77fbcc8+yc37729+mXbt2uffee/PNb34zf/nLXzJv3rxMnTq1tN7ZZ5+dfv36lc75/e9/n4qKivzud78r7cb73//93xxxxBGlMZdcckl69eqVc845p9R2xRVXZOONN84zzzyTbt26JUm6du2aX/7yl2U1zZ8/P506dWr0/Vq3bp22bdtm/vz5H3kdAABgTWSnHQAAAKxmAwcOzP/93//l5ptvzt57752pU6emtrY248ePL43p06dP2Tl9+vT5RDvtPo26urrsuOOOjdZ5r5deeilHHHFEunbtmrZt22a99dZLQ0NDFixYkCSZO3duNt5447KAcIcddiibY+7cudl6663LHl/5/jFz5szJPffcU9qJWFlZmR49eiRJ5s2bVxrXu3fvRt/jrbfeavRozH9p1apVlixZ8qHXAAAA1lR22gEAAMDnoGXLlunXr1/69euXUaNGZfjw4fnpT3+aIUOGFF1amcMPPzyvvPJK/vM//zObbLJJWrRokT59+mTp0qWf6ToNDQ0ZMGBAzj333EZ9HTt2LH1ed911G/VXVVXltdde+8B5X3311WywwQafXaEAAPA5sdMOAAAACrDFFlvkzTffLB0/8MADZf0PPPBAampqPtFczZs3z7Jlyz52XE1NTaP3vb1/3RkzZuTYY4/Nvvvumy233DItWrRIfX19qb979+554YUX8tJLL5XaHnroobI5unfvnscff7zsHX7vH1NbW5snn3wynTt3zuabb17280FB3Xv16tUrTz31VKP2efPm5e23306vXr0+8nwAAFgTCe0AAABgNXrllVey55575pprrsljjz2W5557Ln/4wx/yy1/+Mt/+9rdL4/7whz/kiiuuyDPPPJOf/vSnmTlzZn784x9/ojU6d+6choaGTJkyJfX19aXHQ5566qkZPHhwadxxxx2XK664IldeeWVpnSeffLJsrq5du+bqq69OXV1dHnzwwRx66KFp1apVqb9fv37ZbLPNcvjhh+exxx7LjBkzcvrppydJKioqkiSHHHJIli9fniOPPDJ1dXW5884786tf/apszI9+9KO8+uqrOfjgg/PQQw9l3rx5ufPOOzN06NCPDSD79++f6dOnN2qfNm1aunTpks022+wTXTcAAFiTCO0AAABgNaqsrMyOO+6YCy64ILvttlt69uyZUaNG5Ygjjsgll1xSGvezn/0skyZNytZbb52rrroq1157bbbYYotPtMZOO+2Uo48+Ot/73veywQYb5Je//GWSZOHChaV30SXJ9773vYwaNSonn3xyevfunfnz5+cHP/hB2VyXX355XnvttdTW1uawww7Lsccemw033LDU37Rp09x4441paGjI9ttvn+HDh+e0005LktJ75tZbb738+c9/zqOPPpptt902p512Ws4444yyMZ06dcqMGTOybNmy/Nu//Vu22mqrHH/88WnXrl2aNPnoP1cceuihefLJJzN37tyy9muvvTZHHHHEJ7pmAACwpvFOOwAAAFiNWrRokTFjxmTMmDEfOa5Tp06ZPHnyB/Z17tw5K1asKB3vscceZcdJMm7cuIwbN66sbfz48Y3m+slPfpKf/OQnZW3vfa9cr169Gj3K8rvf/W7ZcY8ePcp2us2YMSNJsvnmm5fadtppp8yZM6d0PHHixKyzzjqprq4utXXt2jV/+tOfGtX4L1OnTv3A9vXXXz8//vGPc/755+c3v/lNkuTJJ5/Mo48+muuuu+5D5wMAgDWZ0A4AAAD4VG644YZUVlama9eu+etf/5rjjjsuO++8c9ljKa+66qp06dIlX/3qVzNnzpyMHDkyBx54YNmjNlfFaaedlksvvTTLly9PkyZNsnDhwlx11VVp27btZzI/AAB83oR2AAAAwKfyxhtvZOTIkVmwYEGqqqrSt2/fjB07tmzMiy++mDPOOCMvvvhiOnbsmAMOOCBnn332Z1ZDu3btynYM9u3b9zObGwAAiiC0AwAAgIK9/1GXa7rBgwdn8ODBHznm5JNPzsknn/w5VQQAAF98H/1mZwAAAAAAAGC1E9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABSsWdEFAAAAwOetrq6u6BL4EvHvEwAAnwWhHQAAAGuNqqqqtG7dOoMGDSq6FL5kWrdunaqqqqLLAADgC0xoBwAAwFqjuro6dXV1qa+vL7qUNd7w4cPTsWPHjB49uuhSvhCqqqpSXV1ddBkAAHyBCe0AAABYq1RXVwtXPoHKysq0b98+tbW1RZcCAABrhSZFFwAAAAAAAABrO6EdAAAAAAAAFExoBwAAAAAAAAUT2gEAAABfeJ07d86FF15YdBkAALDShHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAKyUN998M4MHD05lZWU6duyYsWPHZo899sjxxx+f5J+PrDzrrLNKYzbZZJPcfPPNefnll/Ptb387lZWV2XrrrfPwww+XzfvHP/4xW265ZVq0aJHOnTtn7NixZf2LFi3KgAED0qpVq2y66aaZOHFio9oWL16c4cOHZ4MNNsh6662XPffcM3PmzFlt1wIAAFaV0A4AAABYKSeddFLuvffe3HTTTZk8eXKmTp2a2bNnl4254IILsvPOO+eRRx7Jv//7v+ewww7L4MGDM2jQoMyePTubbbZZBg8enBUrViRJZs2alQMPPDAHHXRQHn/88Zx55pkZNWpUxo8fX5pzyJAheeGFF3LPPffk+uuvz6WXXppFixaVrXvAAQdk0aJFuf322zNr1qzU1tZmr732yquvvrrarwsAAKyMZkUXAAAAAHzxNDQ05PLLL88111yTvfbaK0kyYcKEfO1rXysbt+++++aoo45KkpxxxhkZN25ctt9++xxwwAFJkpEjR6ZPnz556aWX0qFDh5x//vnZa6+9MmrUqCRJt27d8tRTT+W8887LkCFD8swzz+T222/PzJkzs/322ydJLr/88tTU1JTWnD59embOnJlFixalRYsWSZJf/epXufHGG3P99dfnyCOPXL0XBwAAVoKddgAAAMCnNm/evCxdujQ77rhjqW399ddP9+7dy8ZtvfXWpc8bbbRRkmSrrbZq1PavnXJ1dXXZeeedy+bYeeed8+yzz2bZsmWpq6tLs2bN0rt371J/jx490q5du9LxnDlz0tDQkPbt26eysrL089xzz2XevHmr+M0BAGD1sNMOAAAAWG3WWWed0ueKiooPbVu+fPlntmZDQ0M6duyYqVOnNup7b7gHAABrEjvtAAAAgE9ts802yzrrrJMHH3yw1Pbaa6/lmWeeWaV5a2pqMmPGjLK2GTNmpFu3bmnatGl69OiRd999N7NmzSr1z507N4sXLy4d19bW5sUXX0yzZs2y+eabl/1UVVWtUn0AALC6CO0AAACAT62ysjLDhg3LSSedlLvvvjtPPPFEhgwZkiZNVu1PDSeeeGKmTJmS0aNH55lnnsmECRNyySWXZMSIEUmS7t27Z++9985RRx2VBx98MLNmzcrw4cPTqlWr0hx9+/ZNnz59st9++2Xy5Ml5/vnnc9999+W0007Lww8/vEr1AQDA6iK0AwAAAFbKeeedl1133TUDBgxI3759s8suu5S9a25l1NbW5rrrrsukSZPSs2fPnHHGGfn5z3+eIUOGlMZceeWV6dSpU3bffffsv//+OfLII7PhhhuW+isqKnLbbbdlt912y9ChQ9OtW7ccdNBBmT9/fukdegAAsKbxTjsAAABgpVRWVubqq6/O1VdfXWq79dZbS5+ff/75RuesWLGi7Lhz586N2gYOHJiBAwd+6LodOnTILbfcUtZ22GGHlR23adMmF110US666KKP/R4AALAmsNMOAAAAAAAACia0AwAAAAAAgIJ5PCYAAADwmZk6dWrRJQAAwBeSnXYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBmhVdAAAAAPDpLViwIPX19att/oaGhrzyyiuZPXv2alsjSaqqqlJdXb1a1wAAgC8CoR0AAAB8wSxYsCA1NTVZsmTJal3nkUceyW233bZa12jdunXq6uoEdwAArPWEdgAAAPAFU19fnyVLluSaa65JTU1N0eWstLq6ugwaNCj19fVCOwAA1npCOwAAAPiCqqmpSW1tbdFlAAAAn4EmRRcAAAAAAAAAazuhHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAADAF9SoUaNyzjnnlLXNnTs3HTp0yBtvvLHS89bX12fDDTfM//zP/5S1H3TQQRk7duxKzVlRUZEbb7xxpWsqym677Zbf//73SZKlS5emc+fOefjhhwuuCgCALyOhHQAAAGu9F198Mcccc0y6dOmSFi1aZOONN86AAQMyZcqU1bru+PHj065du5U+f8aMGTn22GPL2k499dQcc8wxadOmTZLk7bffzpAhQ7LVVlulWbNm2W+//T523qqqqgwePDg//elPy9pPP/30nH322Xn99ddXuuYvkptvvjkvvfRSDjrooCRJ8+bNM2LEiIwcObLgygAA+DIS2gEAALBWe/7559O7d+/cfffdOe+88/L444/njjvuyDe+8Y386Ec/+sBz/vGPf3zOVX6wvn37prKysnS8YMGC3HLLLRkyZEipbdmyZWnVqlWOPfbY9O3b9xPPPXTo0EycODGvvvpqqa1nz57ZbLPNcs0113wm9a+JVqxYkXfffTdJctFFF2Xo0KFp0uT//fnk0EMPzfTp0/Pkk08WVSIAAF9SQjsAAADWaj/84Q9TUVGRmTNnZuDAgenWrVu23HLL/Md//EceeOCBJP98tOO4cePyrW99K+uuu27OPvvsJMlNN92U2tratGzZMl26dMnPfvazUuCTJOeff3622mqrrLvuutl4443zwx/+MA0NDUmSqVOnZujQoXn99ddTUVGRioqKnHnmmUmSd955JyNGjMhXv/rVrLvuutlxxx0zderU0rzLli1Lkuy6665l3+W6667LNttsk69+9aultnXXXTfjxo3LEUcckQ4dOnzi67LlllumU6dOueGGG8raBwwYkEmTJn3kuc8++2x22223tGzZMltssUX+8pe/NBozcuTIfOc730mSfOtb38qoUaMahaFnnXVWNtxww7Rp0ybDhw/PKaeckm233bbU/+677+bYY49Nu3bt0r59+4wcOTKHH3542W7C5cuXZ8yYMdl0003TqlWrbLPNNrn++utL/VOnTk1FRUVuv/329O7dOy1atMj06dPz8ssv5+67786AAQPKavrKV76SnXfe+WOvAQAAfFpCOwAAANZar776au6444786Ec/yrrrrtuo/72PrjzzzDPzne98J48//ni+//3vZ9q0aRk8eHCOO+64PPXUU/nNb36T8ePHlwK9JGnSpEkuuuiiPPnkk5kwYULuvvvunHzyyUmSnXbaKRdeeGHWW2+9LFy4MAsXLsyIESOSJD/+8Y9z//33Z9KkSXnsscdywAEHZO+9986zzz6bJKV/brHFFmX1Tps2Ldttt91ndn122GGHTJs2rVHbzJkz884773zgOcuXL8/++++f5s2b58EHH8xll132gY+TbNOmTSmkHDFiRH73u9/lggsuKPVPnDgxZ599ds4999zMmjUr1dXVGTduXNkc5557biZOnJgrr7wyM2bMyN///vdG780bM2ZMrrrqqlx22WV58sknc8IJJ2TQoEG59957y8adcsop+cUvfpG6urpsvfXWmT59elq3bp2amppPdF0AAGBVNSu6AAAAACjKX//616xYsSI9evT42LGHHHJIhg4dWjr+/ve/n1NOOSWHH354kqRLly4ZPXp0Tj755NK74I4//vjS+M6dO+ess87K0UcfnUsvvTTNmzdP27ZtU1FRUbYDbsGCBbnyyiuzYMGCdOrUKck/Q6077rgjV155Zc4555wsXLgwSbL++uuX1Th//vzPNLTr1KlTHnnkkUZtS5cuzYsvvphNNtmk0Tl33XVXnn766dx5552l+s8555zss88+ZeNOP/30zJ49O0my22675d13382kSZNKoebFF1+cYcOGla75GWeckcmTJ5d2Kv5rzKmnnlrasXfJJZfktttuK/W/8847Oeecc3LXXXelT58+Sf55n6ZPn57f/OY32X333Utjf/7zn6dfv36l4/nz52ejjTYqezTme6/B/PnzP+7yAQDApyK0AwAAYK21YsWKTzz2/WHYnDlzMmPGjLKddcuWLcvbb7+dJUuWpHXr1rnrrrsyZsyYPP300/n73/+ed999t6z/gzz++ONZtmxZunXrVtb+zjvvpH379qXPyT8f2/leb731Vlq2bPmJv9PHadWqVZYsWdKoLUmj9n+pq6vLxhtvXArskpQCs/f67//+74wZMyZJsssuu2T58uVZb731Sv1z587ND3/4w7Jzdthhh9x9991Jktdffz0vvfRSdthhh1J/06ZN07t37yxfvjzJP0PZJUuWlIVxSbJ06dL06tWrrO399/ejruUHXRcAAFhVQjsAAADWWl27dk1FRUWefvrpjx37/sdnNjQ05Gc/+1n233//RmNbtmyZ559/Pt/85jfzgx/8IGeffXbWX3/9TJ8+PcOGDcvSpUs/NLRraGhI06ZNM2vWrDRt2rSsr7KyMsn/e2zn+98BV1VVlddee+1jv8sn9eqrr2aDDTZo1JakUfuncf/99+fQQw/NUUcdlTlz5uT3v/99Hn/88YwdO3aV6n2/f+3Ku/XWW8ve85ckLVq0KDt+//39qGv5QdcFAABWlXfaAQAAsNZaf/31079///z617/Om2++2ah/8eLFH3pubW1t5s6dm80337zRT5MmTTJr1qwsX748Y8eOzde//vV069Yt//d//1c2R/PmzbNs2bKytl69emXZsmVZtGhRo3n/9RjN7t27J0n+9re/NTr3qaeeWplL8YGeeOKJRjvSnnjiiXzta19LVVXVB55TU1OTF154ofQIzyR54IEHysbcd9992WSTTTJs2LAkSXV1daPHTXbv3j0PPfRQWdt7j9u2bZuNNtqorG3ZsmWlR24m/3znX4sWLbJgwYJG13LjjTf+yO/eq1evvPjiix8Y3H3QdQEAgFUltAMAAGCt9utf/zrLli3LDjvskD/+8Y959tlnU1dXl4suuugDH+v4L2eccUauuuqq/OxnP8uTTz6Zurq6TJo0KaeffnqSZPPNN88//vGPXHzxxfnb3/6Wq6++OpdddlnZHJ07d05DQ0OmTJmS+vr6LFmyJN26dcuhhx6awYMH509/+lOee+65zJw5M2PGjMmtt96aJPnKV76SJHn00UfL5uvfv3/uv//+RkHgU089lUcffTSvvvpqXn/99Tz66KONzn2/JUuWZNasWfm3f/u3svZp06aVtf3v//5vevTokZkzZyZJ+vbtm27duuXwww/PnDlzMm3atJx22mllc3Tt2jULFizInXfemSS59tprc8MNN5SNOeaYY3L55ZdnwoQJefbZZ3PWWWflscceK3sk6DHHHJMxY8bkpptuyty5c3PcccfltddeK41p06ZNRowYkRNOOCETJkzIvHnzMnv27Fx88cWZMGHCR37/Xr16paqqKjNmzGjU9/5rAAAAnwWhHQAAAGu1Ll26ZPbs2fnGN76RE088MT179ky/fv0yZcqUjBs37kPP69+/f2655ZZMnjw522+/fb7+9a/nggsuyCabbJIk2WabbXL++efn3HPPTc+ePTNx4sTSO9z+ZaeddsrRRx+d733ve9lggw3yy1/+Mkly5ZVXZvDgwTnxxBPTvXv37LfffnnooYdSXV1ddv7tt99edrzPPvukWbNmueuuu8ra99133/Tq1St//vOfM3Xq1PTq1atsp9jzzz+fioqKTJ06tdR20003pbq6Orvuumup7e23386NN96YI444otT2j3/8I3Pnzi29461Jkya54YYb8tZbb2WHHXbI8OHDy977lyTf+ta3csIJJ+Tcc89Nkjz22GMZNWpU2ZhDDz00p556akaMGJHa2to899xzGTJkSNl75kaOHJmDDz44gwcPTp8+fVJZWZn+/fuXjRk9enRGjRqVMWPGpKamJnvvvXduvfXWbLrppvkoTZs2zdChQzNx4sSy9vvvvz+vv/56vvvd737k+QAA8GlVrPg0b90GAFar3XbbLZ07d85VV11VdCkAH8nvqzWL+7H2mT17dnr37p2NNtooN9xwQ9mOwF//+te5+eabS7vYPol77rkn+++/f/72t7+VdvF9/etfz7HHHptDDjmkNG7cuHG54YYbMnny5M/0e8yaNSu1tbUfO75fv37p0KFDrr766g/sX758eWpqanLggQdm9OjRq1zfiy++mC233DKzZ88uhbHf+973ss022+QnP/nJKs+/NvL7as3ifqxZ3I81i/uxZnE/WFs0K7oAAAAAYOX8/Oc/T319fVnb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RjnssMNSX19f6t9jjz3y4x//OMcff3yqqqrSv3//JMmkSZPSr1+/tGzZsqyuAQMG5Oabb85bb731od8fAADWVEI7AAAAWI0qKytTWVmZG2+8Me+8886Hjhs1alQGDhyYOXPm5NBDD81BBx2Uurq6j51/p512yoUXXpj11lsvCxcuzMKFCzNixIgPHHvdddflzDPPzDnnnJOHH344HTt2zKWXXlo25o033sjhhx+e6dOn54EHHkjXrl2z77775o033kiSLFu2LPvtt19at26dBx98ML/97W9z2mmnlc3x97//PQMGDMhWW22V2bNnZ/To0Rk5cmTZmMWLF2fPPfdMr1698vDDD+eOO+7ISy+9lAMPPLBs3IQJE9K8efPMmDEjl112WZJk2rRp2W677Rp9v+222y7vvvtuHnzwwY+9bgAAsKbxeEwAAABYjZo1a5bx48fniCOOyGWXXZba2trsvvvuOeigg7L11luXxh1wwAEZPnx4kmT06NH5y1/+kosvvrhRqPZ+zZs3T9u2bVNRUfGxj8y88MILM2zYsAwbNixJctZZZ+Wuu+4q22235557lp3z29/+Nu3atcu9996bb37zm/nLX/6SefPmZerUqaX1zj777PTr1690zu9///tUVFTkd7/7XWk33v/+7//miCOOKI255JJL0qtXr5xzzjmltiuuuCIbb7xxnnnmmXTr1i1J0rVr1/zyl78sq2n+/Pnp1KlTo+/XunXrtG3bNvPnz//I6wAAAGsiO+0AAABgNRs4cGD+7//+LzfffHP23nvvTJ06NbW1tRk/fnxpTJ8+fcrO6dOnzyfaafdp1NXVZccdd2y0znu99NJLOeKII9K1a9e0bds26623XhoaGrJgwYIkydy5c7PxxhuXBYQ77LBD2Rxz587N1ltvXfb4yvePmTNnTu65557STsTKysr06NEjSTJv3rzSuN69ezf6Hm+99VajR2P+S6tWrbJkyZIPvQYAALCmstMOAAAAPgctW7ZMv3790q9fv4waNSrDhw/PT3/60wwZMqTo0socfvjheeWVV/Kf//mf2WSTTdKiRYv06dMnS5cu/UzXaWhoyIABA3Luuec26uvYsWPp87rrrtuov6qqKq+99toHzvvqq69mgw02+OwKBQCAz4mddgAAAFCALbbYIm+++Wbp+IEHHijrf+CBB1JTU/OJ5mrevHmWLVv2seNqamoave/t/evOmDEjxx57bPbdd99sueWWadGiRerr60v93bt3zwsvvJCXXnqp1PbQQw+VzdG9e/c8/vjjZe/we/+Y2traPPnkk+ncuXM233zzsp8PCureq1evXnnqqacatc+bNy9vv/12evXq9ZHnAwDAmkhoBwAAAKvRK6+8kj333DPXXHNNHnvssTz33HP5wx/+kF/+8pf59re/XRr3hz/8IVdccUWeeeaZ/PSnP83MmTPz4x//+BOt0blz5zQ0NGTKlCmpr68vPR7y1FNPzeDBg0vjjjvuuFxxxRW58sorS+s8+eSTZXN17do1V199derq6vLggw/m0EMPTatWrUr9/fr1y2abbZbDDz88jz32WGbMmJHTTz89SVJRUZEkOeSQQ7J8+fIceeSRqaury5133plf/epXZWN+9KMf5dVXX83BBx+chx56KPPmzcudd96ZoUOHfmwA2b9//0yfPr1R+7Rp09KlS5dsttlmn+i6AQDAmkRoBwAAAKtRZWVldtxxx1xwwQXZbbfd0rNnz4waNSpHHHFELrnkktK4n/3sZ5k0aVK23nrrXHXVVbn22muzxRZbfKI1dtpppxx99NH53ve+lw022CC//OUvkyQLFy4svYsuSb73ve9l1KhROfnkk9O7d+/Mnz8/P/jBD8rmuvzyy/Paa6+ltrY2hx12WI499thsuOGGpf6mTZvmxhtvTENDQ7bffvsMHz48p512WpKU3jO33nrr5c9//nMeffTRbLvttjnttNNyxhlnlI3p1KlTZsyYkWXLluXf/u3fstVWW+X4449Pu3bt0qTJR/+54tBDD82TTz6ZuXPnlrVfe+21OeKIIz7RNQMAgDWNd9oBAADAatSiRYuMGTMmY8aM+chxnTp1yuTJkz+wr3PnzlmxYkXpeI899ig7TpJx48Zl3LhxZW3jx49vNNdPfvKT/OQnPylre+975Xr16tXoUZbf/e53y4579OhRttNtxowZSZLNN9+81LbTTjtlzpw5peOJEydmnXXWSXV1damta9eu+dOf/tSoxn+ZOnXqB7avv/76+fGPf5zzzz8/v/nNb5IkTz75ZB599NFcd911HzofAACsyYR2AAAAwKdyww03pLKyMl27ds1f//rXHHfccdl5553LHkt51VVXpUuXLvnqV7+aOXPmZOTIkTnwwAPLHrW5Kk477bRceumlWb58eZo0aZKFCxfmqquuStu2bT+T+QEA4PMmtAMAAAA+lTfeeCMjR47MggULUlVVlb59+2bs2LFlY1588cWcccYZefHFF9OxY8cccMABOfvssz+zGtq1a1e2Y7Bv376f2dwAAFAEoR0AAAAU7P2PulzTDR48OIMHD/7IMSeffHJOPvnkz6kiAAD44vvoNzsDAAAAAAAAq53QDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYM2KLgAAAGBtUFdXV3QJAGsFv28BgC8qoR0AAMBqVFVVldatW2fQoEFFlwKw1mjdunWqqqqKLgMA4FMR2gEAAKxG1dXVqaurS319fdGlwKcyfPjwdOzYMaNHjy66FPjUqqqqUl1dXXQZAACfitAOAABgNauurvbHY75wKisr0759+9TW1hZdCgAArBWaFF0AAAAAAAAArO2EdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAfOF17tw5F154YdFlAADAShPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAACwUt58880MHjw4lZWV6dixY8aOHZs99tgjxx9/fJJ/PrLyrLPOKo3ZZJNNcvPNN+fll1/Ot7/97VRWVmbrrbfOww8/XDbvH//4x2y55ZZp0aJFOnfunLFjx5b1L1q0KAMGDEirVq2y6aabZuLEiY1qW7x4cYYPH54NNtgg6623Xvbcc8/MmTNntV0LAABYVUI7AAAAYKWcdNJJuffee3PTTTdl8uTJmTp1ambPnl025oILLsjOO++cRx55JP/+7/+eww47LIMHD86gQYMye/bsbLbZZhk8eHBWrFiRJJk1a1YOPPDAHHTQQXn88cdz5plnZtSoURk/fnxpziFDhuSFF17IPffck+uvvz6XXnppFi1aVLbuAQcckEWLFuX222/PrFmzUltbm7322iuvvvrqar8uAACwMpoVXQAAAADwxdPQ0JDLL78811xzTfbaa68kyYQJE/K1r32tbNy+++6bo446KklyxhlnZNy4cdl+++1zwAEHJElGjhyZPn36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Ofvss5MkN910U2pra9OyZct06dIlP/vZz0qBT5Kcf/752WqrrbLuuutm4403zg9/+MM0NDQkSaZOnZqhQ4fm9ddfT0VFRSoqKnLmmWcmSd55552MGDEiX/3qV7Puuutmxx13zNSpU0vzLlu2LEmy6667ln2X6667Lttss02++tWvltrWXXfdjBs3LkcccUQ6dOjwia/LlltumU6dOuWGG24oax8wYEAmTZr0kec+++yz2W233dKyZctsscUW+ctf/tJozMiRI/Od73wnSfKtb30ro0aNahSGnnXWWdlwww3Tpk2bDB8+PKecckq23XbbUv+7776bY489Nu3atUv79u0zcuTIHH744WW7CZcvX54xY8Zk0003TatWrbLNNtvk+uuvL/VPnTo1FRUVuf3229O7d++0aNEi06dPz8svv5y77747AwYMKKvpK1/5SnbeeeePvQYAAPBpCe0AAABYa7366qu544478qMf/Sjrrrtuo/73PrryzDPPzHe+8508/vjj+f73v59p06Zl8ODBOe644/LUU0/lN7/5TcaPH18K9JKkSZMmueiii/Lkk09mwoQJufvuu3PyyScnSXbaaadceOGFWW+99bJw4cIsXLgwI0aMSJL8+Mc/zv33359JkyblscceywEHHJC99947zz77bJKU/rnFFluU1Ttt2rRst912n9n12WGHHTJt2rRGbTNnzsw777zzgecsX748+++/f5o3b54HH3wwl1122Qc+TrJNmzalkHLEiBH53e9+lwsuuKDUP3HixJx99tk599xzM2vWrFRXV2fcuHFlc5x77rmZOHFirrzyysyYMSN///vfG703b8yYMbnqqqty2WWX5cknn8wJJ5yQQYMG5d577y0bd8opp+QXv/hF6urqsvXWW2f69Olp3bp1ampqPtF1AQCAVdWs6AIAAACgKH/961+zYsWK9OjR42PHHnLIIRk6dGjp+Pvf/35OOeWUHH744UmSLl26ZPTo0Tn55JNL74I7/vjjS+M7d+6cs846K0cffXQuvfTSNG/ePG3btk1FRUXZDrgFCxbkyiuvzIIFC9KpU6ck/wy17rjjjlx55ZU555xzsnDhwiTJ+uuvX1bj/PnzP9PQrlOnTnnkkUcatS1dujQvvvhiNtlkk0bn3HXXXXn66adz5513luo/55xzss8++5SNO/300zN79uwkyW677ZZ33303kyZNKoWaF198cYYNG1a65meccUYmT55c2qn4rzGnnnpqacfeJZdckttuu63U/8477+Scc87JXXfdlT59+iT5532aPn16fvOb32T33Xcvjf35z3+efv36lY7nz5+fjTbaqOzRmO+9BvPnz/+4ywcAAJ+K0A4AAIC11ooVKz7x2PeHYXPmzMmMGTPKdtYtW7Ysb7/9dpYsWZLWrVvnrrvuypgxY/L000/n73//e959992y/g/y+OOPZ9myZenWrVtZ+zvvvJP27duXPif/fGzne7311ltp2bLlJ/5OH6dVq1ZZsmRJo7Ykjdr/pa6uLhtvvHEpsEtSCsze67//+78zZsyYJMkuu+yS5cuXZ7311iv1z507Nz/84Q/Lztlhhx1y9913J0lef/31vPTSS9lhhx1K/U2bNk3v3r2zfPnyJP8MZZcsWVIWxiXJ0qVL06tXr7K299/fj7qWH3RdAABgVQntAAAAWGt17do1FRUVefrppz927Psfn9nQ0JCf/exn2X///RuNbdmyZZ5//vl885vfzA9+8IOcffbZWX/99TN9+vQMGzYsS5cu/dDQrqGhIU2bNs2sWbPStGnTsr7Kysok/++xne9/B1xVVVVee+21j/0un9Srr76aDTbYoFFbkkbtn8b999+fQw89NEcddVTmzJmT3//+93n88cczduzYVar3/f61K+/WW28te89fkrRo0aLs+P3396Ou5QddFwAAWFXeaQcAAMBaa/3110///v3z61//Om+++Waj/sWLF3/oubW1tZk7d24233zzRj9NmjTJrFmzsnz58owdOzZf//rX061bt/zf//1f2RzNmzfPsmXLytp69eqVZcuWZdGiRY3m/ddjNLt3754k+dvf/tbo3KeeemplLsUHeuKJJxrtSHviiSfyta99LVVVVR94Tk1NTV544YXSIzyT5IEHHigbc99992WTTTbJsGHDkiTV1dWNHjfZvXv3PPTQQ2Vt7z1u27ZtNtpoo7K2ZcuWlR65mfzznX8tWrTIggULGl3LjTfe+CO/e69evfLiiy9+YHD3QdcFAABWldAOAACAtdqvf/3rLFu2LDvssEP++Mc/5tlnn01dXV0uuuiiD3ys47+cccYZueqqq/Kzn/0sTz75ZOrq6jJp0qScfvrpSZLNN988//jHP3LxxRfnb3/7W66++upcdtllZXN07tw5DQ0NmTJlSurr67NkyZJ069Ythx56aAYPHpw//elPee655zJz5syMGTMmt956a5LkK1/5SpLk0UcfLZuvf//+uf/++xsFgU899VQeffTRvPrqq3n99dfz6KOPNjr3/ZYsWZJZs2bl3/7t38rap02bVtb2v//7v+nRo0dmzpyZJOnbt2+6deuWww8/PHPmzMm0adNy2mmnlc3RtWvXLFiwIHfeeWeS5Nprr80NN9xQNuaYY47J5ZdfngkTJuTZZ5/NWWedlccee6zskaDHHHNMxowZk5tuuilz587Ncccdl9dee600pk2bNhkxYkROOOGETJgwIfPmzcvs2bNz8cUXZ8KECR/5/Xv16pWqqqrMmDGjUd/7rwEAAHwWhHYAAACs1bp06ZLZs2fnG9/4Rk488cT07Nkz/fr1y5QpUzJu3LgPPa9///655ZZbMnny5Gy//fb5+te/ngsuuCCbbLJJkmSbbbbJ+eefn3PPPTc9e/bMxIkTS+9w+5eddtopRx99dL73ve9lgw02yC9/+cskyZVXXpnBgwfnxBNPTPfu3bPffvvloYceSnV1ddn5t99+e9nxPvvsk2bNmuWuu+4qa993333Tq1ev/PnPf87UqVPTq1evsp1izz//fCoqKjJ16tRS20033ZTq6ursuuuupba33347N954Y4444ohS2z/+8Y/MnTu39I63Jk2a5IYbbshbb72VHXbYIcOHDy9771+SfOtb38oJJ5yQc889N0ny2GOPZdSoUWVjDj300Jx66qkZMWJEamtr89xzz2XIkCFl75kbOXJkDj744AwePDh9+vRJZWVl+vfvXzZm9OjRGTVqVMaMGZOamprsvffeufXWW7PpppvmozRt2jRDhw7NxIkTy9rvv//+vP766/nud7/7kecDAMCnVbHi07x1GwBYrXbbbbd07tw5V111VdGlAHwkv6+gWLNnz07v3r2z0UYb5YYbbijbEfjrX/86N998c2kX2ydxzz33ZP/998/f/va30i6+r3/96zn22GNzyCGHlMaNGzcuN9xwQyZPnvyZfo9Zs2altrb2Y8f369cvHTp0yNVXX/2B/cuXL09NTU0OPPDAjB49epXre/HFF7Pllltm9uzZpTD2e9/7XrbZZpv85Cc/WeX5oWj+e75mcT/WLO7HmsX9YG3RrOgCAAAAgJXz85//PPX19WVtRx11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WGbOnFkac9JJJ+Xee+/NTTfdlMmTJ2fq1KmZPXt22Tz/+Mc/Mnr06MyZMyc33nhjnn/++QwZMqTRemeeeWYuueSS3HfffXnhhRdy4IEH5sILL8zvf//73HrrrZk8eXIuvvji0vg333wz//Ef/5GHH344U6ZMSZMmTfKd73wny5cvL5v3lFNOyXHHHZe6urr0798/Y8eOzfjx43PFFVdk+vTpefXVV3PDDTd85LVoaGjINddck8033zzt27dPknTo0CEPPPBA5s+f/2kvLQBrqWZFFwAAAAAArHluueWWVFZWlrUtW7as9PmrX/1qRowYUTo+5phjcuedd+a6667LDjvskIaGhlx++eW55pprstdeeyVJJkyYkK997Wtlc37/+98vfe7SpUsuuuiibL/99mloaChb/6yzzsrOO++cJBk2bFhOPfXUzJs3L126dEmSfPe7380999yTkSNHJkkGDhxYts4VV1yRDTbYIE899VR69uxZaj/++OOz//77l44vvPDCnHrqqaW2yy67LHfeeedHXp8333wzHTt2zC233JImTf65T+KnP/1p9t9//3Tu3DndunVLnz59su++++a73/1uaQwAvJf/OgAAAAAAjXzjG9/Io48+WvbzX//1X6X+ZcuWZfTo0dlqq62y/vrrp7KyMnfeeWcWLFiQJJk3b16WLl2aHXfcsXTO+uuvn+7du5etM2vWrAwYMCDV1dVp06ZNdt999yQpzfMvW2+9denzRhttlNatW5cCu3+1vfexms8++2wOPvjgdOnSJeutt146d+78gfNut912pc+vv/56Fi5cWFZzs2bNysZ80PWZOXNm+vfvn3322ae0s65jx465//778/jjj+e4447Lu+++m8MPPzx77713o91+AJDYaQcAAAAAfIB11103m2++eVnb//zP/5Q+n3feefnP//zPXHjhhdlqq62y7rrr5vjjj8/SpUs/8Rpvvvlm+vfvn/79+2fixInZYIMNsmDBgvTv37/RPOuss07pc0VFRdnxv9reG4YNGDAgm2yySX73u9+lU6dOWb58eXr27Nlo3nXXXfcT1/v+8957ff7rv/4rbdu2ze9+97ucddZZpfaePXumZ8+e+eEPf5ijjz46u+66a+6999584xvfWKl1AfjystMOAAAAAPjUZsyYkW9/+9sZNGhQttlmm3Tp0iXPPPNMqX+z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O7fBvD/5yU+y5557pmnTpunUqVPGjx/foH/p0qUZOnRomjdvnt122y3Tpk1br7YVK1Zk9OjRadu2bVq1apVDDz008+fP32z3AuDvCe0AAAAAAPjIjB07Ng8//HB+9rOfZfr06Zk5c2bmzZvXYMy1116bfv365Yknnsjhhx+eE088MSNHjsyIESMyb968dOnSJSNHjsy6deuSJLW1tTnmmGNy7LHH5qmnnsoll1ySCy+8MJMnTy7NOWrUqLz00kv51a9+lbvuuivf+973snTp0gbrDh8+PEuXLs3999+f2tra1NTUZODAgXnttdc2+30BKC+6AAAAAAAAtg319fWZOHFipk6dmoEDByZJpkyZkl133bXBuMMOOyynn356kuSiiy7KjTfemH333TfDhw9PknzjG99I375988orr6Rdu3a55pprMnDgwFx44YVJkm7duuWZZ57JVVddlVGjRmXBggW5//77M2fOnOy7775JkokTJ6a6urq05qxZszJnzpwsXbo0TZs2TZJcffXVufvuu3PXXXfltNNO27w3B9jm2WkHAAAAAMBHYuHChVm9enX233//UtuOO+6Y3XffvcG4Xr16lT7vvPPOSZKePXuu1/a3nXJ1dXXp169fgzn69euX5557LmvWrEldXV3Ky8vTp0+fUn/37t3TunXr0vH8+fNTX1+fNm3apKKiovTzwgsvZOHChRt55QD/mp12AAAAAABsUZo0aVL6XFZW9k/b1q5du8nWrK+vT/v27TNz5sz1+v4+3APYXOy0AwAAAADgI9GlS5c0adIkjz/+eKnt9ddfz4IFCzZq3urq6syePbtB2+zZs9OtW7c0btw43bt3zzvvvJPa2tpS/7PPPpsVK1aUjmtqavLyyy+nvLw8Xbt2bfBTWVm5UfUBbAihHQAAAAAAH4mKioqccsopGTt2bB566KE8/fTTGTVqVBo12rg/VZ999tmZMWNGxo0blwULFmTKlCm54YYbcs455yRJdt999wwZMiSnn356Hn/88dTW1mb06NFp3rx5aY5Bgwalb9++OeqoozJ9+vS8+OKLefTRR/Otb30rc+fO3aj6ADaE0A4AAAAAgI/MVVddlYMOOihDhw7NoEGDcuCBBzb4rrkPo6amJnfccUduv/329OjRIxdddFG+/e1vZ9SoUaUxkyZNSocOHXLwwQfn6KOPzmmnnZaddtqp1F9WVpb77rsv/fv3z8knn5xu3brl2GOPzaJFi0rfoQewOflOOwAAAAAAPjIVFRW57bbbctttt5Xafv7zn5c+v/jii+uds27dugbHnTp1Wq9t2LBhGTZs2D9dt127drn33nsbtJ144okNjrfffvtcd911ue666/7ldQBsanbaAQAAAAAAQMGEdgAAAAAAAFAwr8cEAAAAAKBQM2fOLLoEgMLZaQcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABSsvOgCAAAAAAD4aCxevDjLli3bbPPX19dn+fLlmTdv3mZbI0kqKytTVVW1WdcA+KgJ7QAAAAAAtgGLFy9OdXV1Vq1atVnXeeKJJ3Lfffdt1jVatGiRuro6wR3wsSK0AwAAAADYBixbtiyrVq3K1KlTU11dXXQ5H1pdXV1GjBiRZcuWCe2AjxWhHQAAAADANqS6ujo1NTVFlwHAP2hUdAEAAAAAAACwrRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAwDbqkksuyd577/2RrDVjxoxUV1dnzZo1Ddr79++fH/3oRxs197HHHpvx48c3aHvggQey9957Z+3atRs1N8BHRWgHAAAAALCVevXVV/OlL30pVVVVadq0adq1a5fBgwdn9uzZhdTzfiHgueeemwsuuCCNGzcutd1zzz155ZVXcuyxx5bafvCDH2TAgAFp1apVysrKsmLFin+57gUXXJDLL788b7zxRqltyJAhadKkSaZNm/ahrwfgoyS0AwAAAADYSg0bNixPPPFEpkyZkgULFuSee+7JgAEDsnz58qJLa2DWrFlZuHBhhg0b1qD9uuuuy8knn5xGjf7fn6pXrVqVIUOG5Jvf/OYGz9+jR4906dIlU6dObdA+atSoXHfddRtXPMBHRGgHAAAAALAVWrFiRR555JF85zvfySGHHJKOHTtmv/32y/nnn5/Pf/7zpTGjR49O27Zt079//yTJggUL3nfem2++OdXV1WnWrFm6d++e733vew36//jHP+a4447LjjvumJYtW2afffbJ448/nsmTJ+fSSy/N/PnzU1ZWlrKyskyePDlJcvvtt+czn/lMmjVrVprn1VdfzUMPPZShQ4c2mH/MmDE577zz8ulPf/oD3Y+hQ4fm9ttvX69t7ty5Wbhw4QeaC6AI5UUXAAAAAADAB1dRUZGKiorcfffd+fSnP52mTZuuN2b48OFp3rx57r///vzxj3/MF77whZxxxhn57Gc/mx133HG98dOmTctFF12UG264Ib17984TTzyRU089NS1btsxJJ52U+vr6HHzwwdlll11yzz33pF27dpk3b17Wrl2bf//3f8/TTz+dBx54IL/85S+TJDvssEOS5JFHHsnxxx/fYK1Zs2alRYsWqa6u3iT3Y7/99svll1+et956q3QvqqqqsvPOO+eRRx5Jly5dNsk6AJuL0A4AAAAAYCtUXl6eyZMn59RTT81NN92UmpqaHHzwwTn22GPTq1evzJo1K3PmzMnSpUvTtGnT0isot99++9x111057bTT1pvz4osvzvjx43P00UcnSXbbbbc888wz+f73v5+TTjopP/rRj/Lqq6/mN7/5TSn069q1a+n8ioqKlJeXp127dg3mXbRoUTp06LBe284779zg1Zgbo0OHDlm9enVefvnldOzYsUH7okWLNskaAJuT0A4AAAAAYCs1bNiwHH744XnkkUfy2GOP5f77789//dd/5eabb87KlStTX1+fNm3aJEnWrl2bJPnzn//8nq+LXLlyZRYuXJhTTjklp556aqn9nXfeKe2Ye/LJJ9O7d+/33KX3fv761782eDXmP2vbGM2bN0/y7nfi/WP7P7YBbImEdgAAAAAAW7FmzZrlM5/5TD7zmc/kwgsvzOjRo3PxxRfny1/+ctq3b5+ZM2cmSX73u9/lqKOOyv/+7/+mX79+681TX1+fJPnhD3+Y/fffv0Ff48aNk/y/YOyDqqyszOuvv/4v2zbGa6+9liRp27bteu3/2AawJdo0+44BAAAAANgi7LHHHlm5cmVqamry8ssvp7y8PF27ds0nP/nJJMknP/nJVFZWrnfezjvvnA4dOuQPf/hDunbt2uBnt912S5L06tUrTz75ZCkg+0fbbbdd1qxZs157796988wzz6zX9vLLL2+y4O7pp5/Orrvu2uDa3nzzzSxcuDC9e/feJGsAbE5COwAAAACArdDy5ctz6KGHZurUqfntb3+bF154IXfeeWf+67/+K0ceeWQGDRqUvn375qijjsr06dPz5z//OUny3e9+N3Pnzn3POS+99NJcccUVue6667JgwYI89dRTmTRpUq655pokyXHHHZd27drlqKOOyuzZs/OHP/whP/nJT/LrX/86SdKpU6e88MILefLJJ7Ns2bK89dZbSZLBgwdn1qxZDdbq3bt3KisrM3v27AbtL7/8cp588sk8//zzSZKnnnrqfYPCv3nkkUfy2c9+tkHbY489lqZNm6Zv374bcksBCiW0AwAAAADYClVUVGT//ffPtddem/79+6dHjx658MILc+qpp+aGG25IWVlZ7rvvvvTv3z8nn3xyvvCFLyRJlixZkp133vk95xw9enRuvvnmTJo0KT179szBBx+cyZMnl3babbfddpk+fXp22mmnHHbYYenZs2euvPLK0uszhw0bliFDhuSQQw5J27Zt8+Mf/zhJcsIJJ+R3v/tdnn322dJajRs3zsknn5xp06Y1qOGmm25K7969S9+r179///Tu3Tv33HNPg3EXX3xx6fObb76Zu+++u8F38SXJj3/845xwwglp0aLFB76/AB+1snXr1q0ruggA4F39+/dPp06dcuuttxZdCsD78rwCgK2f3+fbnnnz5qVPnz6pra1NTU3NR77+2LFj83//7//N97///VLbyy+/nD333DPz5s1Lx44dN2iev13HxRdfnEsuuSRJcuONN+anP/1ppk+fXhq3bNmy7L777pk7d24pdGTr5HnFtsJOOwAAAAAANrtvfetb6dixY9auXVtqa9euXSZOnJjFixdv8DwLFy5MkhxxxBGltiZNmuT6669vMO7FF1/M9773PYEdsNUoL7oAAAAAAAA+/lq3bp1vfvOb67Uf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QrCWLVvmxhtvzLx58/5paNe7d+/07t27dNypU6f87//+bx555JEGoV15eXnatWv3T2v92te+lq9+9as577zzSm277777B6q3c+fO6dy5c2lMx44dM3PmzDzyyCMN1qqsrCzVcvvtt6dFixYNQrvjjz++wfhrrrkmEydOzG9/+9sMHDgwdXV1eeCBB/Kb3/wm++yzT5Lk+uuvz2GHHZarr746HTp0yG233ZajjjoqZ5xxRqm2888/P9/5znfyH//xHykrKyvNv9NOO6V169bveV8+7L+fv+f1mAAAAAAAAB/CpEmT8oc//CEXX3zxh55j7dq1OfHEEzN27NjsueeeG3TOG2+8kR133PFDr5kkTzzxRB599NEcfPDBDdqfe+65dOjQIZ07d84JJ5yQxYsXl/qWLl2axx9/PDvttFMOOOCA7Lzzzjn44IMza9asjar3+eefzwMPPLBeLX9v4sSJOfbYY9OyZcv37F+9enV+8IMfZIcddshee+2V5N1dga1bty4FdkkyaNCgNGrUqPQazbfeeivNmjVrMFfz5s3zxz/+MYsWLWrQvvfee6d9+/b5zGc+k9mzZ7/vNX8YQjsAAAAAAIAP6Lnnnst5552XqVOnrvcKyQ/iO9/5TsrLy/PVr351g8Y///zzuf7663P66ad/qPV23XXXNG3aNPvss0/+4z/+I6NHjy717b///pk8eXIeeOCB3HjjjXnhhRdy0EEH5S9/+UuS5A9/+EOSd79L7tRTT80DDzyQmpqaDBw4MM8999wHrveAAw5Is2bN8qlPfSoHHXRQvv3tb7/nHHPmzMnTTz/doNa/uffee1NRUZFmzZrl2muvzS9+8YtUVlYmSV5++eUGr7BM3t1JuOOOO5a+j27w4MH53//938yYMSNr167NggULMn78+CTJkiVLkiTt27fPTTfdlJ/85Cf5yU9+kk9+8pMZMGBA5s2b989v9Ifg9ZgAAAAAAAAfwJo1a3L88cfn0ksvTbdu3T70PLW1tfnv//7vzJs3r8FrGP+ZP/3pTxkyZEiGDx+eU0899UOt+cgjj6S+vj6PPfZYzjvvvHTt2jXHHXdckjR4vWOvXr2y//77p2PHjrnjjjtyyimnZO3atUmS008/PSeffHKSd1+7OWPGjNxyyy254oorPlC9//M//5O//OUvmT9/fsaOHZurr74655577nrjJk6cmJ49e2a//fZbr++QQw7Jk08+mWXLluWHP/xhjjnmmNJuwA1x6qmnZuHChTniiCPy9ttvp1WrVjnrrLNyySWXlL6nb/fdd2/wCtADDjggCxcuzLXXXpvbbrttg9bZEHbaAQAAAAAAfAB/+ctfMnfu3Jx55pkpLy9PeXl5vv3tb2f+/PkpLy/PQw89tEHzPPLII1m6dGmqqqpK8yxatChnn312OnXq1GDsn//85xxyyCE54IAD8oMf/OBD177bbrulZ8+eOfXUU/O1r30tl1xyyT8d27p163Tr1i3PP/98knd3nCXJHnvs0WBcdXV1g9dobmi9n/zkJ7PHHnvkuOOOy5VXXplLLrkka9asaTBm5cqVuf3223PKKae85xwtW7ZM165d8+lPfzoTJ05MeXl5Jk6cmCRp165dli5d2mD8O++8k9dee630XXllZWX5zne+k/r6+ixatCgvv/xyKRz8++/d+0f77bdf6b5sKnbaAQAAAAAAfACtWrXKU0891aDte9/7Xh566KHcdddd2W233TZonhNPPDGDBg1q0DZ48OCceOKJpZ1sybs71g455JD06dMnkyZNKu0A21hr167NW2+99U/76+vrs3Dhwpx44olJkk6dOqVDhw559tlnG4xbsGBBg116H6betWvX5u233y7t5vubO++8M2+99VZGjBjxga+pb9++WbFiRWpra9OnT58kyUMPPZS1a9dm//33b3Be48aNs8suuyRJfvzjH6dv375p27btP13nySefLIWYm4rQDgAAAAAA2ObV19c32Dn1wgsv5Mknn8yOO+6YqqqqnH/++fnTn/6UW2+9NY0aNUqPHj0anL/TTjulWbNmDdr/1Zxt2rRJmzZtGszTpEmTtGvXrvQ6xj/96U8ZMGBAOnbsmKuvvjqvvvpqaezfdoslyTPPPFMK0+rr6/Pkk08mSfbee+8kyXe/+91UVVWle/fuSZL/83/+T66++uoG36V3zjnnZOjQoenYsWP+/Oc/5+KLL07jxo1Lr88sKyvL2LFjc/HFF2evvfbK3nvvnSlTpuT3v/997rrrrg2ud9q0aWnSpEl69uyZpk2bZu7cuTn//PPz7//+72nSpEmD+zFx4sQcddRR692nlStX5vLLL8/nP//5tG/fPsuWLct3v/vd/OlPf8rw4cOTvLsDcMiQITn11FNz00035e23386ZZ56Z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PIceemiWLl2a+++/P9XV1WnVqlWOP/74rFq1qnTeAw88kAMPPDCtW7dOmzZtcsQRR2ThwoWl/hdffDFlZWX5n//5nxx88MFp1qxZpk2bljVr1uTrX/966bxzzz0369atW6/upk2bpl27dmnXrl323nvvnHfeeXnppZfy6quvJknuueeeHHPMMTnllFPStWvX7LnnnjnuuONy+eWXb/S9BwAAANjaCO0AADaTN998M3369MnPf/7zPP300znttNNy4oknZs6cOaUxY8eOzcMPP5yf/exnmT59embOnJl58+Y1mOftt9/OuHHjMn/+/Nx999158cUXM2rUqPXWu+SSS3LDDTfk0UcfzUsvvZRjjjkmEyZMyI9+9KP8/Oc/z/Tp03P99deXxq9cuTJf//rXM3fu3MyYMSONGjXKF77whaxdu7bBvOedd17OOuus1NXVZfDgwRk/fnwmT56cW265JbNmzcprr72Wn/70p+97L+rr6zN16tR07do1bdq0SZK0a9cujz32WBYtWvRBby0AAADAx0550QUAAGyt7r333lRUVDRoW7NmTenzLrvsknPOOad0/JWvfCUPPvhg7rjjjuy3336pr6/PxIkTM3Xq1AwcODBJMmXKlOy6664N5vziF79Y+ty5c+dcd9112XfffVNfX99g/csuuyz9+vVLkpxyyik5//zzs3DhwnTu3DlJ8m//9m/51a9+lW984xtJkmHDhjVY55Zbbknbtm3zzDPPpEePHqX2MWPG5Oijjy4dT5gwIeeff36p7aabbsqDDz74vvdn5cqVad++fe699940avTu/zd28cUX5+ijj06nTp3SrVu39O3bN4cddlj+7d/+rTQGAAAAYFvhryEAAB/SIYcckieffLLBz80331zqX7NmTcaNG5eePXtmxx13TEVFRR588MEsXrw4SbJw4cKsXr06+++/f+mcHXfcMbvvvnuDdWprazN06NBUVVVl++23z8EHH5wkpXn+plevXqXPO++8c1q0aFEK7P7W9vev1Xzuuedy3HHHpXPnzmnVqlU6der0nvPus88+pc9vvPFGlixZ0qDm8vLyBmPe6/7MmTMngwcPzuc+97nSzrr27dvn17/+dZ566qmcddZZeeedd3LSSSdlyJAh6+32AwAAAPi4s9MOAOBDatmyZbp27dqg7Y9//GPp81VXXZX//u//zoQJ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z7vsskvOOeec0vFXvvKVPPjgg7njjjuy3377pb6+PhMnTszUqVMzcODAJMmUKVOy6667Npjzi1/8Yulz586dc91112XfffdNfX19g/Uvu+yy9OvXL0lyyimn5Pzzz8/ChQvTuXPnJMm//du/5Ve/+lW+8Y1vJEmGDRvWYJ1bbrklbdu2zTPPPJMePXqU2seMGZOjjz66dDxhwoScf/75pbabbropDz744Pven5UrV6Z9+/a5995706jRu/tWLr744hx99NHp1KlTunXrlr59++awww7Lv/3bv5XGABTN0wgAAAAAYAt3yCGH5Mknn2zwc/PNN5f616xZk3HjxqVnz57ZcccdU1FRkQcffDCLFy9OkixcuDCrV6/O/vvvXzpnxx13zO67795gndra2gwdOjRVVVXZfvvtc/DBBydJaZ6/6dWrV+nzzjvvnBYtWpQCu7+1/f1rNZ977rkcd9xx6dy5c1q1apVOnTq957z77LNP6fMbb7yRJUuWNKi5vLy8wZj3uj9z5szJ4MGD87nPfa60s659+/b59a9/naeeeipnnXVW3nnnnZx00kkZMmTIerv9AIpipx0AAAAAwBauZcuW6dq1a4O2P/7xj6XPV111Vf77v/87EyZMSM+ePdOyZcuMGTMmq1ev3uA1Vq5cmcGDB2fw4MGZNm1a2rZtm8WLF2fw4MHrzdOkSZPS57KysgbHf2v7+zBs6NCh6dixY374wx+mQ4cOWbt2bXr06LHevC1bttzgev/xvL+/PzfffHN22GGH/PCHP8xll11Wau/Ro0d69OiRL3/5yznjjDNy0EEH5eGHH84hhxzyodYF2JTstAMAAAAA2MrNnj07Rx55ZEaMGJG99tornTt3zoIFC0r9Xbp0SZMmTfL444+X2l5//fUGY37/+99n+fLlufLKK3PQQQele/fuDXbLfVjLly/Ps88+mwsuuCADBw5MdXV1Xn/99X953g477JD27ds3qPmdd95JbW3tvzy3rKwsjRo1yl//+td/OmaPPfZI8m5YCbAlsNMOAAAAAGAr96lPfSp33XVXHn300XziE5/INddck1deeaUUTFVUVOSUU07J2LFj06ZNm+y000751re+1eD73KqqqrLddtvl+uuvzxlnnJGnn34648aN2+jaPvGJT6RNmzb5wQ9+kPbt22fx4sU577zzNujcs846K1deeWU+9alPpXv37rnmmmuyYsWK9ca99dZbefnll5O8G0becMMNqa+vz9ChQ5MkX/rSl9KhQ4cceuih2XXXXbNkyZJcdtlladu2bfr27bvR1wiwKdhpBwAAAACwlbvgggtSU1OTwYMHZ8CAAWnXrl2OOuqoBmOuuuqqHHTQQRk6dGgGDRqUAw88MH369Cn1t23bNpMnT86dd96ZPfbYI1deeWWuvvrqja6tUaNGuf3221NbW5sePXrka1/7Wq666qoNOvfss8/OiSeemJNOOil9+/bN9ttvny984QvrjXvggQfSvn37tG/fPvvvv39+85vf5M4778yAAQOSJIMGDcpjjz2W4cOHp1u3bhk2bFiaNWuWGTNmpE2bNht9jQCbQtm6devWFV0EAPCu/v37p1OnTrn11luLLgXgfXleAcDmNW/evPTp0ye1tbWpqakpuhyAjz3PXbYEdtoBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABSsvOgCAAAAAID3VldXV3QJANsEz1u2BEI7AAAAANjCVFZWpkWLFhkxYkTRpQBsM1q0aJHKysqiy2AbJrQDAAAAgC1MVVVV6urqsmzZss22xujRo9O+ffuMGzdus60BsCl8VM+rysrKVFVVbdY14P0I7QAAAABgC1RVVbVZ/3hcUVGRNm3apKamZrOtAbApeF6xrWhUdAEAAAAAAACwrRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAsMXr1KlTJkyYUHQZAP+S5xUfltAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAACA97Ry5cqMHDkyFRUVad++fcaPH58BAwZkzJgxSd59Bdxll11WGtOxY8fcc889efXVV3PkkUemoqIivXr1yty5cxvM+5Of/CR77rlnmjZtmk6dOmX8+PEN+pcuXZqhQ4emefPm2W233TJt2rT1aluxYkVGjx6dtm3bplWrVjn00EMzf/78zXYvgC2b5xUfB0I7AAAAAOA9jR07Ng8//HB+9rOfZfr06Zk5c2bmzZvXYMy1116bfv365Yknnsjhhx+eE088MSNHjsyIESMyb968dOnSJSNHjsy6deuSJLW1tTnmmGNy7LHH5qmnnsoll1ySCy+8MJMnTy7NOWrUqLz00kv51a9+lbvuuivf+973snTp0gbrDh8+PEuXLs3999+f2tra1NTUZODAgXnttdc2+30BtjyeV3wclBddAAAAAACw5amvr8/EiRMzderUDBw4MEkyZcqU7Lrrrg3GHXbYYTn99NOTJBdddFFuvPHG7Lvvvhk+fHiS5Bvf+Eb69u2bV155Je3atcs111yTgQMH5sILL0ySdOvWLc8880yuuuqqjBo1KgsWLMj999+fOXPmZN99902STJw4MdXV1aU1Z82alTlz5mTp0qVp2rRpkuTqq6/O3XffnbvuuiunnXba5r05wBbF84qPCzvtAAAAAID1LFy4MKtXr87+++9fattxxx2z++67NxjXq1ev0uedd945SdKzZ8/12v6286Suri79+vVrMEe/fv3y3HPPZc2aNamrq0t5eXn69OlT6u/evXtat25dOp4/f37q6+vTpk2bVFRUlH5eeOGFLFy4cCOvHNjaeF7xcWGnHQAAAADwoTVp0qT0uays7J+2rV27dpOtWV9fn/bt22fmzJnr9f39H8sB/p7nFVs6O+0AAAAAgPV06dIlTZo0yeOPP15qe/3117NgwYKNmre6ujqzZ89u0DZ79ux069YtjRs3Tvfu3fPOO++ktra21P/ss89mxYoVpeOampq8/PLLKS8vT9euXRv8VFZWblR9wNbH84qPC6EdAAAAALCeioqKnHLKKRk7dmweeuihPP300xk1alQaNdq4PymeffbZmTFjRsaNG5cFCxZkypQpueGGG3LOOeckSXbfffcMGTIkp59+eh5//PHU1tZm9OjRad68eWmOQYMGpW/fvjnqqKMyffr0vPjii3n00UfzrW99K3Pnzt2o+oCtj+cVHxdCOwAAAADgPV111VU56KCDMnTo0AwaNCgHHnhgg+9u+jBqampyxx135Pbbb0+PHj1y0UUX5dvf/nZGjRpVGjNp0qR06NAhBx98cI4++uicdtpp2WmnnUr9ZWVlue+++9K/f/+cfPLJ6datW4499tgsWrSo9J1UwLbF84qPg7J169atK7oIAOBd/fv3T6dOnXLrrbcWXQrA+/K8AoCt34f9fT5gwIDsvffemTBhwuYpDOAfeF6xrbDTDgAAAAAAAAomtAMAAAAAAICClRddAAAAAACw9Zg5c2bRJQBsEM8rtjZ22gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUrL7oANs7ixYuzbNmyosvYaJWVlamqqiq6DAAAAAAAgEII7bZiixcvTnV1dVatWlV0KRutRYsWqaurE9wBAAAAAADbJKHdVmzZsmVZtWpVpk6dmurq6qLL+dDq6uoyYsSILFu2TGgHAAAAAABsk4R2HwPV1dWpqakpugwAAAAAAAA+pEZFFwAAAAAAAADbOqEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2rHRTjzxxPznf/5ng7Znn3027dq1y1/+8pcPPe+yZcuy00475Y9//GOD9mOPPTbjx4//0PMCAAAAAABsaYR2W5CXX345X/nKV9K5c+c0bdo0n/zkJzN06NDMmDFjs647efLktG7d+kOdO3/+/Nx333356le/2qD9/PPPz1e+8pVsv/32SZI333wzo0aNSs+ePVNeXp6jjjrqX85dWVmZkSNH5uKLL27QfsEFF+Tyyy/PG2+88aFqBgAAAAAA2NII7bYQL774Yvr06ZOHHnooV111VZ566qk88MADOeSQQ/If//Ef73nO22+//RFXub7rr78+w4cPT0VFRalt8eLFuffeezNq1KhS25o1a9K8efN89atfzaBBgzZ4/pNPPjnTpk3La6+9Vmrr0aNHunTpkqlTp26SawAAAAAAACia0G4L8eUvfzllZWWZM2dOhg0blm7dumXPPffM17/+9Tz22GNJkrKystx44435/Oc/n5YtW+aWW25JksycOTM1NTVp1qxZOnfunEsvvTTvvPNOae5rrrkmPXv2TMuWLfPJT34yX/7yl1NfX1869+STT84bb7yRsrKylJWV5ZJLLkmSvPXWWznnnHOyyy67pGXLltl///0zc+bM0rxr1qzJXXfdlaFDhza4ljvuuCN77bVXdtlll1Jby5Ytc+ONN+bUU09Nu3btNvi+7LnnnunQoUN++tOfNmgfOnRobr/99g2eBwAAAAAAYEsmtNsCvPbaa3nggQfyH//xH2nZsuV6/X//6spLLrkkX/jCF/LUU0/l85//fJLkoosuyllnnZVnnnkm3//+9zN58uRcfvnlpXMaNWqU6667Lr/73e8yZcqUPPTQQzn33HOTJAcccEAmTJiQVq1aZcmSJVmyZEnOOeecJMmZZ56ZX//617n99tvz29/+NsOHD8+QIUPy3HPPJUl++9vf5o033sg+++zToN5HHnlkvbaNsd9+++WRRx5Zr23OnDl56623Ntk6AAAAAAAARRHabQGef/75rFu3Lt27d/+XY48//vicfPLJ6dy5c9q3b58kGTVqVE466aR07tw5n/nMZzJu3Lh8//vfL50zZsyYHHLIIenUqVMOPfTQXHbZZbnjjjuSJNttt1122GGHlJWVpV27dmnXrl0qKiqyePHiTJo0KXfeeWcOOuigdOnSJeecc04OPPDATJo0KUmyaNGiNG7cODvttFODGhctWpQOHTpsqtuTDh06ZNGiReu1rV69Oi+//PImWwcAAAAAAKAo5UUXQLJu3boNHvteO9huvvnmTJ48uXS8Zs2avPnmm1m1alVatGiRX/7yl7niiivy+9//Pv/3//7fvPPOOw3638tTTz2VNWvWpFu3bg3a33rrrbRp0yZJ8te//jVNmzZNWVlZgzF//etf06xZsw2+pn+lefPmWbVq1XptSdZrBwAAAAAA2BoJ7bYAn/rUp1JWVpbf//73/3Lse70+8/TTT89XvvKV9dqbNWuWF198MUcccUS+9KUv5fLLL8+OO+6YWbNm5ZRTTsnq1av/aWhXX1+fxo0bp7a2No0bN27QV1FRkSSprKzMqlWrsnr16my33Xal/srKyrz++uv/8lo21GuvvZa2bduu15ZkvXYAAAAAAICtkdBuC7Djjjtm8ODB+e53v5uvfvWr6wVzK1asaPC9dv9o0aJF6dq163v21dbWZu3atRk/fnwaNXr3bah/ezXm32y33XZZs2ZNg7bevXtnzZo1Wbp0aQ466KD3nHvvvfdOkjzzzDOlz38795lnnvmn9X5QTz/9dAYMGLBe26677prKyspNtg4AAAAAAEBRfKfdFuK73/1u1qxZk/322y8/+clP8txzz6Wuri7XXXdd+vbt+77n3nvvvbn00kvzu9/9LnV1dbn99ttzwQUXJEm6du2at99+O9dff33+8Ic/5LbbbstNN93U4PxOnTqlvr4+M2bMyLJly7Jq1ap069YtJ5xwQkaOHJn//d//zQsvvJA5c+bkiiuuyM9//vMk7+5yq6mpyaxZsxrMN3jw4Pz6179eLwh85pln8uSTT+a1117LG2+8kSeffDJPPvnk+17bqlWrUltbm89+9rMN2h955JH12gAAAAAAALZWQrstROfOnTNv3rwccsghOfvss9OjR4985jOfyYwZM3LjjTe+77kTJkzI9OnTs+++++bTn/50rr322nTs2DFJstdee+Waa67Jd77znfTo0SPTpk3LFVdc0eD8Aw44IGeccUb+/d//PW3bts1//dd/JUkmTZqUkSNH5uyzz87uu++eo446Kr/5zW9SVVVVOnf06NGZNm1ag/k+97nPpby8PL/85S8btB922GHp3bt3/r//7//LzJkz07t37/Tu3bvU/+c//zllZWWZOXNmqe1nP/tZqqqqGuz2e/PNN3P33Xfn1FNP3YA7CwAAAAAAsOUrW7du3bqii+DDmTdvXvr06ZPa2trU1NQUUsNf//rX7L777vmf//mfBjsCv/vd7+aee+7Jgw8++C/n+Nt13HTTTTnvvPPyhz/8IZ/4xCeSJJ/+9Kfz1a9+Nccff3xp/I033pif/vSnmT59+qa/IICC9e/fP506dcqtt95adCkA78vzCgC2fn6fA1sLzyu2Fb7Tjo3SvHnz3HrrrVm2bFmD9tNPPz0rVqzIX/7yl2y//fYbNNfs2bPzzW9+sxTYLVu2LEcffXSOO+64BuOaNGmS66+/ftNcAAAAAAAAwBZAaMdGGzBgwHpt5eXl+da3vvWB5hkzZkyDHYOVlZU599xz1xs3evToD1wjAAAAAADAlsx32gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDByosugI1XV1dXdAkbZWuvHwAAAAAAYGMJ7bZilZWVadGiRUaMGFF0KRutRYsWqaysLLoMAAAAAACAQgjttmJVVVWpq6vLsmXLNtsao0ePTvv27TNu3LjNtkbybgBZVVW1WdcAAAAAAADYUgnttnJVVVWbNeyqqKhImzZtUlNTs9nWAAAAAAAA2NY1KroAAAAAAAAA2NYJ7QAAAAAAAKBgQjsAAAAAAAAomNCOj5VOnTplwoQJRZcBAAAAAADwgQjtAAAAAAAAoGBCOwAAAAAAACiY0I6NtnLlyowcOTIVFRVp3759xo8fnwEDBmTMmDFJ3n1l5WWXXVYa07Fjx9xzzz159dVXc+SRR6aioiK9evXK3LlzG8z7k5/8JHvuuWeaNm2aTp06Zfz48Q36ly5dmqFDh6Z58+bZbbfdMm3atPVqW7FiRUaPHp22bdumVatWOfTQQzN//vzNdi8AAAAAAAA+DKEdG23s2LF5+OGH87Of/SzTp0/PzJkzM2/evAZjrr322vTr1y9PPPFEDj/88Jx44okZOXJkRowYkXnz5qVLly4ZOXJk1q1blySpra3NMccck2OPPTZPPfVULrnkklx44YWZPHlyac5Ro0blpZdeyq9+9avcdddd+d73vpelS5c2WHf48OFZunRp7r///tTW1qampiYDBw7Ma6+9ttnvCwAAAAAAwIYqL7oAtm719fWZOHFipk6dmoEDByZJpkyZkl133bXBuMMOOyynn356kuSiiy7KjTfemH333TfDhw9PknzjG99I375988orr6Rdu3a55pprMnDgwFx44YVJkm7duuWZZ57JVVddlVGjRmXBggW5//77M2fOnOy7775JkokTJ6a6urq05qxZszJnzpwsXbo0TZs2TZJcffXVufvuu3PXXXfltNNO27w3BwAAAAAAYAPZacdGWbhwYVavXp3999+/1Lbjjjtm9913bzCuV69epc8777xzkqRnz57rtf1tp1xdXV369evXYI5+/frlueeey5o1a1JXV5fy8vL06dOn1N+9e/e0bt26dDx//vzU19enTZs2qaioKP288MILWbhw4UZeOQAAAAAAwKZjpx0fiSZNmpQ+l5WV/dO2tWvXbrI16+vr0759+8ycOXO9vr8P9wAAAAAAAIpmpx0bpUuXLmnSpEkef/zxUtvrr7+eBQsWbNS81dXVmT17doO22bNnp1u3bmncuHG6d++ed955J7W1taX+Z599NitWrCgd19TU5OWXX055eXm6du3a4KeysnKj6gMAAAAAANiUhHZslIqKipxyyikZO3ZsHnrooTz99NMZNWpUGjXauH9aZ599dmbMmJFx48ZlwYIFmTJlSm644Yacc845SZLdd989Q4YMyemnn57HH388tbW1GT16dJo3b16aY9CgQenbt2+OOuqoTJ8+PS+++GIeffTRfOtb38rcuXM3qj4AAAAAAIBNSWjHRrvqqqty0EEHZejQoRk0aFAOPPDABt8192HU1NTkjjvuyO23354ePXrkoosuyre//e2MGjWqNGbSpEnp0KFDDj744Bx99NE57bTTstNOO5X6y8rKct9996V///45+eST061btxx77LFZtGhR6Tv0AAAAAAAAtgS+046NVlFRkdtuuy233XZbqe3nP/956fOLL7643jnr1q1rcNypU6f12oYNG5Zhw4b903XbtWuXe++9t0HbiSee2OB4++23z3XXXZfrrrvuX14HAAAAAABAUey0AwAAAAAAgIIJ7QAAAAAAAKBgXo/JZjFz5syiSwAAAAAAANhq2GkHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGE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02Nee+2197jKbV1//fUZPXp0qqqqSm3PPPNM7rrrrjQ0NJTatmzZkk6dOuWLX/xihg0btt3jT5gwIbfccks2btxYajvqqKPSq1evzJ8/f6ecAwAAAAAA7I2EdvAmPvvZz6aioiJLly7NqFGj0qdPnxx55JH58pe/nJ///OdJkoqKisyePTsf+chHst9+++Uf//EfkySNjY2pr6/PvvvumyOOOCJXXHFFXn/99dLY11xzTY4++ujst99+OfTQQ/PZz342ra2tpWMnTJiQF198MRUVFamoqMi0adOSJK+88komT56c97///dlvv/0ycODANDY2lsbdsmVLFi5cmJEjR5ady6233ppjjjkm73//+0tt++23X2bPnp3zzz8/NTU1231djjzyyPTo0SP/+q//WtY+cuTILFiwYLvHAQAAAAAAygnt4E9s3LgxP/7xj/O5z30u++233zb7//jRldOmTcvf/M3f5PHHH89HPvKRJMnUqVPzd3/3d1m5cmW+//3vZ+7cufn6179eOqZdu3a57rrr8otf/CLz5s3Lfffdl0suuSRJcuKJJ+baa6/N/vvvn3Xr1mXdunWZPHlykuTzn/98HnrooSxYsCCPPfZYRo8enREjRuSpp55Kkjz22GN58cUXc/zxx5fVe//992/TtiNOOOGE3H///du0LV26NK+88spOmwcAAAAAAPYmQjv4E7/61a+ydevW9OvX7x37/u3f/m0mTJiQI444It27d0+SNDQ05JOf/GSOOOKInHHGGZk+fXq+//3vl4658MILc9ppp6Vnz545/fTTc9VVV+XWW29Nkuyzzz553/vel4qKitTU1KSmpiZVVVV55plnMmfOnPzoRz/KySefnF69emXy5Mk56aSTMmfOnCTJ2rVr0759+xx00EFlNa5duzY9evTYWZcnPXr0yNq1a7dpe/XVV7N+/fqdNg8AAAAAAOxNKosuAHY1W7du3e6+b7aC7Qc/+EHmzp1b2t6yZUt+97vfZfPmzencuXN+8pOf5Oqrr84vf/nL/Pa3v83rr79etv/NPP7449myZUv69OlT1v7KK6+kW7duSZKXX345HTt2TEVFRVmfl19+Ofvuu+92n9M76dSpUzZv3rxNW5Jt2gEAAAAAgO0jtIM/8Zd/+ZepqKjIL3/5y3fs+2aPz5w0aVK+8IUvbNO+7777Zs2aNfnwhz+cz3zmM/n617+eAw44IA888EDOO++8vPrqq28Z2rW2tqZ9+/ZpampK+/bty/ZVVVUlSaqrq7N58+a8+uqr2WeffUr7q6ur88ILL7zjuWyvjRs35sADD9ymLck27QAAAAAAwPYR2sGfOOCAAzJ8+PB897vfzRe/+MVtgrlNmzaVvdfuT61duza9e/d+031NTU154403MnPmzLRr9/un0/7h0Zh/sM8++2TLli1lbccee2y2bNmSDRs25OSTT37Tsf/qr/4qSbJy5crS9z8cu3Llyres98/1xBNPZMiQIdu0HXLIIamurt5p8wAAAAAAwN7EO+3gTXz3u9/Nli1bcsIJJ+S2227LU089lebm5lx33XUZNGjQ2x5711135YorrsgvfvGLNDc3Z8GCBfna176WJOndu3dee+21XH/99fmv//qv3Hzzzfne975XdnzPnj3T2tqaxYsXp6WlJZs3b06fPn3yiU98IuPHj8+//Mu/5Omnn87SpUtz9dVX5+67707y+1Vu9fX1eeCBB8rGGz58eB566KFtgsCVK1fm0UcfzcaNG/Piiy/m0UcfzaOPPvq257Z58+Y0NTXlr//6r8va77///m3aAAAAAACA7Se0gzdxxBFHZPny5TnttNNy0UUX5aijjsoZZ5yRxYsXZ/bs2W977LXXXptFixZlwIAB+eAHP5hZs2blsMMOS5Icc8wxueaaa/LNb34zRx11VG655ZZcffXVZcefeOKJ+fSnP52PfexjOfDAA/Otb30rSTJnzpyMHz8+F110Ufr27Ztzzjkn//mf/5na2trSsRMnTswtt9xSNt6HPvShVFZW5ic/+UlZ+5lnnpljjz02//Zv/5bGxsYce+yxOfbYY0v7f/Ob36SioiKNjY2ltjvuuCO1tbVlq/1+97vf5fbbb8/555+/HVcWAAAAAAB4Mx6PCW+he/fuueGGG3LDDTe86f6tW7e+afuJJ56Yz3/+82857pe+9KV86UtfKmsbN25c2fbs2bO3CQc7dOiQK664IldcccVbjt3Q0JCrr746Dz30UGlFYGVlZS699NJcc801GT58eKnvmjVr3nSM5cuXJ0n+7//9v+natWuOOeaY0r7vfOc7mTp1aln/OXPm5IQTTsgHP/jBt6wLAAAAAAB4e0I72IN06tQp//RP/5SWlpay9kmTJmXTpk35n//5n3Tp0mW7xlqy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kZx11lkZN25cxo8fn7Fjx2b58uXp1atXxo8fn61btyZJmpqa8tGPfjRjxozJ448/nmnTpmXKlCmZO3duacyGhob8+te/zk9/+tMsXLgwN954YzZs2FA27+jRo7Nhw4bce++9aWpqSn19fYYOHZqNGze2+XUpivsBAAAAAMDepLLoAmBX0Nramptuuinz58/P0KFDkyTz5s3LIYccUtbvzDPPzKRJk5IkU6dOzezZszNgwICMHj06SfKVr3wlgwYNyrPPPpuamppcc801GTp0aKZMmZIk6dOnT1auXJkZM2akoaEhq1atyr333pulS5dmwIABSZKbbropdXV1pTkfeOCBLF26NBs2bEjHjh2TJN/+9rdz++23Z+HChbngggva9uIUwP0AAAAAAGBvY6UdJFm9enVeffXVDBw4sNR2wAEHpG/fvmX9+vfvX/p+8MEHJ0mOPvrobdr+sDKrubk5gwcPLhtj8ODBeeqpp7Jly5Y0NzensrIyxx13XGl/v3790rVr19L2ihUr0tramm7duqWqqqr0efrpp7N69eodPPNdk/sBAAAAAMDexko7+DN06NCh9L2iouIt2954442dNmdra2u6d++exsbGbfb9cZi0N3I/AAAAAADYU1hpB0l69eqVDh065OGHHy61vfDCC1m1atUOjVtXV5clS5aUtS1ZsiR9+vRJ+/bt069fv7z++utpamoq7X/yySezadOm0nZ9fX3Wr1+fysrK9O7du+xTXV29Q/XtqtwPAAAAAAD2NkI7SFJVVZXzzjsvF198ce6777488cQTaWhoSLt2O/aPyEUXXZTFixdn+vTpWbVqVebNm5cbbrghkydPTpL07ds3I0aMyKRJk/Lwww+nqakpEydOTKdOnUpjDBs2LIMGDco555yTRYsWZc2aNXnwwQdz2WWXZdmyZTtU367K/QAAAAAAYG8jtIP/NWPGjJx88skZOXJkhg0blpNOOqns3WbvRn19fW699dYsWLAgRx11VKZOnZorr7wyDQ0NpT5z5sxJjx49cuqpp+bcc8/NBRdckIMOOqi0v6KiIvfcc09OOeWUTJgwIX369MmYMWOydu3a0jvb9kTuBwAAAAAAexPvtIP/VVVVlZtvvjk333xzqe3uu+8ufV+zZs02x2zdurVsu2fPntu0jRo1KqNGjXrLeWtqanLXXXeVtY0bN65su0uXLrnuuuty3XXXveN57CncDwAAAAAA9iZW2gEAAAAAAEDBhHYAAAAAAABQMI/HhLfR2NhYdAn8EfcDAAAAAIA9lZV2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwSqLLgAAYG/3zDPPpKWlpegydlh1dXVqa2uLLgMAAABgtyS0AwAo0DPPPJO6urps3ry56FJ2WOfOndPc3Cy4AwAAAHgXhHYAAAVqaWnJ5s2bM3/+/NTV1RVdzrvW3NycsWPHpqWlRWgHAAAA8C4I7QAAdgF1dXWpr68vugwAAAAACtKu6AIAAAAAAABgbye0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAADJu3Lh84xvfKGt78sknU1NTk//5n/951+O2tLTkoIMOyn//93+XtY8ZMyYzZ8581+MCAAAA7GmEdgAAO9H69evzhS98IUcccUQ6duyYQw89NCNHjszixYvbdN65c+ema9eu7+rYFStW5J577skXv/jFsvavfvWr+cIXvpAuXbokSX73u9+loaEhRx99dCorK3POOee849jV1dUZP358Lr/88rL2r33ta/n617+eF1988V3VDAAAALCnEdoBAOwka9asyXHHHZf77rsvM2bMyOOPP54f//jHOe200/K5z33uTY957bXX3uMqt3X99ddn9OjRqaqqKrU988wzueuuu9LQ0FBq27JlSzp16pQvfvGLGTZs2HaPP2HChNxyyy3ZuHFjqe2oo45Kr169Mn/+/J1yDgAAAAC7O6EdAMBO8tnPfjYVFRVZunRpRo0alT59+uTII4/Ml7/85fz85z9PklRUVGT27Nn5yEc+kv322y//+I//mCRpbGxMfX199t133xxxxBG54oor8vrrr5fGvuaaa3L00Udnv/32y6GHHprPfvazaW1tLR07YcKEvPjii6moqEhFRUWmTZuWJHnllVcyefLkvP/9789+++2XgQMHprGxsTTuli1bsnDhwowcObLsXG699dYcc8wxef/7319q22+//TJ79uycf/75qamp2e7rcuSRR6ZHjx7513/917L2kSNHZsGCBds9DgAAAMCeTGgHALATbNy4MT/+8Y/zuc99Lvvtt982+//40ZXTpk3L3/zN3+Txxx/PRz7ykSTJ1KlT83d/93dZuXJlvv/972fu3Ln5+te/XjqmXbt2ue666/KLX/wi8+bNy3333ZdLLrkkSXLiiSfm2muvzf77759169Zl3bp1mTx5cpLk85//fB566KEsWLAgjz32WEaPHp0RI0bkqaeeSpI89thjefHFF3P88ceX1Xv//fdv07YjTjjhhNx///3btC1dujSvvPLKTpsHAAAAYHcltAMA2Al+9atfZevWrenXr9879v3bv/3bTJgwIUcccUS6d++eJGloaMgnP/nJHHHEETnjjDMyffr0fP/73y8dc+GFF+a0005Lz549c/rpp+eqq67KrbfemiTZZ5998r73vS8VFRWpqalJTU1Nqqqq8swzz2TOnDn50Y9+lJNPPjm9evXK5MmTc9JJJ2XOnDlJkrVr16Z9+/Y56KCDympcu3ZtevTosbMuT3r06JG1a9du0/bqq69m/fr1O20eAAAAgN1VZdEFAADsCbZu3brdfd9sBdsPfvCDzJ07t7S9ZcuW/O53v8vmzZvTuXPn/OQnP8nVV1+dX/7yl/ntb3+b119/vWz/m3n88cezZcuW9OnTp6z9lVdeSbdu3ZIkL7/8cjp27JiKioqyPi+//HL23Xff7T6nd9KpU6ds3rx5m7Yk27QDAAAA7I2EdgAAO8Ff/uVfpqKiIr/85S/fse+bPT5z0qRJ+cIXvrBN+7777ps1a9bkwx/+cD7zmc/k61//eg444IA88MADOe+88/Lqq6++ZWjX2tqa9u3bp6mpKe3bty/bV1VVlSSprq7O5s2b8+qrr2afffYp7a+urs4LL7zwjueyvTZu3JgDDzxwm7Yk27QDAAAA7I2EdgAAO8EBBxyQ4cOH57vf/W6++MUvbhPMbdq0qey9dn9q7dq16d2795vua2pqyhtvvJGZM2emXbvfP938D4/G/IN99tknW7ZsKWs79thjs2XLlmzYsCEnn3zym479V3/1V0mSlStXlr7/4diVK1e+Zb1/rieeeCJDhgzZpu2QQw5JdXX1TpsHAAAAYHflnXYAADvJd7/73WzZsiUnnHBCbrvttjz11FNpbm7Oddddl0GDBr3tsXfddVeuuOKK/OIXv0hzc3MWLFiQr33ta0mS3r1757XXXsv111+f//qv/8rNN9+c733ve2XH9+zZM62trVm8eHFaWlqyefPm9OnTJ5/4xCcyfvz4/Mu//EuefvrpLF26NFdffXXuvvvuJL9f5VZfX58HHnigbLzhw4fnoYce2iYIXLlyZR599NFs3LgxL774Yh599NE8+uijb3tumzdvTlNTU/76r/+6rP3+++/fpg0AAABgbyW0AwDYSY444ogsX748p512Wi666KIcddRROeOMM7J48eLMnj37bY+99tprs2jRogwYMCAf/OAHM2vWrBx22GFJkmOOOSbXXHNNvvnNb+aoo47KLbfckquvvrrs+BNPPDGf/vSn87GPfSwHHnhgvvWtbyVJ5syZk/Hjx+eiiy5K3759c8455+Q///M/U1tbWzp24sSJueWWW8rG+9CHPpTKysr85Cc/KWs/88wzc+yxx+bf/u3f0tjYmGOPPTbHHntsaf9vfvObVFRUpLGxsdR2xx13pLa2tmy13+9+97vcfvvtOf/887fjygIAAADs+TweEwBgJ+revXtuuOGG3HDDDW+6f+vWrW/afuKJJ+bzn//8W477pS99KV/60pfK2saNG1e2PXv27G3CwQ4dOuSKK67IFVdc8ZZjNzQ05Oqrr85DDz1UWhFYWVmZSy+9NNdcc02GDx9e6rtmzZo3HWP58uVJkv/7f/9vunbtmmOOOaa07zvf+U6mTp1a1n/OnDk54YQT8sEPfvAt6wIAAADYmwjtAAD2cp06dco//dM/paWlpax90qRJ2bRpU/7nf/4nXbp02a6xlixZkksvvTR/8Rd/kSRpaWnJueeem49//ONl/Tp06JDrr79+55wAAAAAwB5AaAcAQIYMGbJNW2VlZS677LI/a5wLL7ww9fX1pe3q6upccskl2/SbOHHin10jAAAAwJ7MO+0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYJVFFwAAQNLc3Fx0CTtkd68fAAAAoGhCOwCAAlVXV6dz584ZO3Zs0aXssM6dO6e6urroMgAAAAB2S0I7AIAC1dbWprm5OS0tLW02x8SJE9O9e/dMnz69zeZIfh9A1tbWtukcAAAAAHsqoR0AQMFqa2vbNOyqqqpKt27dUl9f32ZzAAAAALBj2hVdAAAAAAAAAOzthHYAAAAAAABQMKEdAAAAAAAAFExoBwDALqVnz5659tpriy4DAAAA4D0ltAMAAAAAAICCCe0AAAAAAACgYEI7AADy0ksvZfz48amqqkr37t0zc+bMDBkyJBdeeGGS3z+y8qqrrir1Oeyww3LnnXfmueeey9lnn52qqqr0798/y5YtKxv3tttuy5FHHpmOHTumZ8+emTlzZtn+DRs2ZOTIkenUqVMOP/zw3HLLLdvUtmnTpkycODEHHnhg9t9//5x++ulZsWJFm10LAAAAgCII7QAAyMUXX5yf/exnueOOO7Jo0aI0NjZm+fLlZX1mzZqVwYMH55FHHslZZ52VcePGZfz48Rk7dmyWL1+eXr16Zfz48dm6dWuSpKmpKR/96EczZsyYPP7445k2bVqmTJmSuXPnlsZsaGjIr3/96/z0pz/NwoULc+ONN2bDhg1l844ePTobNmzIvffem6amptTX12fo0KHZuHFjm18XAAAAgPdKZdEFAABQrNbW1tx0002ZP39+hg4dmiSZN29eDjnkkLJ+Z555ZiZNmpQkmTp1ambPnp0BAwZk9OjRSZKvfOUrGTRoUJ599tnU1NTkmmuuydChQzNlypQkSZ8+fbJy5crMmDEjDQ0NWbVqVe69994sXbo0AwYMSJLcdNNNqaurK835wAMPZOnSpdmwYUM6duyYJPn2t7+d22+/PQsXLswFF1zQthcHAAAA4D1ipR0AwF5u9erVefXVVzNw4MBS2wEHHJC+ffuW9evfv3/p+8EHH5wkOfroo7dp+8NKuebm5gwePLhsjMGDB+epp57Kli1b0tzcnMrKyhx33HGl/f369UvXrl1L2ytWrEhra2u6deuWqqqq0ufpp5/O6tWrd/DMAQAAAHYdVtoBALBdOnToUPpeUVHxlm1vvPHGTpuztbU13bt3T2Nj4zb7/jjcAwAAANjdWWkHALCX69WrVzp06JCHH3641PbCCy9k1apVOzRuXV1dlixZUta2ZMmS9OnTJ+3bt0+/fv3y+uuvp6mpqbT/ySefzKZNm0rb9fX1Wb9+fSorK9O7d++yT3V19Q7VBwAAALArEdoBAOzlqqqqct555+Xiiy/OfffdlyeeeCINDQ1p127H/qp40UUXZfHixZk+fXpWrVqVefPm5YYbbsjkyZOTJH379s2IESMyadKkPPzww2lqasrEiRPTqVOn0hjDhg3LoEGDcs4552TRokVZs2ZNHnzwwVx22WVZtmzZDtUHAAAAsCsR2gEAkBkzZuTkk0/OyJEjM2zYsJx00kll75p7N+rr63PrrbdmwYIFOeqoozJ16tRceeWVaWhoKPWZM2dOevTokVNPPTXnnntuLrjgghx00EGl/RUVFbnnnntyyimnZMKECenTp0/GjBmTtWvXlt6hBwAAALAn8E47AABSVVWVm2++OTfffHOp7e677y59X7NmzTbHbN26tWy7Z8+e27SNGjUqo0aNest5a2pqctddd5W1jRs3rmy7S5cuue6663Lddde943kAAAAA7K6stAMAAAAAAICCCe0AAAAAAACgYB6PCQDAm2psbCy6BAAAAIC9hpV2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAACW5A9pAAEAAElEQVQAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwSqLLgAA4N165pln0tLSUnQZu7zW1tY8//zzWb58edGl7Baqq6tTW1tbdBkAAADAXkZoBwDslp555pnU1dVl8+bNRZeyW3jkkUdyzz33FF3GbqFz585pbm4W3AEAAADvKaEdALBbamlpyebNmzN//vzU1dUVXQ57iObm5owdOzYtLS1COwAAAOA9JbQDAHZrdXV1qa+vL7oMAAAAANgh7YouAAAAAAAAAPZ2QjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwDYi6xZsyYVFRV59NFHkySNjY2pqKjIpk2bCq0LAAAAYG8ntAMA2I0899xz+cxnPpPa2tp07NgxNTU1GT58eJYsWfKuxjvxxBOzbt26vO9970uSzJ07N127dt2JFQMAAACwPSqLLgAAgO03atSovPrqq5k3b16OOOKIPPvss1m8eHGef/75dzXePvvsk5qamp1cJQAAAAB/LivtAAB2E5s2bcr999+fb37zmznttNNy2GGH5YQTTshXv/rVfOQjH0mSVFRUZPbs2fnQhz6UTp065YgjjsjChQvfcsw/fjxmY2NjJkyYkBdffDEVFRWpqKjItGnT3qOzAwAAANi7Ce0AAHYTVVVVqaqqyu23355XXnnlLftNmTIlo0aNyooVK/KJT3wiY8aMSXNz8zuOf+KJJ+baa6/N/vvvn3Xr1mXdunWZPHnyzjwFAAAAAN6C0A4AYDdRWVmZuXPnZt68eenatWsGDx6cSy+9NI899lhZv9GjR2fixInp06dPpk+fnuOPPz7XX3/9O46/zz775H3ve18qKipSU1OTmpqaVFVVtdXpAAAAAPBHhHYAALuRUaNG5Te/+U3uvPPOjBgxIo2Njamvr8/cuXNLfQYNGlR2zKBBg7ZrpR0AAAAAxRHaAQDsZvbdd9+cccYZmTJlSh588ME0NDTk8ssvL7osAAAAAHaA0A4AYDf3gQ98IC+99FJp++c//3nZ/p///Oepq6vbrrH22WefbNmyZafWBwAAAMA7qyy6AAAAts/zzz+f0aNH51Of+lT69++fLl26ZNmyZfnWt76Vs88+u9TvRz/6UY4//vicdNJJueWWW7J06dLcdNNN2zVHz54909ramsWLF+eYY45J586d07lz57Y6JQAAAAD+l9AOAGA3UVVVlYEDB2bWrFlZvXp1XnvttRx66KE5//zzc+mll5b6XXHFFVmwYEE++9nPpnv37vnnf/7nfOADH9iuOU488cR8+tOfzsc+9rE8//zzufzyyzNt2rQ2OiMAAAAA/kBoBwCwm+jYsWOuvvrqXH311W/br0ePHlm0aNGb7uvZs2e2bt1a2h4yZEjZdpLMnj07s2fP3vGCAQAAANhu3mkHAAAAAAAABRPaAQAAAAAAQME8HhMAYA/yp4+6BAAAAGD3YKUdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQsMqiCwAA2BHNzc1Fl8AexJ8nAAAAoChCOwBgt1RdXZ3OnTtn7NixRZfCHqZz586prq4uugwAAABgLyO0AwB2S7W1tWlubk5LS0ubzTFx4sR0794906dPb7M52H7v1f2orq5ObW1tm84BAAAA8KeEdgDAbqu2trZNw5Wqqqp069Yt9fX1bTYH28/9AAAAAPZk7YouAAAAAAAAAPZ2QjsAAAAAAAAomNAOAAAAAAAACia0AwDYQ/Ts2TPXXntt0WXwv9wPAAAA4M8htAMAAAAAAICCCe0AAAAAAACgYEI7AIAd8NJLL2X8+PGpqqpK9+7dM3PmzAwZMiQXXnhhkt8/IvGqq64q9TnssMNy55135rnnnsvZZ5+dqqqq9O/fP8uWLSsb97bbbsuRRx6Zjh07pmfPnpk5c2bZ/g0bNmTkyJHp1KlTDj/88Nxyyy3b1LZp06ZMnDgxBx54YPbff/+cfvrpWbFiRZtdi12B+wEAAADsroR2AAA74OKLL87Pfvaz3HHHHVm0aFEaGxuzfPnysj6zZs3K4MGD88gjj+Sss87KuHHjMn78+IwdOzbLly9Pr169Mn78+GzdujVJ0tTUlI9+9KMZM2ZMHn/88UybNi1TpkzJ3LlzS2M2NDTk17/+dX76059m4cKFufHGG7Nhw4ayeUePHp0NGzbk3nvvTVNTU+rr6zN06NBs3Lixza9LUdwPAAAAYHdVWXQBAAC7q9bW1tx0002ZP39+hg4dmiSZN29eDjnkkLJ+Z555ZiZNmpQkmTp1ambPnp0BAwZk9OjRSZKvfOUrGTRoUJ599tnU1NTkmmuuydChQzNlypQkSZ8+fbJy5crMmDEjDQ0NWbVqVe69994sXbo0AwYMSJLcdNNNqaurK835wAMPZOnSpdmwYUM6duyYJPn2t7+d22+/PQsXLswFF1zQthenAO4HAAAAsDuz0g4A4F1avXp1Xn311QwcOLDUdsABB6Rv375l/fr371/6fvDBBydJjj766G3a/rAyq7m5OYMHDy4bY/DgwXnqqaeyZcuWNDc3p7KyMscdd1xpf79+/dK1a9fS9ooVK9La2ppu3bqlqqqq9Hn66aezevXqHTzzXZP7AQAAAOzOrLQDAGhjHTp0KH2vqKh4y7Y33nhjp83Z2tqa7t27p7GxcZt9fxwm7Y3cDwAAAGBXZKUdAMC71KtXr3To0CEPP/xwqe2FF17IqlWrdmjcurq6LFmypKxtyZIl6dOnT9q3b59+/frl9ddfT1NTU2n/k08+mU2bNpW26+vrs379+lRWVqZ3795ln+rq6h2qb1flfgAAAAC7M6EdAMC7VFVVlfPOOy8XX3xx7rvvvjzxxBNpaGhIu3Y79lesiy66KIsXL8706dOzatWqzJs3LzfccEMmT56cJOnbt29GjBiRSZMm5eGHH05TU1MmTpyYTp06lcYYNmxYBg0alHPOOSeLFi3KmjVr8uCDD+ayyy7LsmXLdqi+XZX7AQAAAOzOhHYAADtgxowZOfnkkzNy5MgMGzYsJ510Utm7zd6N+vr63HrrrVmwYEGOOuqoTJ06NVdeeWUaGhpKfebMmZMePXrk1FNPzbnnnpsLLrggBx10UGl/RUVF7rnnnpxyyimZMGFC+vTpkzFjxmTt2rWld7btidwPAAAAYHflnXYAADugqqoqN998c26++eZS29133136vmbNmm2O2bp1a9l2z549t2kbNWpURo0a9Zbz1tTU5K677iprGzduXNl2ly5dct111+W66657x/PYU7gfAAAAwO7KSjsAAAAAAAAomNAOAAAAAAAACubxmAAAO1ljY2PRJfBH3A8AAABgd2ClHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAULDKogsAdj3PPPNMWlpa2mz81tbWPP/881m+fHmbzcH2e6/uR3V1dWpra9t0DgAAAACA3ZXQDijzzDPPpK6uLps3b27TeR555JHcc889bToH2++9uB+dO3dOc3Oz4A4AAAAA4E0I7YAyLS0t2bx5c+bPn5+6urqiy2EP0dzcnLFjx6alpUVoBwAAAADwJoR2wJuqq6tLfX190WUAAAAAAMBeoV3RBQAAAAAAAMDeTmgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR3Au7R48eLU1dVly5YtbTrP3//93+cLX/hCm84BAAAAAECxhHbAHqOhoSEVFRWlT7du3TJixIg89thjpT5/vL+ysjK1tbX58pe/nFdeeaXU57nnnstnPvOZ1NbWpmPHjqmpqcnw4cOzZMmSsvkuueSSfO1rX0v79u1LbY2Njamvr0/Hjh3Tu3fvzJ07921rXrNmTVlNf/j8/Oc/L/WZPHly5s2bl//6r//awSsEAAAAAMCuSmgH7FFGjBiRdevWZd26dVm8eHEqKyvz4Q9/uKzPnDlzsm7dujz99NO58cYbc/PNN+eqq64q7R81alQeeeSRzJs3L6tWrcqdd96ZIUOG5Pnnny/1eeCBB7J69eqMGjWq1Pb000/nrLPOymmnnZZHH300F154YSZOnJh///d/f8e6f/KTn5TqXrduXY477rjSvurq6gwfPjyzZ8/ekUsDAAAAAMAurLLoAgB2pj+sjEuSmpqa/P3f/31OPvnkPPfccznwwAOTJF27di31OfTQQ3P22Wdn+fLlSZJNmzbl/vvvT2NjY0499dQkyWGHHZYTTjihbJ4FCxbkjDPOyL777ltq+973vpfDDz88M2fOTJLU1dXlgQceyKxZszJ8+PC3rbtbt26lmt7MyJEjc9lll2XGjBl/zuUAAAAAAGA3YaUdsMdqbW3N/Pnz07t373Tr1u1N+6xatSr33XdfBg4cmCSpqqpKVVVVbr/99rJHZv6p+++/P8cff3xZ20MPPZRhw4aVtQ0fPjwPPfTQO9b6kY98JAcddFBOOumk3HnnndvsP+GEE/Lf//3fWbNmzTuOBQAAAADA7kdoB+xR7rrrrlLw1qVLl9x555354Q9/mHbt/t/P3cc//vFUVVVl3333Td++fXPkkUfmq1/9apKksrIyc+fOzbx589K1a9cMHjw4l156adl78ZJk7dq16dGjR1nb+vXrc/DBB5e1HXzwwfntb3+bl19++U3rraqqysyZM/OjH/0od999d0466aScc8452wR3f5hr7dq17+7CAAAAAACwSxPaAXuUP7xP7tFHH83SpUszfPjwfOhDHyoLu2bNmpVHH300K1asyF133ZVVq1Zl3Lhxpf2jRo3Kb37zm9x5550ZMWJEGhsbU19fn7lz55b6vPzyy2WPxny3qqur8+UvfzkDBw7MgAED8n/+z//J2LFjt3kMZqdOnZIkmzdv3uE5AQAAAADY9QjtgD3Kfvvtl969e6d3794ZMGBAfvCDH+Sll17KP/zDP5T61NTUpHfv3unbt2/OOuusXHHFFfnhD3+YX/3qV6U+++67b84444xMmTIlDz74YBoaGnL55ZeX9ldXV+eFF14om7umpibPPvtsWduzzz6b/fffvxS6bY+BAweW1ZIkGzduTJLSe/kAAAAAANizCO2APVpFRUXatWv3lo+nTJL27dsnydv2+cAHPpCXXnqptH3sscdm5cqVZX0GDRqUxYsXl7X9x3/8RwYNGvRn1fzoo4+me/fuZW1PPPFEOnTokCOPPPLPGgsAAAAAgN1DZdEFAOxMr7zyStavX58keeGFF3LDDTektbU1I0eOLPXZtGlT1q9fnzfeeCNPPfVUrrzyyvTp0yd1dXV5/vnnM3r06HzqU59K//7906VLlyxbtizf+ta3cvbZZ5fGGD58eObNm1c296c//enccMMNueSSS/KpT30q9913X2699dbcfffdpT433HBD/vVf/7UU7s2bNy/77LNPjj322CTJv/zLv+Qf//Ef84Mf/KBs7Pvvvz8nn3zyn7ViDwAAAACA3YfQDtij/PjHPy6tUuvSpUv69euXH/3oRxkyZEipz4QJE5L8fhVeTU1NTjnllHzjG99IZWVlqqqqMnDgwMyaNSurV6/Oa6+9lkMPPTTnn39+Lr300tIYn/jEJ3LJJZfkySefTN++fZMkhx9+eO6+++586Utfyne+850ccsgh+cEPfpDhw4eXjmtpacnq1avLap4+fXrWrl2bysrK9OvXLz/84Q/z//1//19ZnwULFmTatGk781IBAAAAALALEdoBe4y5c+dm7ty5b9tn69atb7u/Y8eOufrqq3P11Ve/bb8DDjggn//853PNNdfk+9//fql9yJAheeSRR97yuGnTppWFb5/85CfzyU9+8m3nuvfee9OuXbttgjwAAAAAAPYc3mkH8C5ddtllOeyww/LGG2+06TwvvfRS5syZk8pK/58FAAAAAMCeyn8BBniXunbtWvbIzLZihR0AAAAAwJ7PSjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBglUUXAOyampubiy6BPYg/TwAAAAAAb09oB5Sprq5O586dM3bs2KJLYQ/TuXPnVFdXF10GAAAAAMAuSWgHlKmtrU1zc3NaWlrabI6JEyeme/fumT59epvNwfZ7r+5HdXV1amtr23QOAAAAAIDdldAO2EZtbW2bhitVVVXp1q1b6uvr22wOtp/7AQAAAABQvHZFFwAAAAAAAAB7O6EdAAAAAAAAFExoBwAAAAAAAAUT2gG8g549e+baa68tugz+l/sBAAAAAOyJhHYAAAAAAABQMKEdAAAAAAAAFExoB+ySXnrppYwfPz5VVVXp3r17Zs6cmSFDhuTCCy9M8vtHJF511VWlPocddljuvPPOPPfcczn77LNTVVWV/v37Z9myZWXj3nbbbTnyyCPTsWPH9OzZMzNnzizbv2HDhowcOTKdOnXK4YcfnltuuWWb2jZt2pSJEyfmwAMPzP7775/TTz89K1asaLNrsStwPwAAAAAA2pbQDtglXXzxxfnZz36WO+64I4sWLUpjY2OWL19e1mfWrFkZPHhwHnnkkZx11lkZN25cxo8fn7Fjx2b58uXp1atXxo8fn61btyZJmpqa8tGPfjRjxozJ448/nmnTpmXKlCmZO3duacyGhob8+te/zk9/+tMsXLgwN954YzZs2FA27+jRo7Nhw4bce++9aWpqSn19fYYOHZqNGze2+XUpivsBAAAAANC2KosuAOBPtba25qabbsr8+fMzdOjQJMm8efNyyCGHlPU788wzM2nSpCTJ1KlTM3v27AwYMCCjR49OknzlK1/JoEGD8uyzz6ampibXXHNNhg4dmilTpiRJ+vTpk5UrV2bGjBlpaGjIqlWrcu+992bp0qUZMGBAkuSmm25KXV1dac4HHnggS5cuzYYNG9KxY8ckybe//e3cfvvtWbhwYS644IK2vTgFcD8AAAAAANqelXbALmf16tV59dVXM3DgwFLbAQcckL59+5b169+/f+n7wQcfnCQ5+uijt2n7w8qs5ubmDB48uGyMwYMH56mnnsqWLVvS3NycysrKHHfccaX9/fr1S9euXUvbK1asSGtra7p165aqqqrS5+mnn87q1at38Mx3Te4HAAAAAEDbs9IO2G116NCh9L2iouIt2954442dNmdra2u6d++exsbGbfb9cZi0N3I/AAAAAADePSvtgF1Or1690qFDhzz88MOlthdeeCGrVq3aoXHr6uqyZMmSsrYlS5akT58+ad++ffr165fXX389TU1Npf1PPvlkNm3aVNqur6/P+vXrU1lZmd69e5d9qqurd6i+XZX7AQAAAADQ9oR2wC6nqqoq5513Xi6++OLcd999eeKJJ9LQ0JB27XbsJ+uiiy7K4sWLM3369KxatSrz5s3LDTfckMmTJydJ+vbtmxEjRmTSpEl5+OGH09TUlIkTJ6ZTp06lMYYNG5ZBgwblnHPOyaJFi7JmzZo8+OCDueyyy7Js2bIdqm9X5X4AAAAAALQ9oR2wS5oxY0ZOPvnkjBw5MsOGDctJ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NCiLFy8ua/uP//iPDBo0qKztiSeeyCGHHJLq6urtPg8AAAAA2F1UFl0AAFC8V155pfSuuBdeeCE33HBDWltbM3LkyFKfTZs2Zf369XnjjTfy1FNP5corr0yfPn1SV1eX559/PqNHj86nPvWp9O/fP126dMmyZcvyrW99K2effXZpjOHDh2fevHllc3/605/ODTfckEsuuSSf+tSnct999+XWW2/N3XffXdbv/vvvz1//9V+34VUAAAAAgOII7QCA/PjHP0737t2TJF26dEm/fv3yox/9KEOGDCn1mTBhQpLfr8KrqanJKaeckm984xuprKxMVVVVBg4cmFmzZmX16tV57bXXcuihh+b888/PpZdeWhrjE5/4RC655JI8+eST6du3b5Lk8MMPz913350vfelL+c53vpNDDjkkP/jBDzJ8+PDScb/73e9y++2358c//vF7cDUAAAAA4L0ntAOAvdzcuXMzd+7ct+2zdevWt93fsWPHXH311bn66qvftt8BBxyQz3/+87nmmmvy/e9/v9Q+ZMiQPPLII2953Jw5c3LCCSfkgx/84NuODwAAAAC7K++0AwDeU5dddlkOO+ywvPHGG9t9TIcOHXL99de3YVUAAAAAUCwr7QCA91TXrl3LHpm5PSZOnNhG1QAAAADArsFKOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGCVRRcAALub5ubmoktgD+LPEwAAAACJ0A4Atlt1dXU6d+6csWPHFl0Ke5jOnTunurq66DIAAAAAKJDQDgC2U21tbZqbm9PS0tJmc0ycODHdu3fP9OnT22wOtt97dT+qq6tTW1vbpnMAAAAAsGsT2gHAn6G2trZNw5Wqqqp069Yt9fX1bTYH28/9AAAAAOC90q7oAgAAAAAAAGBvJ7QDAAAAAACAggntAAAAAAAAoGBCOwDgXevZs2euvfbaosvgf7kfAAAAALsvoR0AAAAAAAAUTGgHAAAAAAAABRPaAcBu5qWXXsr48eNTVVWV7t27Z+bMmRkyZEguvPDCJL9/ROJVV11V6nPYYYflzjvvzHPPPZezzz47VVVV6d+/f5YtW1Y27m233ZYjjzwyHTt2TM+ePTNz5syy/Rs2bMjIkSPTqVOnHH744bnlllu2qW3Tpk2ZOHFiDjzwwOy///45/fTTs2LFija7FrsC9wMAAACAnUFoBwC7mYsvvjg/+9nPcscdd2TRokVpbGzM8uXLy/rMmjUrgwcPziOPPJKzzjor48aNy/jx4zN27NgsX748vXr1yvjx47N169YkSVNTUz760Y9mzJgxefzxxzNt2rRMmTIlc+fOLY3Z0NCQX//61/npT3+ahQsX5sYbb8yGDRvK5h09enQ2bNiQe++9N01NTamvr8/QoUOzcePGNr8uRXE/AAAAANgZKosuAADYfq2trbnpppsyf/78DB06NEkyb968HHLIIWX9zjzzzEyaNClJMnXq1MyePTsDBgzI6NGjkyRf+cpXMmjQoDz77LOpqanJNddck6FDh2bKlClJkj59+mTlypWZMWNGGhoasmrVqtx7771ZunRpBgwYkCS56aabUldXV5rzgQceyNKlS7Nhw4Z07NgxSfLtb387t99+exYuXJgLLrigbS9OAdwPAAAAAHYWK+0AYDeyevXqvPrqqxk4cGCp7YADDkjfvn3L+vXv37/0/eCDD06SHH300du0/WFlVnNzcwYPHlw2xuDBg/PUU09ly5YtaW5uTmVlZY477rjS/n79+qVr166l7RUrVqS1tTXdunVLVVVV6fP0009n9erVO3jmuyb3AwAAAICdxUo7ANgDdejQofS9oqLiLdveeOONnTZna2trunfvnsbGxm32/XGYtDdyPwAAAAB4J1baAcBupFevXunQoUMefvjhUtsLL7yQVatW7dC4dXV1WbJkSVnbkiVL0qdPn7Rv3z79+vXL66+/nqamptL+J598Mps2bSpt19fXZ/369amsrEzv3r3LPtXV1TtU367K/QAAAABgZxHaAcBupKqqKuedd14uvvji3HfffXniiSfS0NCQdu127F/pF110URYvXpzp06dn1apVmTdvXm644YZMnjw5SdK3b9+MGDEikyZNysMPP5ympqZMnDgxnTp1Ko0xbNiwDBo0KOecc04WLVqUNWvW5MEHH8xll12WZcuW7VB9uyr3AwAAAICdRWgHALuZGTNm5OSTT87IkSMzbNiwnHTSSWXvNns36uvrc+utt2bBggU56qijMnXq1Fx55ZVpaGgo9ZkzZ0569OiRU089Neeee24uuOCCHHTQQaX9FRUVueeee3LKKadkwoQJ6dOnT8aMGZO1a9eW3tm2J3I/AAAAANgZvNMOAHYzVVVVufnmm3PzzTeX2u6+++7S9zVr1mxzzNatW8u2e/bsuU3bqFGjMmrUqLect6amJnfddVdZ27hx48q2u3Tpkuuuuy7XXXfdO57HnsL9AAAAAGBnsNIOAAAAAAAACia0AwAAAAAAgIJ5PCYA7AEaGxuLLoE/4n4AAAAA8Oey0g4AAAAAAAAK9v+zd+/xX8/3//hv70rHdzK9UZm3FpU3OfTOYTmP+oStzRhzSEo5bHOcyClDaGbhg8m2DxWij9kcPnOKLJfKIYqc3mKN8tknhzcybyGq3x/77fX1kkNDnh2u18vlffF6Ph6P5+Nxfz5fLr2t2x7Pp9AOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgTYouAIDPNnfu3NTX1y+3+RsaGvL6669nxowZy20Nlt3X9X1UVVWlurp6ua4BAAAAACw7oR3ACmzu3LmpqanJggULlus6jz32WO64447lugbL7uv4Plq2bJm6ujrBHQAAAACsIIR2ACuw+vr6LFiwINddd11qamqKLodVRF1dXfr165f6+nqhHQAAAACsIIR2ACuBmpqa1NbWFl0GAAAAAADLSaOiCwAAAAAAAIDVndAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAAAAAAAomNAOAAAAAAAACia0AwAAAAAAgIIJ7QD4yr344oupqKjI448/niSZNGlSKioqMn/+/C8991lnnZWtttrqS8/zdZs4cWJqamqyaNGiJMmVV16Zvn37FlwVAAAAALCiENoBsJTXXnstP/nJT1JdXZ1mzZqlXbt26dOnT6ZOnfqF5tt+++0zb968tGnTJkkyZsyYrLXWWl9hxSu+k08+OWeccUYaN26cJDnssMMyY8aMTJ48ueDKAAAAAIAVQZOiCwBgxbPvvvtm4cKFGTt2bDp16pRXXnklEydOzOuvv/6F5mvatGnatWv3FVe54lu4cGGaNm2aKVOmZPbs2dl3331LfU2bNs1BBx2USy+9NDvttFOBVQIAAAAAKwI77QAoM3/+/EyePDkXXHBBvvOd72TDDTfMtttum1NPPTXf//73kyQVFRUZNWpU9txzz7Ro0SKdOnXKTTfd9KlzfvTxmJMmTcrAgQPz1ltvpaKiIhUVFTnrrLM+9dxf/vKXWW+99dK6desMGjQo7733Xln/I488kt69e6eqqipt2rTJLrvskhkzZpSNefbZZ7PjjjumefPm2XTTTXPvvfemoqIit9xyS2nMAw88kK222irNmzfP1ltvnVtuuaXsEZ9J8tRTT2XPPfdMZWVl1ltvvRxyyCGpr68v9e+66645+uijc/zxx6eqqip9+vRJkowfPz69e/dO8+bNy+rq27dvbrvttrz77rufev0AAAAAwOpBaAdAmcrKylRWVuaWW27J+++//6njhg0bln333TczZ87MwQcfnAMOOCB1dXWfO//222+fSy65JGuuuWbmzZuXefPmZciQIZ849sYbb8xZZ52V888/P48++mjat2+fK664omzM22+/nUMPPTRTpkzJQw89lM6dO2evvfbK22+/nSRZtGhR9t5777Rs2TIPP/xwfve73+X0008vm+Mf//hH+vbtm8033zwzZszI8OHDM3To0LIx8+fPz2677Zbu3bvn0UcfzV133ZVXXnkl+++/f9m4sWPHpmnTppk6dWquvPLKJMnkyZOz9dZbL3V9W2+9dT788MM8/PDDn3vfAAAAAIBVm8djAlCmSZMmGTNmTA4//PBceeWVqa2tzS677JIDDjggW2yxRWncfvvtl8GDBydJhg8fnnvuuSeXXXbZUqHaxzVt2jRt2rRJRUXF5z4y85JLLsmgQYMyaNCgJMm5556be++9t2y33W677VZ2zu9+97ustdZauf/++/O9730v99xzT2bPnp1JkyaV1jvvvPPSu3fv0jnXX399Kioq8vvf/760G+/vf/97Dj/88NKYyy+/PN27d8/5559farv66quzwQYb5LnnnkuXLl2SJJ07d86vfvWrsprmzJmTDh06LHV9LVu2TJs2bTJnzpzPvA8AAAAAwKrPTjsAlrLvvvvm//7v/3Lbbbdljz32yKRJk1JbW5sxY8aUxvTs2bPsnJ49ey7TTrt/R11dXbbbbrul1vmoV155JYcffng6d+6cNm3aZM0110xDQ0Pmzp2bJJk1a1Y22GCDsoBw2223LZtj1qxZ2WKLLcoeX/nxMTNnzsxf/vKX0k7EysrKbLLJJkmS2bNnl8b16NFjqet49913l3o05r+0aNEiCxYs+NR7AAAAAACsHuy0A+ATNW/ePL17907v3r0zbNiwDB48OL/4xS8yYMCAoksrc+ihh+b111/Pf/7nf2bDDTdMs2bN0rNnzyxcuPArXaehoSF9+/bNBRdcsFRf+/btS59btWq1VH9VVVXefPPNT5z3jTfeyDrrrPPVFQoAAAAArJTstANgmWy66aZ55513SscPPfRQWf9DDz2UmpqaZZqradOmWbRo0eeOq6mpWep9bx9fd+rUqTn22GOz1157ZbPNNkuzZs1SX19f6u/atWteeumlvPLKK6W2Rx55pGyOrl275sknnyx7h9/Hx9TW1ubpp59Ox44ds/HGG5f9fFJQ91Hdu3fPM888s1T77Nmz895776V79+6feT4AAAAAsOoT2gFQ5vXXX89uu+2W6667Lk888UReeOGF/OEPf8ivfvWr/OAHPyiN+8Mf/pCrr746zz33XH7xi19k2rRpOfroo5dpjY4dO6ahoSETJ05MfX196fGQp556avr3718ad9xxx+Xqq6/O6NGjS+s8/fTTZXN17tw51157berq6vLwww/n4IMPTosWLUr9vXv3zkYbbZRDDz00TzzxRKZOnZozzjgjSVJRUZEkOeigg7J48eIcccQRqaury913351f//rXZWN+9rOf5Y033siBBx6YRx55JLNnz87dd9+dgQMHfm4A2adPn0yZMmWp9smTJ6dTp07ZaKONlum+AQAAAACrLqEdAGUqKyuz3Xbb5eKLL87OO++cbt26ZdiwYTn8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AAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AX5thw4bl/PPPL2ubNWtW2rVrl7fffvsLz1tfX5911103//u//1vWfsABB2TkyJFfaM6KiorccsstX7imouy88865/vrrkyQLFy5Mx44d8+ijjxZcFQAAAADweYR2ACuhl19+Occcc0w6deqUZs2aZYMNNkjfvn0zceLE5brumDFjstZaa33h86dOnZpjjz22rO3UU0/NMccck9atWydJ3nvvvQwYMCCbb755mjRpkr333vtz562qqkr//v3zi1/8oqz9jDPOyHnnnZe33nrrC9e8Mrntttvyyiuv5IADDkiSNG3aNEOGDMnQoUMLrgwAAAAA+DxCO4CVzIsvvpgePXrkvvvuy4UXXpgnn3wyd911V77zne/kZz/72See88EHH3zNVX6yXr16pbKysnQ8d+7c/PnPf86AAQNKbYsWLUqLFi1y7LHHplevXss898CBAzNu3Li88cYbpbZu3bplo402ynXXXfeV1L8iWrJkST788MMkyaWXXpqBAwemUaP/9+v94IMPzpQpU/L0008XVSIAAAAAsAyEdgArmZ/+9KepqKjItGnTsu+++6ZLly7ZbLPN8vOf/zwPPfRQkn8+2nHUqFH5/ve/n1atWuW8885Lktx6662pra1N8+bN06lTp5x99tmlwCdJLrroomy++eZp1apVNthgg/z0pz9NQ0NDkmTSpEkZOHBg3nrrrVRUVKSioiJnnXVWkuT999/PkCFDsv7666dVq1bZbrvtMmnSpNK8ixYtSpLstNNOZddy4403Zsstt8z6669famvVqlVGjRqVww8/PO3atVvm+7LZZpulQ4cOufnmm8va+/btm/Hjx3/muc8//3x23nnnNG/ePJtuumnuueeepcYMHTo0P/zhD5Mk3//+9zNs2LClwtBzzz036667blq3bp3BgwfnlFNOyVZbbVXq//DDD3PsscdmrbXWStu2bTN06NAceuihZbsJFy9enBEjRuRb3/pWWrRokS233DI33XRTqX/SpEmpqKjInXfemR49eqRZs2aZMmVKXnvttdx3333p27dvWU3f+MY3ssMOO3zuPQAAAAAAiiW0A1iJvPHGG7nrrrvys5/9LK1atVqq/6OPrjzrrLPywx/+ME8++WQOO+ywTJ48Of37989xxx2XZ555Jr/97W8zZsyYUqCXJI0aNcqll16ap59+OmPHjs19992Xk08+OUmy/fbb55JLLsmaa66ZefPmZd68eRkyZEiS5Oijj86DDz6Y8ePH54knnsh+++2XPfbYI88//3ySlP656aabltU7efLkbL311l/Z/dl2220zefLkpdqmTZuW999//xPPWbx4cfbZZ580bdo0Dz/8cK688spPfJxk69atSyHlkCFD8vvf/z4XX3xxqX/cuHE577zzcsEFF2T69Omprq7OqFGjyua44IILMm7cuIwePTpTp07NP/7xj6XemzdixIhcc801ufLKK/P000/nhBNOSL9+/XL//feXjTvllFPyy1/+MnV1ddliiy0yZcqUtGzZMjU1Nct0XwAAAACAFUuTogsAYNn99a9/zZIlS7LJJpt87tiDDjooAwcOLB0fdthhOeWUU3LooYcmSTp16pThw4fn5JNPLr0L7vjjjy+N79ixY84999wcddRRueKKK9K0adO0adMmFRUVZTvg5s6dm9GjR2fu3Lnp0KFDkn+GWnfddVdGjx6d888/P/PmzUuSrL322mU1zpkz5ysN7Tp06JDHHntsqbaFCxfm5ZdfzoYbbrjUOffee2+effbZ3H333aX6zz///Oy5555l484444zMmDEjSbLzzjvnww8/zPjx40uh5mWXXZZBgwaV7vmZZ56ZCRMmlHYq/mvMqaeeWtqxd/nll+eOO+4o9b///vs5//zzc++996Znz55J/vk9TZkyJb/97W+zyy67lMaec8456d27d+l4zpw5WW+99coejfnRezBnzpzPu30AAAAAQIGEdgArkSVLlizz2I+HYTNnzszUqVPLdtYtWrQo7733XhYsWJCWLVvm3nvvzYgRI/Lss8/mH//4Rz788MOy/k/y5JNPZtGiRenSpUtZ+/vvv5+2bduWPif/fGznR7377rtp3rz5Ml/T52nRokUWLFiwVFuSpdr/pa6uLhtssEEpsEtSCsw+6r//+78zYsSIJMmOO+6YxYsXZ8011yz1z5o1Kz/96U/Lztl2221z3333JUneeuutvPLKK9l2221L/Y0bN06PHj2yePHiJP8MZRcsWFAWxiXJwoUL071797K2j3+/n3UvP+m+AAAAAAArFqEdwEqkc+fOqaioyLPPPvu5Yz/++MyGhoacffbZ2WeffZYa27x587z44ov53ve+l5/85Cc577zzsvbaa2fKlCkZNGhQFi5c+KmhXUNDQxo3bpzp06encePGZX2VlZVJ/t9jOz/+Driqqqq8+eabn3sty+qNN97IOuuss1RbkqXa/x0PPvhgDj744Bx55JGZOXNmrr/++jz55JMZOXLkl6r34/61K+/2228ve89fkjRr1qzs+OPf72fdy0+6LwAAAADAisU77QBWImuvvXb69OmT3/zmN3nnnXeW6p8/f/6nnltbW5tZs2Zl4403XuqnUaNGmT59ehYvXpyRI0fm29/+drp06ZL/+7//K5ujadOmWbRoUVlb9+7ds2jRorz66qtLzfuvx2h27do1SfK3v/1tqXOfeeaZL3IrPtFTTz211I60p556Kt/85jdTVVX1iefU1NTkpZdeKj3CM0keeuihsjEPPPBANtxwwwwaNChJUl1dvdTjJrt27ZpHHnmkrO2jx23atMl6661X1rZo0aLSIzeTf77zr1mzZpk7d+5S93KDDTb4zGvv3r17Xn755U8M7j7pvgAAAAAAKxahHcBK5je/+U0WLVqUbbfdNn/84x/z/PPPp66uLpdeeuknPtbxX84888xcc801Ofvss/P000+nrq4u48ePzxlnnJEk2XjjjfPBBx/ksssuy9/+9rdce+21ufLKK8vm6NixYxoaGjJx4sTU19dnwYIF6dKlSw4++OD0798/f/rTn/LCCy9k2rRpGTFiRG6//fYkyTe+8Y0kyeOPP142X58+ffLggw8uFQQ+88wzefzxx/PGG2/krbfeyuOPP77UuR+3YMGCTJ8+Pf/xH/9R1j558uSytr///e/ZZJNNMm3atCRJr1690qVLlxx66KGZOXNmJk+enNNPP71sjs6dO2fu3Lm5++67kyQ33HBDbr755rIxxxxzTK666qqMHTs2zz//fM4999w88cQTZY8EPeaYYzJixIjceuutmTVrVo477ri8+eabpTGtW7fOkCFDcsIJJ2Ts2LGZPXt2ZsyYkcsuuyxjx479zOvv3r17qqqqMnXq1KX6Pn4PAAAAAIAVj9AOYCXTqVOnzJgxI9/5zndy4oknplu3bundu3cmTpyYUaNGfep5ffr0yZ///OdMmDAh22yzTb797W/n4osvzoYbbpgk2XLLLXPRRRflggsuSLdu3TJu3LjSO9z+Zfvtt89RRx2VH//4x1lnnXXyq1/9KkkyevTo9O/fPyeeeGK6du2avffeO4888kiqq6vLzr/zzjvLjvfcc880adIk9957b1n7Xnvtle7du+d//ud/MmnSpHTv3r1sp9iLL76YioqKTJo0qdR26623prq6OjvttFOp7b333sstt9ySww8/vNT2wQcfZNasWaV3vDVq1Cg333xz3n333Wy77bYZPHhw2Xv/kuT73/9+TjjhhFxwwQVJkieeeCLDhg0rG3PwwQfn1FNPzZAhQ1JbW5sXXnghAwYMKHvP3NChQ3PggQemf//+6dmzZyorK9OnT5+yMcOHD8+wYcMyYsSI1NTUZI899sjtt9+eb33rW/ksjRs3zsCBAzNu3Liy9gcffDBvvfVWfvSjH33m+QAAAABAsSqWLFmypOgiVkU777xzOnbsmGuuuaboUojvY0Xj+1j9zJgxIz169Mh6662Xm2++uWxH4G9+85vcdtttpV1sy+Ivf/lL9tlnn/ztb38r7eL79re/nWOPPTYHHXRQadyoUaNy8803Z8KECV/pdUyfPj21tbWfO753795p165drr322k/sX7x4cWpqarL//vtn+PDhX7q+l19+OZtttllmzJhRCmN//OMfZ8stt8xpp532pedfHfnzasXi+1ix+D4AYOXn9zmwsvDnFauLJkUXAMDq45xzzkl9fX1Z25FHHpn58+fn7bffTuvWrZdpnjvuuCOnnXZaKbCrr6/PPvvskwMPPLBs3BprrJHLLrvsqyn+cyxYsCBXXnll+vTpk8aNG+eGG27Ivffem3vuuac0Zs6cOZkwYUJ22WWXvP/++7n88svzwgsvlAWNX0a7du1y1VVXZe7cudlwww2zcOHCbL755jnhhBO+kvkBAAAAgOVHaAfA12brrbdeaodakyZNlnqH3Oe58MILy46rqqpy8sknLzVu8ODB/36RX1BFRUXuuOOOnHfeeXnvvffStWvX/PGPf0yvXr1KYxo1apQxY8ZkyJAhWbJkSbp165Z77703NTU1X1kde++9d+lz06ZNS+8sBAAAAABWbEI7APgKtGjRYql3833cBhtskKlTp35NFQEAAAAAK5NGRRcAAAAAAAAAqzuhHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwZoUXQAAq4+6urqiS/hSVvb6AQAAAIAVl9AOgOWuqqoqLVu2TL9+/You5Utr2bJlqqqqii4DAAAAAFjFCO0AWO6qq6tTV1eX+vr6okv50qqqqlJdXV10GQAAAADAKkZoB8DXorq6WtgFAAAAAPApGhVdAAAAAAAAAKzuhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQsCZFFwCseObOnZv6+vrlNn9DQ0Nef/31zJgxY7mtAfBV+Lr+vKqqqkp1dfVyXQMAAACAFZvQDigzd+7c1NTUZMGCBct1ncceeyx33HHHcl0D4Kvwdfx51bJly9TV1QnuAAAAAFZjQjugTH19fRYsWJDrrrsuNTU1RZcDsMqrq6tLv379Ul9fL7QDAAAAWI0J7YBPVFNTk9ra2qLLAAAAAACA1UKjogsAAAAAAACA1Z3QDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0A+Mq9+OKLqaioyOOPP54kmTRpUioqKjJ//vwvPfdZZ52Vrbba6kvP83WbOHFiampqsmjRoiTJlVdemb59+xZcFQAAAACwohDaAbCU1157LT/5yU9SXV2dZs2apV27dunTp0+mTp36hebbfvvtM2/evLRp0yZJMmbMmKy11lpfYcUrvpNPPjlnnHFGGjdunCQ57LDDMmPGjEyePLngygAAAACAFUGTogsAYMWz7777ZuHChRk7dmw6deqUV155JRMnTszrr7/+heZr2rRp2rVr9xVXueJbuHBhmjZtmilTpmT27NnZd999S31NmzbNQQcdlEsvvTQ77bRTgVUCAAAAACsCO+0AKDN//vxMnjw5F1xwQb7zne9kww03zLbbbptTTz013//+95MkFRUVGTVqVPbcc8+0aNEinTp1yk033fSpc3708ZiTJk3KwIED89Zbb6WioiIVFRU566yzPvXcX/7yl1lvvfXSunXrDBo0KO+9915Z/yOPPJLevXunqqoqbdq0yS677JIZM2aUjXn22Wez4447pnnz5tl0001z7733pqKiIrfccktpzAMPPJCtttoqzZs3z9Zbb51bbrml7BGfSfLUU09lzz33TGVlZdZbb70ccsghqa+vL/XvuuuuOfroo3P88cenqqoqffr0SZKMHz8+vXv3TvPmzcvq6tu3b2677ba8++67n3r9AAAAAMDqQWgHQJnKyspUVlbmlltuyfvvv/+p44YNG5Z99903M2fOzMEHH5wDDjggdXV1nzv/9ttvn0suuSRrrrlm5s2bl3nz5mXIkCGfOPbGG2/MWWedlfPPPz+PPvpo2rdvnyuuuKJszNtvv51DDz00U6ZMyUMPPZTOnTtnr732yttvv50kWbRoUfbee++0bNkyDz/8cH73u9/l9NNPL5vjH//4R/r27ZvNN988M2bMyPDhwzN06NCyMfPnz89uu+2W7t2759FHH81dd92VV155Jfvvv3/ZuLFjx6Zp06aZOnVqrrzyyiTJ5MmTs/XWWy91fVtvvXU+/PDDPPzww5973wAAAACAVZvHYwJQpkmTJhkzZkwOP/zwXHnllamtrc0uu+ySAw44IFtssUVp3H777ZfBgwcnSYYPH5577rknl1122VKh2sc1bdo0bdq0SUVFxec+MvOSSy7JoEGDMmjQoCTJueeem3vvvbdst91uu+1Wds7vfve7rLXWWrn//vvzve99L/fcc09mz56dSZMmldY777zz0rt379I5119/fSoqKvL73/++tBvv73//ew4//PDSmMsvvzzdu3fP+eefX2q7+uqrs8EGG+S5555Lly5dkiSdO3fOr371q7Ka5syZkw4dOix1fS1btkybNm0yZ86cz7wPAAAAAMCqz047AJay77775v/+7/9y2223ZY899sikSZNSW1ubMWPGlMb07Nmz7JyePXsu0067f0ddXV222267pdb5qFdeeSWHH354OnfunDZt2mTNNddMQ0ND5s6dmySZNWtWNthgg7KAcNttty2bY9asWdliiy3KHl/58TEzZ87MX/7yl9JOxMrKymyyySZJktmzZ5fG9ejRY6nrePfdd5d6NOa/tGjRIgsWLPjUewAAAAAArB7stAPgEzVv3jy9e/dO7969M2zYsAwePDi/+MUvMmDAgKJLK3PooYfm9ddfz3/+539mww03TLNmzdKzZ88sXLjwK12noaEhffv2zQUXXLBUX/v27UufW7VqtVR/VVVV3nzzzU+c94033sg666zz1RUKAAAAAKyU7LQDYJlsuummeeedd0rHDz30UFn/Qw89lJqammWaq2nTplm0aNHnjqupqVnqfW8fX3fq1Kk59thjs9dee2WzzTZLs2bNUl9fX+rv2rVrXnrppbzyyiultkceeaRsjq5du+bJJ58se4ffx8fU1tbm6aefTseOHbPxxhuX/XxSUPdR3bt3zzPPPLNU++zZs/Pee++le/fun3k+AAAAALDqE9oBUOb111/Pbrvtluuuuy5PPPFEXnjhhfzhD3/Ir371q/zgBz8ojfvDH/6Qq6++Os8991x+8YtfZNq0aTn66KOXaY2OHTumoaEhEydOTH19fenxkKeeemr69+9fGnfcccfl6quvzujRo0vrPP3002Vzde7cOddee23q6ury8MMP5+CDD06LFi1K/b17985GG22UQw89NE888USmTp2aM844I0lSUVGRJDnooIOyePHiHHHEEamrq8vdd9+dX//612Vjfvazn+WNN97IgQcemEceeSSzZ8/O3XffnYEDB35uANmnT59MmTJlqfbJkyenU6dO2WijjZbpvgEAAAAAqy6hHQBlKisrs9122+Xiiy/OzjvvnG7dumXYsGE5/PDDc/nll5fGnX322Rk/fny22GKLXHPNNbnhhhuy6aabLtMa22+/fY466qj8+Mc/zjrrrJNf/epXSZJ58+aV3kWXJD/+8Y8zbNiwnHzyyenRo0fmzJmTn/zkJ2VzXXXVVXnzzTdTW1ubQw45JMcee2zWXXfdUn/jxo1zyy23pKGhIdtss00GDx6c008/PUlK75lbc8018z//8z95/PHHs9VWW+X000/PmWeeWTamQ4cOmTp1ahYtWpT/+I//yOabb57jjz8+a621Vho1+uxfpwcffHCefvrpzJo1q6z9hhtuyOGHH75M9wwAAAAAWLV5px0AZZo1a5YRI0ZkxIgRnzmuQ4cOmTBhwif2dezYMUuWLCkd77rrrmXHSTJq1KiMGjWqrG3MmDFLzXXaaafltNNOK2v76HvlunfvvtSjLH/0ox+VHW+yySZlO92mTp2aJNl4441Lbdtvv31mzpxZOh43blzWWGONVFdXl9o6d+6cP/3pT0vV+C+TJk36xPa11147Rx99dC666KL89re/TZI8/fTTefzxx3PjjTd+6nwAAAAAwOpDaAfAKu/mm29OZWVlOnfunL/+9a857rjjssMOO5Q9lvKaa65Jp06dsv7662fmzJkZOnRo9t9//7JHbX4Zp59+eq644oosXrw4jRo1yrx583LNNdekTZs2X8n8AAAAAMDKTWgHwCrv7bffztChQzN37txUVVWlV69eGTlyZNmYl19+OWeeeWZefvnltG/fPvvtt1/OO++8r6yGtdZaq2zHYK9evb6yuQEAAACAlZ/QDoB/28cfdbmi69+/f/r37/+ZY04++eScfPLJX1NFAAAAAADlGhVdAAAAAAAAAKzuhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAVrUnQBwIqprq6u6BIAVgv+vAUAAAAgEdoBH1NVVZWWLVumX79+RZcCsNpo2bJlqqqqii4DAAAAgAIJ7YAy1dXVqaurS319fdGlwL9l8ODBad++fYYPH150KfBvq6qqSnV1ddFlAAAAAFAgoR2wlOrqan95zEqnsrIybdu2TW1tbdGlAAAAAAD82xoVXQAAAAAAAACs7oR2AAAAAAAAUDChHQAAAAAAABRMaAcABejYsWMuueSSossAAAAAAFYQQjsAAAAAAAAomNAOAAAAAAAACia0A2C18c4776R///6prKxM+/btM3LkyOy66645/vjjk/zzkZXnnntuacyGG26Y2267La+99lp+8IMfpLKyMltssUUeffTRsnn/+Mc/ZrPNNkuzZs3SsWPHjBw5sqz/1VdfTd++fdOiRYt861vfyrhx45aqbf78+Rk8eHDWWWedrLnmmtltt90yc+bM5XYvAAAAAIAVi9AOgNXGSSedlPvvvz+33nprJkyYkEmTJmXGjBllYy6++OLssMMOeeyxx/Ld7343hxxySPr3759+/fplxowZ2WijjdK/f/8sWbIkSTJ9+vTsv//+OeCAA/Lkk0/mrLPOyrBhwzJmzJjSnAMGDMhLL72Uv/zlL7nppptyxRVX5NVXXy1bd7/99surr76aO++8M9OnT09tbW123333vPHGG8v9vgAAAAAAxWtSdAEA8HVoaGjIVVddleuuuy677757kmTs2LH55je/WTZur732ypFHHpkkOfPMMzNq1Khss8022W+//ZIkQ4cOTc+ePfPKK6+kXbt2ueiii7L77rtn2LBhSZIuXbrkmWeeyYUXXpgBAwbkueeey5133plp06Zlm222SZJcddVVqampKa05ZcqUTJs2La+++mqaNWuWJPn1r3+dW265JTfddFOOOOKI5XtzAAAAAIDC2WkHwGph9uzZWbhwYbbbbrtS29prr52uXbuWjdtiiy1Kn9dbb70kyeabb75U2792ytXV1WWHHXYom2OHHXbI888/n0WLFqWuri5NmjRJjx49Sv2bbLJJ1lprrdLxzJkz09DQkLZt26aysrL088ILL2T27Nlf8soBAAAAgJWBnXYA8BFrrLFG6XNFRcWnti1evPgrW7OhoSHt27fPpEmTlur7aLgHAAAAAKy67LQDYLWw0UYbZY011sjDDz9canvzzTfz3HPPfal5a2pqMnXq1LK2qVOnpkuXLmncuHE22WSTfPjhh5k+fXqpf9asWZk/f37puLa2Ni+//HKaNGmSjTfeuOynqqrqS9UHAAAAAKwchHYArBYqKyszaNCgnHTSSbnvvvvy1FNPZcCAAWnU6Mv9KjzxxBMzceLEDB8+PM8991zGjh2byy+/PEOGDEmSdO3aNXvssUeOPPLIPPzww5k+fXoGDx6cFi1alObo1atXevbsmb333jsTJkzIiy++mAceeCCnn356Hn300S9VHwAAAACwchDaAbDauPDCC7PTTjulb9++6dWrV3bccceyd819EbW1tbnxxhszfvz4dOvWLWeeeWbOOeecDBgwoDRm9OjR6dChQ3bZZZfss88+OeKII7LuuuuW+isqKnLHHXdk5513zsCBA9OlS5cccMABmTNnTukdegAAAADAqs077QBYbVRWVubaa6/NtddeW2q7/fbbS59ffPHFpc5ZsmRJ2XHHjh2Xatt3332z7777fuq67dq1y5///OeytkMOOaTsuHXr1rn00ktz6aWXfu51AAAAAACrHjvtAAAAAAAAoGBCOwAAAAAAACiYx2MCsFqbNGlS0SUAAAAAANhpBwAAAAAAAEUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFKxJ0QUAsHqYO3du6uvrl9v8DQ0Nef311zNjxozltkaSVFVVpbq6ermuAQAAAACsfoR2ACx3c+fOTU1NTRYsWLBc13nsscdyxx13LNc1WrZsmbq6OsEdAAAAAPCVEtoBsNzV19dnwYIFue6661JTU1N0OV9YXV1d+vXrl/r6eqEdAAAAAPCVEtoB8LWpqalJbW1t0WUAAAAAAKxwGhVdAAAAAAAAAKzuhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoB8DXZtiwYTn//PPL2mbNmpV27drl7bff/sLz1tfXZ911183//u//lrUfcMABGTly5Beas6KiIrfccssXrqkoO++8c66//vokycKFC9OxY8c8+uijBVcFAAAAAHweoR3ASujll1/OMccck06dOqVZs2bZYIMN0rdv30ycOHG5rjtmzJistdZaX/j8qVOn5thjjy1rO/XUU3PMMcekdevWSZL33nsvAwYMyOabb54mTZpk7733/tx5q6qq0r9///ziF78oaz/jjDNy3nnn5a233vrCNa9Mbrvttrzyyis54IADkiRNmzbNkCFDMnTo0IIrAwAAAAA+j9AOYCXz4osvpkePHrnvvvty4YUX5sknn8xdd92V73znO/nZz372ied88MEHX3OVn6xXr16prKwsHc+dOzd//vOfM2DAgFLbokWL0qJFixx77LHp1avXMs89cODAjBs3Lm+88UaprVu3btloo41y3XXXfSX1r4iWLFmSDz/8MEly6aWXZuDAgWnU6P/9ej/44IMzZcqUPP3000WVCAAAAAAsA6EdwErmpz/9aSoqKjJt2rTsu+++6dKlSzbbbLP8/Oc/z0MPPZTkn492HDVqVL7//e+nVatWOe+885Ikt956a2pra9O8efN06tQpZ599dinwSZKLLroom2++eVq1apUNNtggP/3pT9PQ0JAkmTRpUgYOHJi33norFRUVqaioyFlnnZUkef/99zNkyJCsv/76adWqVbbbbrtMmjSpNO+iRYuSJDvttFPZtdx4443Zcssts/7665faWrVqlVGjRuXwww9Pu3btlvm+bLbZZunQoUNuvvnmsva+fftm/Pjxn3nu888/n5133jnNmzfPpptumnvuuWepMUOHDs0Pf/jDJMn3v//9DBs2bKkw9Nxzz826666b1q1bZ/DgwTnllFOy1VZblfo//PDDHHvssVlrrbXStm3bDB06NIceemjZbsLFixdnxIgR+da3vpUWLVpkyy23zE033VTqnzRpUioqKnLnnXemR48eadasWaZMmZLXXnst9913X/r27VtW0ze+8Y3ssMMOn3sPAAAAAIBiCe0AViJvvPFG7rrrrvzsZz9Lq1atlur/6KMrzzrrrPzwhz/Mk08+mcMOOyyTJ09O//79c9xxx+WZZ57Jb3/724wZM6YU6CVJo0aNcumll+bpp5/O2LFjc9999+Xkk09Okmy//fa55JJLsuaaa2bevHmZN29ehgwZkiQ5+uij8+CDD2b8+PF54oknst9++2WPPfbI888/nySlf2666aZl9U6ePDlbb731V3Z/tt1220yePHmptmnTpuX999//xHMWL16cffbZJ02bNs3DDz+cK6+88hMfJ9m6detSSDlkyJD8/ve/z8UXX1zqHzduXM4777xccMEFmT59eqqrqzNq1KiyOS644IKMGzcuo0ePztSpU/OPf/xjqffmjRgxItdcc02uvPLKPP300znhhBPSr1+/3H///WXjTjnllPzyl79MXV1dtthii0yZMiUtW7ZMTU3NMt0XAAAAAGDF0qToAgBYdn/961+zZMmSbLLJJp879qCDDsrAgQNLx4cddlhOOeWUHHrooUmSTp06Zfjw4Tn55JNL74I7/vjjS+M7duyYc889N0cddVSuuOKKNG3aNG3atElFRUXZDri5c+dm9OjRmTt3bjp06JDkn6HWXXfdldGjR+f888/PvHnzkiRrr712WY1z5sz5SkO7Dh065LHHHluqbeHChXn55Zez4YYbLnXOvffem2effTZ33313qf7zzz8/e+65Z9m4M844IzNmzEiS7Lzzzvnwww8zfvz4Uqh52WWXZdCgQaV7fuaZZ2bChAmlnYr/GnPqqaeWduxdfvnlueOOO0r977//fs4///zce++96dmzZ5J/fk9TpkzJb3/72+yyyy6lseecc0569+5dOp4zZ07WW2+9skdjfvQezJkz5/NuHwAAAABQIKEdwEpkyZIlyzz242HYzJkzM3Xq1LKddYsWLcp7772XBQsWpGXLlrn33nszYsSIPPvss/nHP/6RDz/8sKz/kzz55JNZtGhRunTpUtb+/vvvp23btqXPyT8f2/lR7777bpo3b77M1/R5WrRokQULFizVlmSp9n+pq6vLBhtsUArskpQCs4/67//+74wYMSJJsuOOO2bx4sVZc801S/2zZs3KT3/607Jztt1229x3331JkrfeeiuvvPJKtt1221J/48aN06NHjyxevDjJP0PZBQsWlIVxSbJw4cJ07969rO3j3+9n3ctPui8AAAAAwIpFaAewEuncuXMqKiry7LPPfu7Yjz8+s6GhIWeffXb22WefpcY2b948L774Yr73ve/lJz/5Sc4777ysvfbamTJlSgYNGpSFCxd+amjX0NCQxo0bZ/r06WncuHFZX2VlZZL/99jOj78DrqqqKm+++ebnXsuyeuONN7LOOuss1ZZkqfZ/x4MPPpiDDz44Rx55ZGbOnJnrr78+Tz75ZEaOHPml6v24f+3Ku/3228ve85ckzZo1Kzv++Pf7Wffyk+4LAAAAALBi8U47gJXI2muvnT59+uQ3v/lN3nnnnaX658+f/6nn1tbWZtasWdl4442X+mnUqFGmT5+exYsXZ+TIkfn2t7+dLl265P/+7//K5mjatGkWLVpU1ta9e/csWrQor7766lLz/usxml27dk2S/O1vf1vq3GeeeeaL3IpP9NRTTy21I+2pp57KN7/5zVRVVX3iOTU1NXnppZdKj/BMkoceeqhszAMPPJANN9wwgwYNSpJUV1cv9bjJrl275pFHHilr++hxmzZtst5665W1LVq0qPTIzeSf7/xr1qxZ5s6du9S93GCDDT7z2rt3756XX375E4O7T7ovAAAAAMCKRWgHsJL5zW9+k0WLFmXbbbfNH//4xzz//POpq6vLpZde+omPdfyXM888M9dcc03OPvvsPP3006mrq8v48eNzxhlnJEk23njjfPDBB7nsssvyt7/9Lddee22uvPLKsjk6duyYhoaGTJw4MfX19VmwYEG6dOmSgw8+OP3798+f/vSnvPDCC5k2bVpGjBiR22+/PUnyjW98I0ny+OOPl83Xp0+fPPjgg0sFgc8880wef/zxvPHGG3nrrbfy+OOPL3Xuxy1YsCDTp0/Pf/zHf5S1T548uazt73//ezbZZJNMmzYtSdKrV6906dIlhx56aGbOnJnJkyfn9NNPL5ujc+fOmTt3bu6+++4kyQ033JCbb765bMwxxxyTq666KmPHjs3zzz+fc889N0888UTZI0GPOeaYjBgxIrfeemtmzZqV4447Lm+++WZpTOvWrTNkyJCccMIJGTt2bGbPnp0ZM2bksssuy9ixYz/z+rt3756qqqpMnTp1qb6P3wMAAAAAYMUjtANYyXTq1CkzZszId77znZx44onp1q1bevfunYkTJ2bUqFGfel6fPn3y5z//ORMmTMg222yTb3/727n44ouz4YYbJkm23HLLXHTRRbngggvSrVu3jBs3rvQOt3/Zfvvtc9RRR+XHP/5x1llnnfzqV79KkowePTr9+/fPiSeemK5du2bvvffOI488kurq6rLz77zzzrLjPffcM02aNMm9995b1r7XXnule/fu+Z//+Z9MmjQp3bt3L9sp9uKLL6aioiKTJk0qtd16662prq7OTjvtVGp77733csstt+Twww8vtX3wwQeZNWtW6R1vjRo1ys0335x333032267bQYPHlz23r8k+f73v58TTjghF1xwQZLkiSeeyLBhw8rGHHzwwTn11FMzZMiQ1NbW5oUXXsiAAQPK3jM3dOjQHHjggenfv3969uyZysrK9OnTp2zM8OHDM2zYsIwYMSI1NTXZY489cvvtt+db3/pWPkvjxo0zcODAjBs3rqz9wQcfzFtvvZUf/ehHn3k+AAAAAFCsiiVLliwpuohV0c4775yOHTvmmmuuKboU4vuAos2YMSM9evTIeuutl5tvvrlsR+BvfvOb3HbbbaVdbMviL3/5S/bZZ5/87W9/K+3i+/a3v51jjz02Bx10UGncqFGjcvPNN2fChAlf6XVMnz49tbW1nzu+d+/eadeuXa699tpP7F+8eHFqamqy//77Z/jw4V+6vpdffjmbbbZZZsyYUQpjf/zjH2fLLbfMaaed9qXnh6L5fb5i8X0AwMrP73NgZeHPK1YXTYouAIDVxznnnJP6+vqytiOPPDLz58/P22+/ndatWy/TPHfccUdOO+20UmBXX1+fffbZJwceeGDZuDXWWCOXXXbZV1P851iwYEGuvPLK9OnTJ40bN84NN9yQe++9N/fcc09pzJw5czJhwoTssssuef/993P55ZfnhRdeKAsav4x27drlqquuyty5c7Phhhtm4cKF2XzzzXPCCSd8JfMDAAAAAMuP0A6Ar83WW2+91A61Jk2aLPUOuc9z4YUXlh1XVVXl5JNPXmrc4MGD//0iv6CKiorccccdOe+88/Lee++la9eu+eMf/5hevXqVxjRq1ChjxozJkCFDsmTJknTr1i333ntvampqvrI69t5779Lnpk2blt5ZCAAAAACs2IR2APAVaNGixVLv5vu4DTbYIFOnTv2aKgIAAAAAViaNii4AAAAAAAAAVndCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAgjUpugAAVh91dXVFl/ClrOz1AwAAAAArLqEdAMtdVVVVWrZsmX79+hVdypfWsmXLVFVVFV0GAAAAALCKEdoBsNxVV1enrq4u9fX1RZfypVVVVaW6urroMgAAAACAVYzQDoCvRXV1tbALAAAAAOBTNCq6AAAAAAAAAFjdCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYE2KLgAAgFXD3LlzU19fv9zmb2hoyOuvv54ZM2YstzVYdl/X91FVVZXq6urlugYAAACsCIR2AAB8aXPnzk1NTU0WLFiwXNd57LHHcscddyzXNVh2X8f30bJly9TV1QnuAAAAWOUJ7QAA+NLq6+uzYMGCXHfddampqSm6HFYRdXV16devX+rr64V2AAAArPKEdgAAfGVqampSW1tbdBkAAAAAK51GRRcAAAAAAAAAqzuhHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAMBn2HXXXXP88ccXXca/ZcCAAdl7772LLgMAAAD4NwjtAABY6X1aSDVp0qRUVFRk/vz5X3tNK5IBAwakoqKi9NO2bdvsscceeeKJJ8rG/f73v8+WW26ZysrKrLXWWunevXtGjBhRUNUAAACwehHaAQDASuqDDz5Y5rF77LFH5s2bl3nz5mXixIlp0qRJvve975X6r7766hx//PE59thj8/jjj2fq1Kk5+eST09DQsDxKBwAAAD5GaAcAwGrh9ddfz4EHHpj1118/LVu2zOabb54bbrihbMw777yT/v37p7KyMu3bt8/IkSOXmufaa6/N1ltvndatW6ddu3Y56KCD8uqrr5b6/7W77+6770737t3TokWL7Lbbbnn11Vdz5513pqamJmuuuWYOOuigLFiwoHTeXXfdlR133DFrrbVW2rZtm+9973uZPXt2qf/FF19MRUVF/vu//zu77LJLmjdvnnHjxmXRokX5+c9/Xjrv5JNPzpIlS5aqu1mzZmnXrl3atWuXrbbaKqecckpeeumlvPbaa0mS2267Lfvvv38GDRqUjTfeOJtttlkOPPDAnHfeeV/63gMAAACfT2gHAMBq4b333kuPHj1y++2356mnnsoRRxyRQw45JNOmTSuNOemkk3L//ffn1ltvzYQJEzJp0qTMmDGjbJ4PPvggw4cPz8yZM3PLLbfkxRdfzIABA5Za76yzzsrll1+eBx54IC+99FL233//XHLJJbn++utz++23Z8KECbnssstK49955538/Oc/z6OPPpqJEyemUaNG+eEPf5jFixeXzXvKKafkuOOOS11dXfr06ZORI0dmzJgxufrqqzNlypS88cYbufnmmz/zXjQ0NOS6667LxhtvnLZt2yZJ2rVrl4ceeihz5sz5d28tAAAA8BVoUnQBAADwVfjzn/+cysrKsrZFixaVPq+//voZMmRI6fiYY47J3XffnRtvvDHbbrttGhoactVVV+W6667L7rvvniQZO3ZsvvnNb5bNedhhh5U+d+rUKZdeemm22WabNDQ0lK1/7rnnZocddkiSDBo0KKeeempmz56dTp06JUl+9KMf5S9/+UuGDh2aJNl3333L1rn66quzzjrr5Jlnnkm3bt1K7ccff3z22Wef0vEll1ySU089tdR25ZVX5u677/7M+/POO++kffv2+fOf/5xGjf75/+P7xS9+kX322ScdO3ZMly5d0rNnz+y111750Y9+VBoDAAAALD/+1zcAAKuE73znO3n88cfLfv7rv/6r1L9o0aIMHz48m2++edZee+1UVlbm7rvvzty5c5Mks2fPzsKFC7PddtuVzll77bXTtWvXsnWmT5+evn37prq6Oq1bt84uu+ySJKV5/mWLLbYofV5vvfXSsmXLUmD3r7aPPlbz+eefz4EHHphOnTplzTXXTMeOHT9x3q233rr0+a233sq8efPKam7SpEnZmE+6P9OmTUufPn2y5557lnbWtW/fPg8++GCefPLJHHfccfnwww9z6KGHZo899lhqtx8AAADw1bPTDgCAVUKrVq2y8cYbl7X97//+b+nzhRdemP/8z//MJZdcks033zytWrXK8ccfn4ULFy7zGu+880769OmTPn36ZNy4cVlnnXUyd+7c9OnTZ6l51lhjjdLnioqKsuN/tX00DOvbt2823HDD/P73v0+HDh2yePHidOvWbal5W7Vqtcz1fvy8j96f//qv/0qbNm3y+9//Pueee26pvVu3bunWrVt++tOf5qijjspOO+2U+++/P9/5zne+0LoAAADAsrHTDgCA1cLUqVPzgx/8IP369cuWW26ZTp065bnnniv1b7TRRlljjTXy8MMPl9refPPNsjHPPvtsXn/99fzyl7/MTjvtlE022aRst9wX9frrr2fWrFk544wzsvvuu6empiZvvvnm557Xpk2btG/fvqzmDz/8MNOnT//ccysqKtKoUaO8++67nzpm0003TfLPsBIAAABYvuy0AwBgtdC5c+fcdNNNeeCBB/KNb3wjF110UV555ZVSMFVZWZlBgwblpJNOStu2bbPuuuvm9NNPL3ufW3V1dZo2bZrLLrssRx11VJ566qkMHz78S9f2jW98I23bts3vfve7tG/fPnPnzs0pp5yyTOced9xx+eUvf5nOnTtnk002yUUXXZT58+cvNe7999/Pyy+/nOSfYeTll1+ehoaG9O3bN0nyk5/8JB06dMhuu+2Wb37zm5k3b17OPffcrLPOOunZs+eXvkYAAADgs9lpBwDAauGMM85IbW1t+vTpk1133TXt2rXL3nvvXTbmwgsvzE477ZS+ffumV69e2XHHHdOjR49S/zrrrJMxY8bkD3/4QzbddNP88pe/zK9//esvXVujRo0yfvz4TJ8+Pd26dcsJJ5yQCy+8cJnOPfHEE3PIIYfk0EMPTc+ePdO6dev88Ic/XGrcXXfdlfbt26d9+/bZbrvt8sgjj+QPf/hDdt111yRJr1698tBDD2W//fZLly5dsu+++6Z58+aZOHFi2rZt+6WvEQAAAPhsFUuWLFlSdBGrop133jkdO3bMNddcU3QpxPcBAMvbjBkz0qNHj0yfPj21tbVFl8Mqwr9XALB8+fsSYGXhzytWF3baAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUrEnRBQAAsOqoq6srugRWIf59AgAAYHUitAMA4EurqqpKy5Yt069fv6JLYRXTsmXLVFVVFV0GAAAALHdCOwAAvrTq6urU1dWlvr5+ua0xePDgtG/fPsOHD19ua7Dsvq7vo6qqKtXV1ct1DQAAAFgRCO0AAPhKVFdXL9dwpbKyMm3btk1tbe1yW4Nl5/sAAACAr1ajogsAAAAAAACA1Z3QDgAAAAAAAAomtAMAAAAAAICCCe0AAGA56NixYy655JKiy+D/5/sAAABgRSe0AwAAAAAAgIIJ7QAAAAAAAKBgQjsAAFYZ77zzTvr375/Kysq0b98+I0eOzK677prjjz8+yT8fkXjuueeWxmy44Ya57bbb8tprr+UHP/hBKisrs8UWW+TRRx8tm/ePf/xjNttsszRr1iwdO3bMyJEjy/pfffXV9O3bNy1atMi3vvWtjBs3bqna5s+fn8GDB2edddbJmmuumd122y0zZ85cbvdiReD7AAAAgGUntAMAYJVx0kkn5f7778+tt96aCRMmZNKkSZkxY0bZmIsvvjg77LBDHnvssXz3u9/NIYcckv79+6dfv36ZMWNGNtpoo/Tv3z9LlixJkkyfPj37779/DjjggDz55JM566yzMmzYsIwZM6Y054ABA/LSSy/lL3/5S2666aZcccUVefXVV8vW3W+//fLqq6/mzjvvzPTp01NbW5vdd989b7zxxnK/L0XxfQAAAMCya1J0AQAA8FVoaGjIVVddleuuuy677757kmTs2LH55je/WTZur732ypFHHpkkOfPMMzNq1Khss8022W+//ZIkQ4cOTc+ePfPKK6+kXbt2ueiii7L77rtn2LBhSZIuXbrkmWeeyYUXXpgBAwbkueeey5133plp06Zlm222SZJcddVVqampKa05ZcqUTJs2La+++mqaNWuWJPn1r3+dW265JTfddFOOOOKI5XtzCuD7AAAAgH+PnXYAAKwSZs+enYULF2a77bYrta299trp2rVr2bgtttii9Hm99dZLkmy++eZLtf1rZ1ZdXV122GGHsjl22GGHPP/881m0aFHq6urSpEmT9OjRo9S/ySabZK211iodz5w5Mw0NDWnbtm0qKytLPy+88EJmz579Ja98xeT7AAAAgH+PnXYAAKxW1lhjjdLnioqKT21bvHjxV7ZmQ0ND2rdvn0mTJi3V99EwaXXk+wAAAIB/stMOAIBVwkYbbZQ11lgjDz/8cKntzTffzHPPPfel5q2pqcnUqVPL2qZOnZouXbqkcePG2WSTTfLhhx9m+vTppf5Zs2Zl/vz5pePa2tq8/PLLadKkSTbeeOOyn6qqqi9V34rK9wEAAAD/HqEdAACrhMrKygwaNCgnnXRS7rvvvjz11FMZMGBAGjX6cv/Je+KJJ2bixIkZPnx4nnvuuYwdOzaXX355hgwZkiTp2rVr9thjjxx55JF5+OGHM3369AwePDgtWrQozdGrV6/07Nkze++9dyZMmJAXX3wxDzzwQE4//fQ8+uijX6q+FZXvAwAAAP49QjsAAFYZF154YXbaaaf07ds3vXr1yo477lj2brMvora2NjfeeGPGjx+fbt265cwzz8w555yTAQMGlMaMHj06HTp0yC677JJ99tknRxxxRNZdd91Sf0VFRe64447svPPOGThwYLp06ZIDDjggc+bMKb2zbVXk+wAAAIBlV7FkyZIlRRexKtp5553TsWPHXHPNNUWXQnwfALAq+KK/z3fddddstdVWueSSS5ZPYasp3wcArPz8fQmwsvDnFasLO+0AAAAAAACgYEI7AAAAAAAAKFiTogsAAIDladKkSUWXwEf4PgAAAOCT2WkHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUTGgHAAAAAAAABRPaAQAAAAAAQMGEdgAAAAAAAFAwoR0AAAAAAAAUrEnRBQAAAF+9uXPnpr6+frnN39DQkNdffz0zZsxYbmsAAMvX1/X7vKqqKtXV1ct1DQBYFQjtAABgFTN37tzU1NRkwYIFy3Wdxx57LHfcccdyXQMAWL6+jt/nLVu2TF1dneAOAD6H0A4AAFYx9fX1WbBgQa677rrU1NQUXQ4AsBqrq6tLv379Ul9fL7QDgM8htAMAgFVUTU1Namtriy4DAAAAWAaNii4AAAAAAAAAVndCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAYBUxYMCAVFRU5Kijjlqq72c/+1kqKioyYMCAr78wAADgcwntAAAAYBWywQYbZPz48Xn33XdLbe+9916uv/76VFdXf+F5lyxZkg8//PCrKBEAAPgEQjsAAABYhdTW1maDDTbIn/70p1Lbn/70p1RXV6d79+6ltsWLF2fEiBH51re+lRYtWmTLLbfMTTfdVOqfNGlSKioqcuedd6ZHjx5p1qxZpkyZkrfffjsHH3xwWrVqlfbt2+fiiy/OrrvumuOPP7507vvvv58hQ4Zk/fXXT6tWrbLddttl0qRJX8flAwDASktoBwAAAKuYww47LKNHjy4dX3311Rk4cGDZmBEjRuSaa67JlVdemaeffjonnHBC+vXrl/vvv79s3CmnnJJf/vKXqauryxZbbJGf//znmTp1am677bbcc889mTx5cmbMmFF2ztFHH50HH3ww48ePzxNPPJH99tsve+yxR55//vnld9EAALCSa1J0AQAAAMBXq1+/fjn11FMzZ86cJMnUqVMzfvz40m63999/P+eff37uvffe9OzZM0nSqVOnTJkyJb/97W+zyy67lOY655xz0rt37yTJ22+/nbFjx+b666/P7rvvniQZPXp0OnToUBo/d+7cjB49OnPnzi21DxkyJHfddVdGjx6d888/f7lfPwAArIyEdgAAALCKWWeddfLd7343Y8aMyZIlS/Ld7343VVVVpf6//vWvWbBgQSmM+5eFCxeWPUIzSbbeeuvS57/97W/54IMPsu2225ba2rRpk65du5aOn3zyySxatChdunQpm+f9999P27Ztv5LrAwCAVZHQDgAAAFZBhx12WI4++ugkyW9+85uyvoaGhiTJ7bffnvXXX7+sr1mzZmXHrVq1+rfWbWhoSOPGjTN9+vQ0bty4rK+ysvLfmgsAAFYnQjsAAABYBe2xxx5ZuHBhKioq0qdPn7K+TTfdNM2aNcvcuXPLHoX5eTp16pQ11lgjjzzySKqrq5Mkb731Vp577rnsvPPOSZLu3btn0aJFefXVV7PTTjt9dRcEAACrOKEdAAAArIIaN26curq60uePat26dYYMGZITTjghixcvzo477pi33norU6dOzZprrplDDz30E+ds3bp1Dj300Jx00klZe+21s+666+YXv/hFGjVqlIqKiiRJly5dcvDBB6d///4ZOXJkunfvntdeey0TJ07MFltske9+97vL98IBAGAlJbQDAACAVdSaa675qX3Dhw/POuuskxEjRuRvf/tb1lprrdTW1ua00077zDkvuuiiHHXUUfne976XNddcMyeffHJeeumlNG/evDRm9OjROffcc3PiiSfm73//e6qqqvLtb3873/ve976yawMAgFWN0A4AAABWEWPGjPnM/ltuuaX0uaKiIscdd1yOO+64Txy76667ZsmSJUu1t27dOuPGjSsdv/POOzn77LNzxBFHlNrWWGONnH322Tn77LP/vQsAAIDVmNAOAAAAWGaPPfZYnn322Wy77bZ56623cs455yRJfvCDHxRcGQAArNyEdgAAAMC/5de//nVmzZqVpk2bpkePHpk8eXKqqqqKLgsAAFZqQjsAAABgmXXv3j3Tp08vugwAAFjlNCq6AAAAAAAAAFjdCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAAomtAMAAAAAAICCCe0AAAAAAACgYEI7AAAAAAAAKJjQDgAAAAAAAArWpOgCAACA5aOurq7oEgCA1Zz/HgGAZSe0AwCAVUxVVVVatmyZfv36FV0KAEBatmyZqqqqossAgBWe0A4AAFYx1dXVqaurS319fdGlACuxwYMHp3379hk+fHjRpQAruaqqqlRXVxddBgCs8IR2AACwCqqurvaXY8CXUllZmbZt26a2trboUgAAYLXQqOgCAAAAAAAAYHUntAMAAAAAAICCCe0AAAAAAACgYEI7AAAAYKXXsWPHXHLJJUWXAQAAX5jQDgAAAAAAAAomtAMAAAAAAICCCe0AAACAL+Sdd95J//79U1lZmfbt22fkyJHZddddc/zxx+f/Y+/uw7Qs67yBfwcGERiRYNAZsgEFgUlAGVSWUEShhTQ20jBfAHHBl1ozSyndUlm1thZRU1crI0GhrHAzH/OFwvARfCEGJV0nIVbFSsRBaRtQUeD5o8d7myVNQLoUPp/juI/jvs7zvM7zd183Hnj79byu5E+3rLzssstKY7p27Zrbb789L7zwQj72sY+loqIi/fr1y+LFi5vNe+utt+aAAw5I69at061bt0ybNq1Z/+rVqzNq1Ki0adMm++67b2bPnr1FbWvXrs2kSZPSuXPntG/fPkcddVSWLl26w64FAABsL6EdAAAAsE0mT56c++67Lz/5yU8yd+7czJ8/P0uWLGk25sorr8zgwYPzyCOP5Jhjjsm4ceMyfvz4jB07NkuWLEn37t0zfvz4bN68OUlSX1+f448/PieccEIee+yxTJkyJRdeeGFmzJhRmnPChAl59tln84tf/CJz5szJddddl9WrVzdbd8yYMVm9enXuuuuu1NfXp66uLsOGDcuLL764w68LAABsi/KiCwAAAADee5qamjJ9+vTMmjUrw4YNS5LMnDkz++yzT7NxRx99dM4444wkyUUXXZTrr78+hxxySMaMGZMk+eIXv5hBgwbl+eefT1VVVa644ooMGzYsF154YZKkZ8+eeeKJJzJ16tRMmDAhy5Yty1133ZVFixblkEMOSZJMnz49tbW1pTUXLFiQRYsWZfXq1WndunWS5PLLL89tt92WOXPm5PTTT9+xFwcAALaBnXYAAADAVluxYkU2bNiQgQMHlto6duyYXr16NRvXr1+/0vu99947SdK3b98t2t7YKdfQ0JDBgwc3m2Pw4MFZvnx5Nm7cmIaGhpSXl2fAgAGl/t69e6dDhw6l46VLl6apqSmdOnVKRUVF6fXUU09lxYoV2/nJAQBgx7DTDgAAANhhWrVqVXpfVlb2pm2bNm16x9ZsampKdXV15s+fv0Xfn4d7AADwbmKnHQAAALDVunfvnlatWuXhhx8utb300ktZtmzZds1bW1ubhQsXNmtbuHBhevbsmZYtW6Z37955/fXXU19fX+p/8skns3bt2tJxXV1dVq1alfLy8vTo0aPZq7KycrvqAwCAHUVoBwAAAGy1ioqKTJw4MZMnT869996bxx9/PBMmTEiLFtv3nxrOPffczJs3L5deemmWLVuWmTNn5tprr815552XJOnVq1dGjhyZM844Iw8//HDq6+szadKktGnTpjTH8OHDM2jQoIwePTpz587N008/nQceeCBf+tKXsnjx4u2qDwAAdhShHQAAALBNpk6dmsMPPzyjRo3K8OHDc9hhhzV71ty2qKuryw9/+MPccsst6dOnTy666KJccsklmTBhQmnMjTfemC5duuSII47Isccem9NPPz177bVXqb+srCx33nlnhgwZklNPPTU9e/bMCSeckGeeeab0DD0AAHi38Uw7AAAAYJtUVFTk5ptvzs0331xq++lPf1p6//TTT29xzubNm5sdd+vWbYu24447Lscdd9ybrltVVZU77rijWdu4ceOaHe+xxx65+uqrc/XVV//VzwEAAO8GdtoBAAAAAABAwYR2AAAAAAAAUDC3xwQAAADeMfPnzy+6BAAAeE+y0w4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAAChYedEFAAAAAFtv5cqVaWxs3GHzNzU1Zc2aNVmyZMkOWyNJKisrU1NTs0PXAACA9wKhHQAAALzHrFy5MrW1tVm/fv0OXeeRRx7JnXfeuUPXaNu2bRoaGgR3AADs8oR2AAAA8B7T2NiY9evXZ9asWamtrS26nG3W0NCQsWPHprGxUWgHAMAuT2gHAAAA71G1tbWpq6srugwAAOAd0KLoAgAAAAAAAGBXJ7QDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAAAAAACiY0A4AAAAAAAAKJrQDAAAAAACAggntAAAAAAAAoGBCOwAAANgJTJkyJQcddNDfZK158+altrY2GzdubNY+ZMiQfO9739uuuU844YRMmzatWdvdd9+dgw46KJs2bdquuQEA4N1MaAcAAADvAi+88EI+9alPpaamJq1bt05VVVVGjBiRhQsXFlLPW4WAX/jCF/LlL385LVu2LLXdfvvtef7553PCCSeU2r797W9n6NChad++fcrKyrJ27dq/uu6Xv/zlfOUrX8kf/vCHUtvIkSPTqlWrzJ49e5s/DwAAvNsJ7QAAAOBd4LjjjssjjzySmTNnZtmyZbn99tszdOjQrFmzpujSmlmwYEFWrFiR4447rln71VdfnVNPPTUtWvzPf2pYv359Ro4cmX/+539+2/P36dMn3bt3z6xZs5q1T5gwIVdfffX2FQ8AAO9iQjsAAAAo2Nq1a3P//ffn61//eo488sh07do1hx56aC644IL8wz/8Q2nMpEmT0rlz5wwZMiRJsmzZsrec9zvf+U5qa2uz++67p3fv3rnuuuua9f/2t7/NiSeemI4dO6Zdu3Y5+OCD8/DDD2fGjBn5l3/5lyxdujRlZWUpKyvLjBkzkiS33HJLPvzhD2f33XcvzfPCCy/k3nvvzahRo5rNf8455+T888/P3/3d323V9Rg1alRuueWWLdoWL16cFStWbNVcAADwXlFedAEAAACwq6uoqEhFRUVuu+22/N3f/V1at269xZgxY8akTZs2ueuuu/Lb3/42H//4x3PmmWfm7//+79OxY8ctxs+ePTsXXXRRrr322vTv3z+PPPJITjvttLRr1y6nnHJKmpqacsQRR+T9739/br/99lRVVWXJkiXZtGlTPvnJT+bxxx/P3XffnZ///OdJkj333DNJcv/99+ekk05qttaCBQvStm3b1NbWviPX49BDD81XvvKVvPrqq6VrUVNTk7333jv3339/unfv/o6sAwAA7yZCOwAAAChYeXl5ZsyYkdNOOy3f/OY3U1dXlyOOOCInnHBC+vXrlwULFmTRokVZvXp1WrduXboF5R577JE5c+bk9NNP32LOiy++ONOmTcuxxx6bJNl3333zxBNP5Fvf+lZOOeWUfO9738sLL7yQX/7yl6XQr0ePHqXzKyoqUl5enqqqqmbzPvPMM+nSpcsWbXvvvXezW2Nujy5dumTDhg1ZtWpVunbt2qz9mWeeeUfWAACAdxuhHQAAALwLHHfccTnmmGNy//3356GHHspdd92Vf/u3f8t3vvOdrFu3Lk1NTenUqVOSZNOmTUmS3//+93/xdpHr1q3LihUrMnHixJx22mml9tdff720Y+7RRx9N//79/+Iuvbfy8ssvN7s15pu1bY82bdok+dMz8f53+/9uAwCAnYXQDgAAAN4ldt9993z4wx/Ohz/84Vx44YWZNGlSLr744nz6059OdXV15s+fnyT5z//8z4wePTr/8R//kcGDB28xT1NTU5LkhhtuyMCBA5v1tWzZMsn/BGNbq7KyMi+99NJfbdseL774YpKkc+fOW7T/7zYAANhZvDP3rQAAAADecR/84Aezbt261NXVZdWqVSkvL0+PHj3ygQ98IEnygQ98IJWVlVuct/fee6dLly75r//6r/To0aPZa999902S9OvXL48++mgpIPvfdtttt2zcuHGL9v79++eJJ57Yom3VqlXvWHD3+OOPZ5999mn22V555ZWsWLEi/fv3f0fWAACAdxuhHQAAABRszZo1OeqoozJr1qz86le/ylNPPZUf/ehH+bd/+7d87GMfy/DhwzNo0KCMHj06c+fOze9///skyb//+79n8eLFf3HOf/mXf8m//uu/5uqrr86yZcvy2GOP5cYbb8wVV1yRJDnxxBNTVVWV0aNHZ+HChfmv//qv3HrrrXnwwQeTJN26dctTTz2VRx99NI2NjXn11VeTJCNGjMiCBQuardW/f/9UVlZm4cKFzdpXrVqVRx99NL/5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dOjQIRMnTkxTU1OzMT/84Q9z0EEHpW3btunatWumTp3arH/+/Plb1FFWVpZVq1aVxmzPn583lG/1GQAAAAAAADuZdevW5cADD8w//uM/5thjj33b561duzbjx4/PsGHD8vzzz2/znD/+8Y/z0EMPpUuXLs3af/3rX2fTpk351re+lR49euTxxx/PaaedlnXr1uXyyy9PkmzcuDFt2rTJCSeckK985St/cf527drlrLPOSr9+/dKuXbssWLAgZ5xxRtq1a5fTTz+9NO6AAw7Iz3/+89JxeXnzKOnBBx/MyJEjc8EFF+Saa65JeXl5li5dmhYtWrztelu1apXx48enrq4uHTp0yNKlS3Paaadl06ZN+epXv1pa65577km/fv2SJGvWrMmBBx6YMWPGlPp79uyZa6+9Nvvtt19efvnlXHnllfn7v//7/OY3v0nnzp2TJCeffHKee+65/OxnP8trr72WU089Naeffnq+973vJUnuuuuunHzyybnmmmvy93//92loaMhpp52WNm3a5Kyzzmr22Z988sm0b9++dLzXXnuV3m/rn58/J7QDAAAAAAB2eR/5yEfykY98ZKvPO/PMM3PSSSelZcuWW+yuertz/u53v8tnPvOZ3HPPPc12kiXJyJEjM3LkyNLxfvvtlyeffDLXX399KQRr165drr/++ixZsuRNQ7v+/funf//+peNu3brlP/7jP3L//fc3C+3Ky8tTVVX1prV+7nOfy9lnn53zzz+/1NarV6+tqne//fbLfvvtVxrTtWvXzJ8/P/fff3+ztSorK0u13HLLLWnbtm2z0O6kk05qNv6KK67I9OnT86tf/SrDhg1LQ0ND7r777vzyl7/MwQcfnCS55pprcvTRR+fyyy9Ply5dcvPNN2f06NE588wzS7VdcMEF+frXv55/+qd/SllZWWn+vfbaKx06dPiL12Vb//z8ObfHBAAAAAAA2AY33nhj/uu//isXX3zxNs+xadOmjBs3LpMnT84BBxzwts75wx/+kI4dO27zmknyyCOP5IEHHsgRRxzRrH358uXp0qVL9ttvv5x88slZuXJlqW/16tV5+OGHs9dee+VDH/pQ9t577xxxxBFZsGDBdtX7m9/8JnffffcWtfy56dOn54QTTki7du3+Yv+GDRvy7W9/O3vuuWcOPPDAJH/aFdihQ4dSYJckw4cPT4sWLUq30Xz11Vez++67N5urTZs2+e1vf5tnnnmmWftBBx2U6urqfPjDH87ChQvf8jNvC6EdAAAAAADAVlq+fHnOP//8zJo1a4tbSG6Nr3/96ykvL8/ZZ5/9tsb/5je/yTXXXJMzzjhjm9bbZ5990rp16xx88MH5p3/6p0yaNKnUN3DgwMyYMSN33313rr/++jz11FM5/PDD88c//jFJ8l//9V9J/vQsudNOOy1333136urqMmzYsCxfvnyr6/3Qhz6U3XffPfvvv38OP/zwXHLJJX9xjkWLFuXxxx9vVusb7rjjjlRUVGT33XfPlVdemZ/97GeprKxMkqxatarZLSyTP+0k7NixY+l5dCNGjMh//Md/ZN68edm0aVOWLVuWadOmJUmee+65JEl1dXW++c1v5tZbb82tt96aD3zgAxk6dGiWLFny5hd6G7g9JgAAAAAAwFbYuHFjTjrppPzLv/xLevbsuc3z1NfX5xvf+EaWLFnS7DaMb+Z3v/tdRo4cmTFjxuS0007bpjXvv//+NDU15aGHHsr555+fHj165MQTT0ySZrd37NevXwYOHJiuXbvmhz/8YSZOnJhNmzYlSc4444yceuqpSf5028158+blu9/9bv71X/91q+r9wQ9+kD/+8Y9ZunRpJk+enMsvvzxf+MIXthg3ffr09O3bN4ceeugWfUceeWQeffTRNDY25oYbbsjxxx9f2g34dpx22mlZsWJFPvrRj+a1115L+/bt89nPfjZTpkwpPaevV69ezW4B+qEPfSgrVqzIlVdemZtvvvltrfN22GkHAAAAAACwFf74xz9m8eLFOeuss1JeXp7y8vJccsklWbp0acrLy3Pvvfe+rXnuv//+rF69OjU1NaV5nnnmmZx77rnp1q1bs7G///3vc+SRR+ZDH/pQvv3tb29z7fvuu2/69u2b0047LZ/73OcyZcqUNx3boUOH9OzZM7/5zW+S/GnHWZJ88IMfbDautra22W003269H/jAB/LBD34wJ554Yr72ta9lypQp2bhxY7Mx69atyy233JKJEyf+xTnatWuXHj165O/+7u8yffr0lJeXZ/r06UmSqqqqrF69utn4119/PS+++GLpWXllZWX5+te/nqampjzzzDNZtWpVKRz88+fu/W+HHnpo6bq8U+y0AwAAAAAA2Art27fPY4891qztuuuuy7333ps5c+Zk3333fVvzjBs3LsOHD2/WNmLEiIwbN660ky350461I488MgMGDMiNN95Y2gG2vTZt2pRXX331TfubmpqyYsWKjBs3LknSrVu3dOnSJU8++WSzccuWLWu2S29b6t20aVNee+210m6+N/zoRz/Kq6++mrFjx271Zxo0aFDWrl2b+vr6DBgwIEly7733ZtOmTRk4cGCz81q2bJn3v//9SZLvf//7GTRoUDp37vym6zz66KOlEPOdIrQDAAAAAAB2eU1NTc12Tj311FN59NFH07Fjx9TU1OSCCy7I7373u9x0001p0aJF+vTp0+z8vfbaK7vvvnuz9r82Z6dOndKpU6dm87Rq1SpVVVWl2zH+7ne/y9ChQ9O1a9dcfvnleeGFF0pj39gtliRPPPFEKUxramrKo48+miQ56KCDkiT//u//npqamvTu3TtJ8n//7//N5Zdf3uxZeuedd15GjRqVrl275ve//30uvvjitGzZsnT7zLKyskyePDkXX3xxDjzwwBx00EGZOXNmfv3rX2fOnDlvu97Zs2enVatW6du3b1q3bp3FixfnggsuyCc/+cm0atWq2fWYPn16Ro8evcV1WrduXb7yla/kH/7hH1JdXZ3Gxsb8+7//e373u99lzJgxSf60A3DkyJE57bTT8s1vfjOvvfZazjrrrJxwwgnp0qVLkqSxsTFz5szJ0KFD88orr+TGG2/Mj370o9x3332lta666qrsu+++OeCAA/LKK6/kO9/5Tu69997MnTv3bX/Xb4fQDgAAAAAA2OUtXrw4Rx55ZOn485//fJLklFNOyYwZM/Lcc89tcQvI7Z3z7fjZz36W3/zmN/nNb36TffbZp1nf5s2bS++PPvroPPPMM0n+9Ky8/v37NxuzadOmXHDBBXnqqadSXl6e7t275+tf/3rOOOOM0hy//e1vc+KJJ2bNmjXp3LlzDjvssDz00EPNdpydc845eeWVV/K5z30uL774Yg488MD87Gc/S/fu3d92veXl5fn617+eZcuWZfPmzenatWvOOuusfO5zn2s2/umnn86CBQuahWNvaNmyZX79619n5syZaWxsTKdOnXLIIYfk/vvvzwEHHFAaN3v27Jx11lkZNmxYWrRokeOOOy5XX311s7lmzpyZ8847L5s3b86gQYMyf/78Zs/P27BhQ84999z87ne/S9u2bdOvX7/8/Oc/b/bdvhPf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z6Rly5bZa6+93rL2t1pna3Tp0iXPPPPMVp8Hb5eddgAAAAAAwF90xx13pKKiIrvvvns+8pGP5JOf/GSmTJmSJGnbtm0+8IEPlMZWV1dn9erVpePnn38+p512Wvbff//sueeead++fZqamrJy5cokyZgxY/Lyyy9nv/32y2mnnZYf//jHef3115Mkjz32WDZu3JiePXumoqKi9LrvvvuyYsWKJMnLL7+c1q1bp6ysrLTmV7/61WbjV65c+ZbrbI02bdpk/fr1W30evF122gEAAAAAAH/RkUcemeuvvz677bZbunTpkvLy/4kVWrVq1WxsWVlZNm/eXDo+5ZRTsmbNmnzjG99I165d07p16wwaNKh0e80PfOADefLJJ/Pzn/88P/vZz/LpT386U6dOzX333Zempqa0bNky9fX1admyZbN1KioqkiSVlZVZv359NmzYkN122y1JcuaZZ+b4448vjX2j5jdb539/hrfy4osvpnPnzm97PGwtoR0AAAAAAPAXtWvXLj169NimcxcuXJjrrrsuRx99dJLk2WefTWNjY7Mxbdq0yahRozJq1Kj80z/9U3r37p3HHnss/fv3z8aNG7N69eocfvjhf3H+gw46KEnyxBNPlN537NgxHTt23GLsm61TV1f3tj/P448/nv79+7/t8bC1hHYAAAAAAMA7bv/998/NN9+cgw8+OP/93/+dyZMnp02bNqX+GTNmZOPGjRk4cGDatm2bWbNmpU2bNunatWs6deqUk08+OePHj8+0adPSv3//vPDCC5k3b1769euXY445Jp07d05dXV0WLFhQCu3+krdaJ/nTDronn3yyNP6N91VVVamqqiq133///bn00kvf4asE/8Mz7QAAAAAAgHfc9OnT89JLL6Wuri7jxo3L2Wefnb322qvU36FDh9xwww0ZPHhw+vXrl5///Of5P//n/6RTp05JkhtvvDHjx4/Pueeem169emX06NH55S9/mZqamtIckyZNyuzZs9+yjr+2zu23356TTjqpNP6EE05I//79881vfrPU9uCDD+YPf/hDPvGJT7wj1wb+krLNf36DWd4xQ4YMSbdu3XLTTTcVXQrxfQDAzsDf5wAAAO8+S5YsyYABA1JfX79Vt5p8p7z88svp1atXfvCDH2TQoEHbPM9f+xyf/OQnc+CBB+af//mft6dceEt22gEAAAAAAO9J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6tQpH/3oR7NixYpS/9NPP52ysrL84Ac/yBFHHJHdd989s2fPzsaNG/P5z3++dN4XvvCFbN68eYu6W7dunaqqqlRVVeWggw7K+eefn2effTYvvPBCkuT222/P8ccfn4kTJ6ZHjx454IADcuKJJ+YrX/nKdl97AIBdjdAOAAAA4E288sorGTBgQH7605/m8ccfz+mnn55x48Zl0aJFpTGTJ0/Offfdl5/85CeZO3du5s+fnyVLljSb57XXXsull16apUuX5rbbbsvTTz+dCRMmbLHelClTcu211+aBBx7Is88+m+OPPz5XXXVVvve97+WnP/1p5s6dm2uuuaY0ft26dfn85z+fxYsXZ968eWnRokU+/vGPZ9OmTc3mPf/88/PZz342DQ0NGTFiRKZNm5YZM2bku9/9bhYsWJAXX3wxP/7xj9/yWjQ1NWXWrFnp0aNHOnXqlCSpqqrKQw89lGeeeWZrLy0AAP9LedEFAAAAABTljjvuSEVFRbO2jRs3lt6///3vz3nnnVc6/sxnPpN77rknP/zhD3PooYemqakp06dPz6xZszJs2LAkycyZM7PPPvs0m/Mf//EfS+/322+/XH311TnkkEPS1NTUbP3LLrssgwcPTpJMnDgxF1xwQVasWJH99tsvSfKJT3wiv/jFL/LFL34xSXLcccc1W+e73/1uOnfunCeeeCJ9+vQptZ9zzjk59thjS8dXXXVVLrjgglLbN7/5zdxzzz1veX3WrVuX6urq3HHHHWnR4k//H/jFF1+cY489Nt26dUvPnj0zaNCgHH300fnEJz5RGgMAwNvj354AAACAXdaRRx6ZRx99tNnrO9/5Tql/48aNufTSS9O3b9907NgxFRUVueeee7Jy5cokyYoVK7Jhw4YMHDiwdE7Hjh3Tq1evZuvU19dn1KhRqampyR577JEjjjgiSUrzvKFfv36l93vvvXfatm1bCuzeaPvz22ouX748J554Yvbbb7+0b98+3bp1+4vzHnzwwaX3f/jDH/Lcc881q7m8vLzZmL90fRYtWpQRI0bkIx/5SGlnXXV1dR588ME89thj+exnP5vXX389p5xySkaOHLnFbj8AAN6anXYAAADALqtdu3bp0aNHs7bf/va3pfdTp07NN77xjVx11VXp27dv2rVrl3POOScbNmx422usW7cuI0aMyIgRIzJ79ux07tw5K1euzIgRI7aYp1WrVqX3ZWVlzY7faPvzMGzUqFHp2rVrbrjhhnTp0iWbNm1Knz59tpi3Xbt2b7ve/33en1+f73znO9lzzz1zww035LLLLiu19+nTJ3369MmnP/3pnHnmmTn88MNz33335cgjj9ymdQEAdkV22gEAAAC8iYULF+ZjH/tYxo4dmwMPPDD77bdfli1bVurv3r17WrVqlYcffrjU9tJLLzUb8+tf/zpr1qzJ1772tRx++OHp3bt3s91y22rNmjV58skn8+UvfznDhg1LbW1tXnrppb963p577pnq6upmNb/++uupr6//q+eWlZWlRYsWefnll990zAc/+MEkfworAQB4++y0AwAAAHgT+++/f+bMmZMHHngg73vf+3LFFVfk+eefLwVTFRUVmThxYiZPnpxOnTplr732ype+9KVmz3OrqanJbrvtlmuuuSZnnnlmHn/88Vx66aXbXdv73ve+dOrUKd/+9rdTXV2dlStX5vzzz39b5372s5/N1772tey///7p3bt3rrjiiqxdu3aLca+++mpWrVqV5E9h5LXXXpumpqaMGjUqSfKpT30qXbp0yVFHHZV99tknzz33XC677LJ07tw5gwYN2u7PCACwK7HTDgAAAOBNfPnLX05dXV1GjBiRoUOHpqqqKqNHj242ZurUqTn88MMzatSoDB8+PIcddlgGDBhQ6u/cuXNmzJiRH/3oR/ngBz+Yr33ta7n88su3u7YWLVrklltuSX19ffr06ZPPfe5zmTp16ts699xzz824ceNyyimnZNCgQdljjz3y8Y9/fItxd999d6qrq1NdXZ2BAwfml7/8ZX70ox9l6NChSZLhw4fnoYceypgxY9KzZ88cd9xx2X333TNv3rx06tRpuz8jAMCupGzz5s2biy5iZzRkyJB069YtN910U9GlEN8HAOxoS5YsyYABA1JfX5+6urqiywEAAICt4nct7wZ22gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQMKEdAAAAAAAAFExoBwAAAAAAAAUT2gEAAAAAAEDBhHYAAAAAAABQ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wC6uRdEFAAAAAAAAwK5OaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2AAAAAAAAUDChHQAAAAAAABRMaAcAAAAAAAAFE9oBAAAAAABAwYR2O5mhQ4fmnHPOKbqMrTJhwoSMHj266DIAAAAAAAAKI7QrwJuFVPPnz09ZWVnWrl37N6/p3WTChAkpKysrvTp16pSRI0fmV7/6VbNxN9xwQw488MBUVFSkQ4cO6d+/f/71X/+1oKoBAAAAAAC2ndCOv5nXXnvtbY8dOXJknnvuuTz33HOZN29eysvL89GPfrTU/93vfjfnnHNOzj777Dz66KNZuHBhvvCFL6SpqWlHlA4AAAAAALBDCe3epdasWZMTTzwx73//+9O2bdv07ds33//+95uNWbduXcaPH5+KiopUV1dn2rRpW8xz88035+CDD84ee+yRqqqqnHTSSVm9enWp/43dfffcc0/69++fNm3a5Kijjsrq1atz1113pba2Nu3bt89JJ52U9evXl867++67c9hhh6VDhw7p1KlTPvrRj2bFihWl/qeffjplZWX5wQ9+kCOOOCK77757Zs+enY0bN+bzn/986bwvfOEL2bx58xZ1t27dOlVVVamqqspBBx2U888/P88++2xeeOGFJMntt9+e448/PhMnTkyPHj1ywAEH5MQTT8xXvvKV7b72AAAAAAAAf2tCu3epV155JQMGDMhPf/rTPP744zn99NMzbty4LFq0qDRm8uTJue+++/KTn/wkc+fOzfz587NkyZJm87z22mu59NJLs3Tp0tx22215+umnM2HChC3WmzJlSq699to88MADefbZZ3P88cfnqquuyve+97389Kc/zdy5c3PNNdeUxq9bty6f//zns3jx4sybNy8tWrTIxz/+8WzatKnZvOeff34++9nPpqGhISNGjMi0adMyY8aMfPe7382CBQvy4osv5sc//vFbXoumpqbMmjUrPXr0SKdOnZIkVVVVeeihh/LMM89s7aUFAAAAAAB41ykvuoBd1R133JGKiopmbRs3biy9f//735/zzjuvdPyZz3wm99xzT374wx/m0EMPTVNTU6ZPn55Zs2Zl2LBhSZKZM2dmn332aTbnP/7jP5be77fffrn66qtzyCGHpKmpqdn6l112WQYPHpwkmThxYi644IKsWLEi++23X5LkE5/4RH7xi1/ki1/8YpLkuOOOa7bOd7/73XTu3DlPPPFE+vTpU2o/55xzcuyxx5aOr7rqqlxwwQWltm9+85u555573vL6rFu3LtXV1bnjjjvSosWfcuaLL744xx57bLp165aePXtm0KBBOfroo/OJT3yiNAYAAAAAAOC9QrpRkCOPPDKPPvpos9d3vvOdUv/GjRtz6aWXpm/fvunYsWMqKipyzz33ZOXKlUmSFStWZMOGDRk4cGDpnI4dO6ZXr17N1qmvr8+oUaNSU1OTPfbYI0cccUSSlOZ5Q79+/Urv995777Rt27YU2L3R9ue31Vy+fHlOPPHE7Lfffmnfvn26dev2F+c9+OCDS+//8Ic/5LnnnmtWc3l5ebMxf+n6LFq0KCNGjMhHPvKR0s666urqPPjgg3nsscfy2c9+Nq+//npOOeWUjBw5covdfgAAAAAAAO92dtoVpF27dunRo0eztt/+9rel91OnTs03vvGNXHXVVenbt2/atWuXc845Jxs2bHjba6xbty4jRozIiBEjMnv27HTu3DkrV67MiBEjtpinVatWpfdlZWXNjt9o+/MwbNSoUenatWtuuOGGdOnSJZs2bUqfPn22mLddu3Zvu97/fd6fX5/vfOc72XPPPXPDDTfksssuK7X36dMnffr0yac//emceeaZOfzww3PfffflyCOP3KZ1AQAAAAAAimCn3bvUwoUL87GPfSxjx47NgQcemP322y/Lli0r9Xfv3j2tWrXKww8/XGp76aWXmo359a9/nTVr1uRrX/taDj/88PTu3bvZbrlttWbNmjz55JP58pe/nGHDhqW2tjYvvfTSXz1vzz33THV1dbOaX3/99dTX1//Vc8vKytKiRYu8/PLLbzrmgx/8YJI/hZUAAAAAAADvJXbavUvtv//+mTNnTh544IG8733vyxVXXJHnn3++FExVVFRk4sSJmTx5cjp16pS99torX/rSl5o9z62mpia77bZbrrnmmpx55pl5/PHHc+mll253be973/vSqVOnfPvb3051dXVWrlyZ888//22d+9nPfjZf+9rXsv/++6d379654oorsnbt2i3Gvfrqq1m1alWSP4WR1157bZqamjJq1Kgkyac+9al0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wZ8HAAAAAACAD88nJtqNHj06jz32WK655prMmzcv06ZNy1577ZVly5YVPVqZGTNmZMGCBRk9enTZ+sUXX5xx48alXbu//UhWrFiR/fffPz/4wQ/Wef9ddtkl2223XaZOnVq2/o1vfCMXX3zxxg0PAAAAAADAh+ITEe1effXVTJ8+Peecc06GDx+e3r17Z/fdd8+pp56aL3/5y6Vjxo8fnx49eqShoSFJMm/evPfc9+qrr05dXV06deqUHXfcMZdffnnZ688//3wOO+ywbLHFFunSpUsGDx6chx9+OFOmTMmZZ56Zxx9/PBUVFamoqMiUKVOSJDfeeGNGjhyZTp06lfZZunRp7rvvvhx00EFl+x9//PE55ZRTsscee6zX93HQQQflxhtvXGtt1qxZWbBgwXrtBQAAAAAAwIevsugBPghdu3ZN165dc9ttt2WPPfZIx44d1zrmkEMOSefOnXPHHXfk+eefz1e/+tV861vfyr777psttthireOvu+66nHHGGbn00kszcODAPPbYY2lsbEyXLl1y1FFHpbW1NcOGDcunP/3pTJs2LTU1NZkzZ07a2tpy6KGH5sknn8ydd96Ze+65J0nSrVu3JMn06dNz+OGHl51rxowZqaqqSl1d3Qfyfey+++4566yzsmrVqtJ3UVtbm549e2b69OnZbrvtPpDzAAAAAAAA8MH4RES7ysrKTJkyJY2NjbniiitSX1+fYcOGZcyYMenfv39mzJiRRx55JC+99FI6duxYugXlpz71qdx888055phj1tpzwoQJOf/883PwwQcnSfr27Zunn346V155ZY466qhcf/31Wbp0aR599NFS9OvXr1/p/V27dk1lZWVqamrK9l24cGF69eq11lrPnj3Lbo25MXr16pU33ngjzc3N6d27d9n6woULP5BzAAAAAAAA8MH5RES75O1n2h144IGZPn16Hnroodxxxx0599xzc/XVV2f58uVpbW3NlltumSRpa2tLkrzwwgvveLvI5cuXZ8GCBTn66KPT2NhYWn/rrbdKV8zNnTs3AwcOfMer9N7L66+/XnZrzHdb2xidO3dO8vYz8f5+/e/XAAAAAAAAKN4nJtolSadOnTJy5MiMHDkyp59+esaPH58JEybkO9/5Trbeeuvcf//9SZKnnnoqo0aNyq233prPfe5za+3T2tqaJPnFL36RIUOGlL3Wvn37JH8LY+ururo6r7zyyvuubYyXX345SdKjR4+11v9+DQAAAAAAgOJ9MPdj/Ae10047Zfny5amvr09zc3MqKyvTr1+/bLPNNkmSbbbZJtXV1Wu9r2fPnunVq1eeffbZ9OvXr+xX3759kyT9+/fP3LlzS4Hs72222WZZvXr1WusDBw7M008/vdZac3PzBxbunnzyyXzmM58p+2wrV67MggULMnDgwA/kHAAAAAAAAHxwPhHRbtmyZdl7770zderU/P73v89zzz2Xm266Keeee26+8pWvZMSIERk6dGhGjRqVu+66Ky+88EKS5LLLLsusWbPecc8zzzwzZ599di6++OLMmzcvTzzxRCZPnpwLLrggSXLYYYelpqYmo0aNysyZM/Pss8/mlltuyYMPPpgk6dOnT5577rnMnTs3LS0tWbVqVZJkv/32y4wZM8rONXDgwFRXV2fmzJll683NzZk7d27mz5+fJHniiSfeMxT+1fTp07PvvvuWrT300EPp2LFjhg4dui5fKQAAAAAAAB+hT0S069q1a4YMGZILL7wwDQ0N2WWXXXL66aensbExl156aSoqKnL77benoaEh48aNy1e/+tUkyZIlS9KzZ8933HP8+PG5+uqrM3ny5Oy6664ZNmxYpkyZUrrSbrPNNstdd92VrbbaKgcccEB23XXX/PSnPy3dPnP06NHZf//9M3z48PTo0SM33HBDkuSII47IU089lWeeeaZ0rvbt22fcuHG57rrryma44oorMnDgwNJz9RoaGjJw4MBMmzat7LgJEyaUfr9y5crcdtttZc/iS5IbbrghRxxxRKqqqtb7+wUAAAAAAODDVbFmzZo1RQ/xUZszZ04GDRqU2bNnp76+/iM//0knnZS//OUvufLKK0trzc3N2XnnnTNnzpz07t17nfb56+eYMGFCJk6cmCT5+c9/nl//+te56667Sse1tLRkhx12yKxZs0rRcVPT0NCQPn365Nprry16FABgA/nvcwAAgE2Tfw+yqfhEXGn3cfPDH/4wvXv3TltbW2mtpqYmkyZNyqJFi9Z5nwULFiRJvvSlL5XWOnTokEsuuaTsuD/96U+5/PLLN9lgBwAAAAAA8I+usugBNkXdu3fPD37wg7XWR40atV77bLfddkmSdu3+1l7Hjx+/1nGDBw/O4MGD129IAAAAAAAAPjKutAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAglUWPUCRmpqaih5ho3zc5wcAAAAAAOBtm2S0q66uTlVVVcaOHVv0KButqqoq1dXVRY8BAAAAAADARtgko11tbW2amprS0tJS9Cgbrbq6OrW1tUWPAQAAAAAAwEbYJKNd8na4E7sAAAAAAAD4R9Cu6AEAAAAAAABgUyfaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABSssugBIEkWLVqUlpaWD23/1tbWLFu2LHPmzPnQzpEk1dXVqa2t/VDPAQAAAAAAfPKIdhRu0aJFqaury4oVKz7U8zz22GO5/fbbP9RzVFVVpampSbgDAAAAAADWi2hH4VpaWrJixYpMnTo1dXV1RY+zwZqamjJ27Ni0tLSIdgAAAAAAwHoR7fiHUVdXl/r6+qLHAAAAAAAA+Mi1K3oAAAAAAAAA2NSJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHf+QJk6cmAEDBnwk57r33ntTV1eX1atXl603NDTk+uuv36i999hjj9xyyy1la1dccUUOOuigjdoXAAAAAAD4ZBHt+FAsXbo03/72t1NbW5uOHTumpqYm++23X2bOnFnIPO8VAU8++eScdtppad++fWlt2rRpefHFFzNmzJjS2sqVK/Pd7343W265Zbp27ZrRo0fnxRdffM/znnbaaTnllFPS1tZWWvvmN7+ZOXPmZPr06Rv3oQAAAAAAgE8M0Y4PxejRo/PYY4/lmmuuybx58zJt2rTstddeWbZsWdGjlZkxY0YWLFiQ0aNHl61ffPHFGTduXNq1+9t/RE444YT813/9V2666ab89re/zQsvvJCDDz74Pff/4he/mNdeey133HFHaW2zzTbL4YcfnosvvviD/TAAAAAAAMDHlmjHB+7VV1/N9OnTc84552T48OHp3bt3dt9995x66qn58pe/XDpm/Pjx6dGjRxoaGpIk8+bNe899r7766tTV1aVTp07Zcccdc/nll5e9/vzzz+ewww7LFltskS5dumTw4MF5+OGHM2XKlJx55pl5/PHHU1FRkYqKikyZMiVJcuONN2bkyJHp1KlTaZ+lS5fmvvvuK7uF5Z///OdMmjQpF1xwQfbee+8MGjQokydPzgMPPJCHHnroXWdu3759DjjggNx4441l6wcddFCmTZuW119//f2/UAAAAAAA4BNPtOMD17Vr13Tt2jW33XZbVq1a9Y7HHHLIIXnppZdyxx13ZOrUqUmSb33rW3n55Zff8fjrrrsuZ5xxRs4666w0NTXlJz/5SU4//fRcc801SZLW1tYMGzYsixcvzrRp0/L444/n5JNPTltbWw499NB873vfy84775wlS5ZkyZIlOfTQQ5Mk06dPz+DBg8vONWPGjFRVVaWurq60Nnv27Lz55psZMWJEaW3HHXdMbW1tHnzwwff8Pnbfffe1boU5ePDgvPXWW3n44Yff870AAAAAAMCmobLoAfjkqayszJQpU9LY2Jgrrrgi9fX1GTZsWMaMGZP+/ftnxowZeeSRR/LSSy+lY8eOpVtQfupTn8rNN9+cY445Zq09J0yYkPPPP790O8q+ffvm6aefzpVXXpmjjjoq119/fZYuXZpHH300W2yxRZKkX79+pfd37do1lZWVqampKdt34cKF6dWr11prPXv2LLs1ZnNzczbbbLN079697NiePXumubn5Pb+PXr165X//93/T1tZW2rOqqirdunXLwoUL3/O9AAAAAADApkG040MxevToHHjggZk+fXoeeuih3HHHHTn33HNz9dVXZ/ny5Wltbc2WW26ZJGlra0uSvPDCC1mwYMFaey1fvjwLFizI0UcfncbGxtL6W2+9lW7duiVJ5s6dm4EDB5aC3bp6/fXXy26N+W5rG6Nz585pa2vLqlWr0rlz57L1FStWfGDnAQAAAAAAPr5EOz40nTp1ysiRIzNy5MicfvrpGT9+fCZMmJDvfOc72XrrrXP//fcnSZ566qmMGjUqt956az73uc+ttU9ra2uS5Be/+EWGDBlS9lr79u2TpCyGrY/q6uq88sor77tWU1OTN954I6+++mrZ1XYvvvjiWlfv/b2XX345Xbp0WWvGl19+OT169NiguQEAAAAAgE8Wz7TjI7PTTjtl+fLlqa+vT3NzcyorK9OvX79ss802SZJtttkm1dXVa72vZ8+e6dWrV5599tn069ev7Fffvn2TJP3798/cuXPf9Zl4m222WVavXr3W+sCBA/P000+vtdbc3FwW7gYNGpQOHTrk3nvvLa0988wzWbRoUYYOHfqen/vJJ5/MwIEDy9YWLFiQlStXrrUOAAAAAABsmkQ7PnDLli3L3nvvnalTp+b3v/99nnvuudx0000599xz85WvfCUjRozI0KFDM2rUqNx111154YUXkiSXXXZZZs2a9Y57nnnmmTn77LNz8cUXZ968eXniiScyefLkXHDBBUmSww47LDU1NRk1alRmzpyZZ599NrfccksefPDBJEmfPn3y3HPPZe7cuWlpacmqVauSJPvtt19mzJhRdq6BAwemuro6M2fOLK1169YtRx99dE488cT8z//8T2bPnp1x48Zl6NCh2WOPPd7z+5g+fXr23Xfftda23XbbbLfdduvxzQIAAAAAAJ9Uoh0fuK5du2bIkCG58MIL09DQkF122SWnn356Ghsbc+mll6aioiK33357GhoaMm7cuHz1q19NkixZsiQ9e/Z8xz3Hjx+f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v3798uSTT6axsTHLly/PeeedlyRZvXp1OnfunDFjxuSss856x/27dOmS4447Lv3790+XLl0yY8aMHHvssenSpUuOOeaY0nE777xz7rnnntKfKyvL/6fRgw8+mP333z+nnnpqLrnkklRWVubxxx9Pu3bt1nneDh065Otf/3rq6+vTvXv3PP7442lsbExbW1t+8pOflM71m9/8Jv3790+SLFu2LLvttlsOOeSQ0uvbb799Lr300my77bZ5/fXXc+GFF2bffffN/Pnz06NHjyTJEUcckSVLluTuu+/Om2++mXHjxuWYY47J9ddfnyS54447csQRR+SSSy7Jvvvum6ampjQ2NqZz58457rjjyj77M888k80337z056222qr0+w39+wMAAADAu6tYs2bNmqKHAACKU1FRkV//+tcZNWrU+x47ZsyYfPazn0379u1z2223Ze7cueu95+LFizNkyJD85je/yYEHHpjjjz8+xx9//Lue82c/+1l+/vOf59lnny1bnzNnTgYNGpRhw4bl/vvvf9/ZDz744HTp0iX/8R//keTtK9fe6zMkyR577JGRI0fmxz/+8fvu/37z/l8nnnhiHn300UyfPr30OWbPnp36+vokyUUXXZQzzjgjS5YsSZcuXd5xj7/85S/p1q1b7rnnnuyzzz5pamrKTjvtlEcffTSDBw9Oktx555054IAD8vzzz6dXr145/PDD8+abb+amm24q7XPJJZfk3HPPzaJFi1JRUZH7778/w4cPzyuvvJLu3bu/7+ddn78/G6uhoSF9+vTJtdde+6GfCwAAgH8c/j3IpsLtMQGAdTJ58uQ8++yzmTBhwgbv0dbWliOPPDInnXRSdt5553V6z5///OdsscUWG3zOJHnsscfywAMPZNiwYWXrf/zjH9OrV69su+22OeKII7Jo0aLSay+99FIefvjhbLXVVtlzzz3Ts2fPDBs2LDNmzNioeefPn58777xzrVn+r0mTJmXMmDHvGuzeeOONXHXVVenWrVt22223JG9fFdi9e/dSsEuSESNGpF27dqXbaK5atSqdOnUq26tz5855/vnns3DhwrL1AQMGZOutt87IkSMzc+bM9/zMAAAAAGw80Q4AeF9//OMfc8opp2Tq1Klr3UJyfZxzzjmprKzMv/zLv6zT8fPnz88ll1ySY489doPO95nPfCYdO3bM4MGD893vfjfjx48vvTZkyJBMmTIld955Z37+85/nueeeyxe+8IW89tprSVK6Um7ixIlpbGzMnXfemfr6+uyzzz754x//uN7z7rnnnunUqVM++9nP5gtf+EJ+9KMfveMejzzySJ588smyWf/qv//7v9O1a9d06tQpF154Ye6+++5UV1cnSZqbm8tuYZm8fbvPLbbYovQ8uv322y+33npr7r333rS1tWXevHk5//zzkyRLlixJkmy99da54oorcsstt+SWW27JNttsk7322itz5sx59y8aAAAAgI3mmXYAwHtavXp1Dj/88Jx55pnZfvvtN3if2bNn59///d8zZ86cVFRUvO/xixcvzv77759DDjkkjY2NG3TO6dOnp7W1NQ899FBOOeWU9OvXL4cddliS5Itf/GLpuP79+2fIkCHp3bt3fvWrX+Xoo49OW1tbkuTYY4/NuHHjkiQDBw7Mvffem1/+8pc5++yz12ve//zP/8xrr72Wxx9/PCeddFLOO++8nHzyyWsdN2nSpOy6667Zfffd13pt+PDhmTt3blpaWvKLX/wiX/va10pXA66LxsbGLFiwIF/60pfy5ptvZvPNN8+//uu/ZuLEiaXn9O2www7ZYYcdSu/Zc889s2DBglx44YWlW4sCAAAA8MFzpR0A8J5ee+21zJo1K8cdd1wqKytTWVmZH/3oR3n88cdTWVmZ++67b532mT59el566aXU1taW9lm4cGG+973vpU+fPmXHvvDCCxk+fHj23HPPXHXVVRs8e9++fbPrrrumsbExJ5xwQiZOnPiux3bv3j3bb7995s+fn+TtK86SZKeddio7rq6uruw2mus67zbbbJOddtophx12WH76059m4sSJWb16ddkxy5cvz4033pijjz76Hffo0qVL+vXrlz322COTJk1KZWVlJk2alCSpqanJSy+9VHb8W2+9lZdffjk1NTVJ3n7+3DnnnJPW1tYsXLgwzc3NpTi47bbbvut3s/vuu5e+FwAAAAA+HK60AwDe0+abb54nnniibO3yyy/Pfffdl5tvvjl9+/Zdp32OPPLIjBgxomxtv/32y5FHHlm6ki15+4q14cOHZ9CgQZk8eXLpCrCN1dbWllWrVr3r662trVmwYEGOPPLIJEmfPn3Sq1evPPPMM2XHzZs3r+wqvQ2Zt62tLW+++Wbpar6/uummm7Jq1aqMHTt2vT/T0KFD8+qrr2b27NkZNGhQkuS+++5LW1tbhgwZUva+9u3b59Of/nSS5IYbbsjQoUPTo0ePdz3P3LlzSxETAAAAgA+HaAcAm6DW1tayK6eee+65zJ07N1tssUVqa2tz6qmnZvHixbn22mvTrl277LLLLmXv32qrrdKpU6ey9ffbc8stt8yWW25Ztk+HDh1SU1NTuh3j4sWLs9dee6V3794577zzsnTp0tKxf71aLEmefvrpUkxrbW3N3LlzkyQDBgxIklx22WWpra3NjjvumCT53e9+l/POO6/sWXrf//73c9BBB6V379554YUXMmHChLRv3750+8yKioqcdNJJmTBhQnbbbbcMGDAg11xzTf7whz/k5ptvXud5r7vuunTo0CG77rprOnbsmFmzZuXUU0/NoYcemg4dOpR9H5MmTcqoUaPW+p6WL1+es846K1/+8pez9dZbp6WlJZdddlkWL16cQw45JMnbVwDuv//+aWxszBVXXJE333wzxx13XMaMGZNevXolSVpaWnLzzTdnr732ysqVKzN58uTcdNNN+e1vf1s610UXXZS+fftm5513zsqVK3P11Vfnvvvuy1133bXOP2sAAAAA1p9oBwCboFmzZmX48OGlP5944olJkqOOOipTpkzJkiVL1roF5MbuuS7uvvvuzJ8/P/Pnz89nPvOZstfWrFlT+v0BBxyQhQsXJnn7WXkDBw4sO6atrS2nnnpqnnvuuVRWVma77bbLOeeck2OPPba0x/PPP5/DDjssy5YtS48ePfL5z38+Dz30UNkVZ8cff3xWrlyZE044IS+//HJ222233H333dluu+3Wed7Kysqcc845mTdvXtasWZPevXvnuOOOywknnFB2/J/+9KfMmDGjLI79Vfv27fOHP/wh11xzTVpaWrLlllvmn//5nzN9+vTsvPPOpeOuu+66HHfccdlnn33Srl27jB49OhdffHHZXtdcc02+//3vZ82aNRk6dGjuv//+sufnvfHGG/ne976XxYsXp6qqKv37988999xT9rP9IH7WAAAAAJSrWPN//y9gAAAfE3PmzMmgQYMye/bs1NfXFz3OBvukfI6PQkNDQ/r06ZNrr7226FEAAAD4CPn3IJuKD+YhMQAAAAAAAMAGE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABSssugBAAA2RlNTU9EjbJSP+/wAAAAAfDBEOwDgY6m6ujpVVVUZO3Zs0aNstKqqqlRXVxc9BgAAAAAFEu0AgI+l2traNDU1paWlpehRNlp1dXVqa2uLHgMAAACAAol2AMDHVm1trdgFAAAAwCdCu6IHAAAAAAAAgE2daAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQsMqiBwAA4JNh0aJFaWlp+dD2b21tzbJlyzJnzpwP7RxJUl1dndra2g/1HAAAAAB/T7QDAGCjLVq0KHV1dVmxYsWHep7HHnsst99++4d6jqqqqjQ1NQl3AAAAwEdKtAMAYKO1tLRkxYoVmTp1aurq6ooeZ4M1NTVl7NixaWlpEe0AAACAj5RoBwDAB6auri719fVFjwEAAADwsdOu6AEAAAAAAABgUyfaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAB8KCZOnJgBAwZ8JOe69957U1dXl9WrV5etNzQ05Prrr9+ovceMGZPzzz+/bO3OO+/MgAED0tbWtlF7AwAAAPyVaAcAwDtaunRpvv3tb6e2tjYdO3ZMTU1N9ttvv8ycObOQed4rAp588sk57bTT0r59+9LatGnT8uKLL2bMmDGltauuuip77bVXNt9881RUVOTVV1993/OedtppOeuss/LnP/+5tLb//vunQ4cOue666zb48wAAAAD8X6IdAADvaPTo0XnsscdyzTXXZN68eZk2bVr22muvLFu2rOjRysyYMSMLFizI6NGjy9YvvvjijBs3Lu3a/e1/8q5YsSL7779/fvCDH6zz/rvssku22267TJ06tWz9G9/4Ri6++OKNGx4AAADg/yfaAQCwlldffTXTp0/POeeck+HDh6d3797Zfffdc+qpp+bLX/5y6Zjx48enR48eaWhoSJLMmzfvPfe9+uqrU1dXl06dOmXHHXfM5ZdfXvb6888/n8MOOyxbbLFFunTpksGDB+fhhx/OlClTcuaZZ+bxxx9PRUVFKioqMmXKlCTJjTfemJEjR6ZTp06lfZYuXZr77rsvBx10UNn+xx9/fE455ZTsscce6/V9HHTQQbnxxhvXWps1a1YWLFiwXnsBAAAAvJPKogcAAOAfT9euXdO1a9fcdttt2WOPPdKxY8e1jjnkkEPSuXPn3HHHHXn++efz1a9+Nd/61rey7777Zosttljr+Ouuuy5nnHFGLr300gwcODCPPfZYGhsb06VLlxx11FFpbW3NsGHD8ulPfzrTpk1LTU1N5syZk7a2thx66KF58sknc+edd+aee+5JknTr1i1JMn369Bx++OFl55oxY0aqqqpSV1f3gXwfu+++e84666ysWrWq9F3U1tamZ8+emT59erbbbrsP5DwAAADApku0AwBgLZWVlZkyZUoaGxtzxRVXpL6+PsOGDcuYMWPSv3//zJgxI4888kheeumldOzYsXQLyk996lO5+eabc8wxx6y154QJE3L++efn4IMPTpL07ds3Tz/9dK688socddRRuf7667N06dI8+uijpejXr1+/0vu7du2aysrK1NTUlO27cOHC9OrVa621nj17lt0ac2P06tUrb7zxRpqbm9O7d++y9YULF34g5wAAAAA2baIdAADvaPTo0TnwwAMzffr0PPTQQ7njjjty7rnn5uqrr87y5cvT2tqaLbfcMknS1taWJHnhhRfe8XaRy5cvz4IFC3L00UensbGxtP7WW2+VrpibO3duBg4c+I5X6b2X119/vezWmO+2tjE6d+6c5O1n4v39+t+vAQAAAGwI0Q4AgHfVqVOnjBw5MiNHjszpp5+e8ePHZ8KECfnOd76TrbfeOvfff3+S5KmnnsqoUaNy66235nOf+9xa+7S2tiZJfvGLX2TIkCFlr7Vv3z7J38LY+qqurs4rr7zyvmsb4+WXX06S9OjRY631v18DAAAA2BAfzP2CAADYJOy0005Zvnx56uvr09zcnMrKyvTr1y/bbLNNkmSbbbZJdXX1Wu/r2bNnevXqlWeffTb9+vUr+9W3b98kSf/+/TN37txSIPt7m222WVavXr3W+sCBA/P000+vtdbc3PyBhbsnn3wyn/nMZ8o+28qVK7NgwYIMHDjwAzkHAAAAsGkT7QAAWMuyZcuy9957Z+rUqfn973+f5557LjfddFPOPffcfOUrX8mIESMydOjQjBo1KnfddVdeeOGFJMlll12WWbNmveOeZ555Zs4+++xcfPHFmTdvXp544olMnjw5F1xwQZLksMMOS01NTUaNGpWZM2fm2WefzS233JIHH3wwSdKnT58899xzmTt3blpaWrJq1aokyX777ZcZM2aUnWvgwIGprq7OzJkzy9abm5szd+7czJ8/P0nyxBNPvGco/Kvp06dn3333LVt76KGH0rFjxwwdOnRdvlIAAACA9yTaAQCwlq5du2bIkCG58MIL09DQkF122SWnn356Ghsbc+mll6aioiK33357GhoaMm7cuHz1q19NkixZsiQ9e/Z8xz3Hjx+fq6++OpMnT86uu+6aYcOGZcqUKaUr7TbbbLPcdddd2WqrrXLAAQdk1113zU9/+tPS7TNHjx6d/fffP8OHD0+PHj1yww03JEmOOOKIPPXUU3nmmWdK52rfvn3GjRuX6667rmyGK664IgMHDiw9V6+hoSEDBw7MtGnTyo6bMGFC6fcrV67MbbfdVvYsviS54YYbcsQRR6Sqqmq9v18AAACAv1exZs2aNUUPAQDAx9ucOXMyaNCgzJ49O/X19R/5+U866aT85S9/yZVXXllaa25uzs4775w5c+akd+/e67TPXz/HhAkTMnHixCTJz3/+8/z617/OXXfdVTqupaUlO+ywQ2bNmlWKjgAAAHw4Ghoa0qdPn1x77bVFjwIfKlfaAQDwsffDH/4wvXv3TltbW2mtpqYmkyZNyqJFi9Z5nwULFiRJvvSlL5XWOnTokEsuuaTsuD/96U+5/PLLBTsAAADgA1NZ9AAAALCxunfvnh/84AdrrY8aNWq99tluu+2SJO3a/e3/t238+PFrHTd48OAMHjx4/YYEAAAAeA+utAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAglUWPQAAAJ8cTU1NRY+wUT7u8wMAAAAfX6IdAAAbrbq6OlVVVRk7dmzRo2y0qqqqVFdXFz0GAAAAsIkR7QAA2Gi1tbVpampKS0tL0aNstOrq6tTW1hY9BgAAALCJEe0AAPhA1NbWil0AAAAAG6hd0QMAAAAAAADApk60AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAACiYaAcAAAAAAAAFE+0AAAAAAACgYKIdAAAAAAAAFEy0AwAAAAAAgIKJdgAAAAAAAFAw0Q4AAAAAAAAKJtoBAAAAAABAwUQ7AAAAAAAAKJhoBwAAAAAAAAUT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAAAChYZdEDAAAAAAAAH1+LFi1KS0vLh7Z/a2trli1bljlz5nxo50iS6urq1NbWfqjngPdSsWbNmjVFDwEAAAAAAHz8LFq0KHV1dVmxYkXRo2y0qqqqNDU1CXcUxpV2AAAAAADABmlpacmKFSsyderU1NXVFT3OBmtqasrYsWPT0tIi2lEY0Q4AAAAAANgodXV1qa+vL3oM+FhrV/QAAAAAAAAAsKkT7QAAAAAAAKBgoh0AAAAAAAAUTLQDAAAAAACAgol2AAAAAAAAUDDRDgAAAAAAAAom2gEAAAAAAEDBRDsAAAAAAAAomGgHAAAAAAAABRPtAAAAAAAAoGCiHQAAAAAAABRMtAMAAAAAAICCiXYAAAAAAABQMNEOAAAAAAAACibaAQAAAAAAQMFEOwAAAAAA4AMzceLEDBgw4CM517333pu6urqsXr26bL2hoSHXX3/9Ru29xx575JZbbilbu+KKK3LQQQdt1L7wbkQ7AAAAAACgZOnSpfn2t7+d2tradOzYMTU1Ndlvv/0yc+bMQuZ5rwh48skn57TTTkv79u1La9OmTcuLL76YMWPGlNZWrlyZ7373u9lyyy3TtWvXjB49Oi+++OJ7nve0007LKaeckra2ttLaN7/5zcyZMyfTp0/fuA8F70C0AwAAAAAASkaPHp3HHnss11xzTebNm5dp06Zlr732yrJly4oercyMGTOyYMGCjB49umz94osvzrhx49Ku3d8SyAknnJD/+q//yk033ZTf/va3eeGFF3LwwQe/5/5f/OIX89prr+WOO+4orW222WY5/PDDc/HFF3+wHwYi2gEAAAAAAP+/V199NdOnT88555yT4cOHp3fv3tl9991z6qmn5stf/nLpmPHjx6dHjx5paGhIksybN+8997366qtTV1eXTp06Zccdd8zll19e9vrzzz+fww47LFtssUW6dOmSwYMH5+GHH86UKVNy5pln5vHHH09FRUUqKioyZcqUJMmNN96YkSNHplOnTqV9li5dmvvuu6/sFpZ//vOfM2nSpFxwwQXZe++9M2jQoEyePDkPPPBAHnrooXeduX379jnggANy4403lq0fdNBBmTZtWl5//fX3/0JhPYh2AAAAAABAkqRr167p2rVrbrvttqxateodjznkkEPy0ksv5Y477sjUqVOTJN/61rfy8ssvv+Px1113Xc4444ycddZZaWpqyk9+8pOcfvrpueaaa5Ikra2tGTZsWBYvXpxp06bl8ccfz8knn5y2trYceuih+d73vpedd945S5YsyZIlS3LooYcmSaZPn57BgweXnWvGjBmpqqpKXV1daW327Nl58803M2LEiNLajjvumNra2jz44IPv+X3svvvua90Kc/DgwXnrrbfy8MMPv+d7YX1VFj0AAAAAAADwj6GysjJTpkxJY2NjrrjiitTX12fYsGEZM2ZM+vfvnxkzZuSRRx7JSy+9lI4dO5ZuQfmpT30qN998c4455pi19pwwYULOP//80u0o+/btm6effjpXXnlljjrqqFx//fVZunRpHn300WyxxRZJkn79+pXe37Vr11RWVqampqZs34ULF6ZXr15rrfXs2bPs1pjNzc3ZbLPN0r1797Jje/bsmebm5vf8Pnr16pX//d//TVtbW2nPqqqqdOvWLQsXLnzP98L6Eu0AAAAAAICS0aNH58ADD8z06dPz0EMP5Y477si5556bq6++OsuXL09ra2u23HLLJElbW1uS5IUXXsiCBQvW2mv58uVZsGBBjj766DQ2NpbW33rrrXTr1i1JMnfu3AwcOLAU7NbV66+/XnZrzHdb2xidO3dOW1tbVq1alc6dO5etr1ix4gM7DySiHQAAAAAA8Hc6deqUkSNHZuTIkTn99NMzfvz4TJgwId/5zney9dZb5/7770+SPPXUUxk1alRuvfXWfO5zn1trn9bW1iTJL37xiwwZMqTstfbt2ydJWQxbH9XV1XnllVfed62mpiZvvPFGXn311bKr7V588cW1rt77ey+//HK6dOmy1owvv/xyevTosUFzw7vxTDsAAAAAAOA97bTTTlm+fHnq6+vT3NycysrK9OvXL9tss02SZJtttkl1dfVa7+vZs2d69eqVZ599Nv369Sv71bdv3yRJ//79M3fu3Hd9Jt5mm22W1atXr7U+cODAPP3002utNTc3l4W7QYMGpUOHDrn33ntLa88880wWLVqUoUOHvufnfvLJJzNw4MCytQULFmTlypVrrcPGEu0AAAAAAIAkybJly7L33ntn6tSp+f3vf5/nnnsuN910U84999x85StfyYgRIzJ06NCMGjUqd911V1544YUkyWWXXZZZ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Nc+BBx5YNu+OO+6YLl265J/+6Z8yYsSIPPzww2V7vPzyyzniiCOy+eabp3v37jn66KPT2tpadsyvfvWrDBgwIFVVVendu3d+9rOflb1+//33rzVHRUVFmpubS8dszN8fAAAAAACAT6rK9X3D8uXLs9tuu+Wb3/xmDj744HV+36uvvpqvf/3r2WefffLiiy9u8J6//vWv89BDD6VXr15l63/4wx/S1taWK6+8Mv369cuTTz6ZxsbGLF++POedd16SZPXq1encuXPGjBmTs8466x3379KlS4477rj0798/Xbp0yYwZM3LsscemS5cuOeaYY0rH7bzzzrnnnntKf66sLP8qH3zwwey///459dRTc8kll6SysjKPP/542rVrt87zdujQIV//+tdTX1+f7t275/HHH09jY2Pa2tryk5/8pHSu3/zmN+nfv3+SZNmyZdltt91yyCGHlF7ffvvtc+mll2bbbbfN66+/ngsvvDD77rtv5s+fnx49eiRJjjjiiCxZsiR333133nzzzYwbNy7HHHNMrr/++iTJHXfckSOOOCKXXHJJ9t133zQ1NaWxsTGdO3fOcccdV/bZn3nmmWy++ealP2+11Val32/o3x8AAAAAAIBPsoo1a9as2eA3V1Tk17/+dUaNGvW+x44ZMyaf/exn0759+9x2222ZO3fueu+5ePHiDBkyJL/5zW9y4IEH5vjjj8/xxx//ruf82c9+lp///Od59tlny9bnzJmTQYMGZdiwYbn//vvfd/aDDz44Xbp0yX/8x38kefvKtff6DEmyxx57ZOTIkfnxj3/8vvu/37z/14knnphHH30006dPL32O2bNnp76+Pkly0UUX5YwzzsiSJUvSpUuXd9zjL3/5S7p165Z77rkn++yzT5qamrLTTjvl0UcfzeDBg5Mkd955Zw444IA8//zz6dWrVw4//PC8+eabuemmm0r7XHLJJTn33HOzaNGiVFRU5P7778/w4cPzyiuvpHv37u/7edfn7w8AAAAAAMAn2UfyTLvJkyfn2WefzYQJEzZ4j7a2thx55JE56aSTsvPOO6/Te/785z9niy222OBzJsljjz2WBx54IMOGDStb/+Mf/5hevXpl2223zRFHHJFFixaVXnvppZfy8MMPZ6uttsqee+6Znj17ZtiwYZkxY8ZGzTt//vzceeeda83yf02aNCljxox512D3xhtv5Kqrrkq3bt2y2267JXn7qsDu3buXgl2SjBgxIu3atSvdRnPVqlXp1KlT2V6dO3fO888/n4ULF5atDxgwIFtvvXVGjhyZmTNnvudnBgAAAAAA4COIdn/84x9zyimnZOrUqWvdQnJ9nHPOOamsrMy//Mu/rNPx8+fPzyWXXJJjjz12g873mc98Jh07dszgwYPz3e9+N+PHjy+9NmTIkEyZMiV33nlnfv7zn+e5557LF77whbz22mtJUrpSbuLEiWlsbMydd96Z+vr67LPPPvnjH/+43vPuueee6dSpUz772c/mC1/4Qn70ox+94x6PPPJInnzyybJZ/+q///u/07Vr13Tq1CkXXnhh7r777lRXVydJmpuby25hmbx9u88tttii9Dy6/fbbL7feemvuvffetLW1Zd68eTn//POTJEuWLEmSbL311rniiityyy235JZbbsk222yTvfbaK3PmzHn3LxoAAAAAAID1f6bd+li9enUOP/zwnHnmmdl+++03eJ/Zs2fn3//93zNnzpxUVFS87/GLFy/O/vvvn0MOOSSNjY0bdM7p06entbU1Dz30UE455ZT069cvhx12WJLki1/8Yum4/v37Z8iQIendu3d+9atf5eijj05bW1uS5Nhjj824ceOSJAMHDsy9996bX/7ylzn77LPXa97//M//zGuvvZbHH388J510Us4777ycfPLJax03adKk7Lrrrtl9993Xem348OGZO3duWlpa8otf/CJf+9rXSlcDrovGxsYsWLAgX/rSl/Lmm29m8803z7/+679m4sSJpef07bDDDtlhhx1K79lzzz2zYMGCXHjhhaVbiwIAAAAAALC2D/VKu9deey2zZs3Kcccdl8rKylRWVuZHP/pRHn/88VRWVua+++5bp32mT5+el156KbW1taV9Fi5cmO9973vp06dP2bEvvPBChg8fnj333DNXXXXVBs/et2/f7LrrrmlsbMwJJ5yQiRMnvuux3bt3z/bbb5/58+cnefuKsyTZaaedyo6rq6sru43mus67zTbbZKeddsphhx2Wn/70p5k4cWJWr15ddszy5ctz44035uijj37HPbp06ZJ+/fpljz32yKRJk1JZWZlJkyYlSWpqavLSSy+VHf/WW2/l5ZdfTk1NTZK3nz93zjnnpLW1NQsXLkxzc3MpDm677bbv+t3svvvupe8FAAAAAACAd/ahXmm3+eab54knnihbu/zyy3Pffffl5ptvTt++fddpnyOPPDIjRowoW9tvv/1y5JFHlq5kS96+Ym348OEZNGhQJk+eXLoCbGO1tbVl1apV7/p6a2trFixYkCOPPDJJ0qdPn/Tq1SvPPPNM2XHz5s0ru0pvQ+Zta2vLm2++Wbqa769uuummrFq1KmPHjl3vzzR06NC8+uqrmT17dgYNGpQkue+++9LW1pYhQ4aUva99+/b59Kc/nSS54YYbMnTo0PTo0eNdzzN37txSxAQAAAAAAOCdrXe0a21tLbty6rnnnsvcuXOzxRZbpLa2NqeeemoWL16ca6+9Nu3atcsuu+xS9v6tttoqnTp1Klt/vz233HLLbLnllmX7dOjQITU1NaXbMS5evDh77bVXevfunfPOOy9Lly4tHfvXq8WS5Omnny7FtNbW1sydOzdJMmDAgCTJZZddltra2uy4445Jkt/97nc577zzyp6l9/3vfz8HHXRQevfunRdeeCETJkxI+/btS7fPrKioyEknnZQJEyZkt912y4ABA3LNNdfkD3/4Q26++eZ1nve6665Lhw4dsuuuu6Zjx46ZNWtWTj311Bx66KHp0KFD2fcxadKkjBo1aq3vafny5TnrrLPy5S9/OVtvvXVaWlpy2WWXZfHixTnkkEOSvH0F4P7775/GxsZcccUVefPNN3PcccdlzJgx6dWrV5KkpaUlN998c/baa6+sXLkykydPzk033ZTf/va3pXNddNFF6du3b3beeeesXLkyV199de67777cdddd6/yzBgAAAAAA2BStd7SbNWtWhg8fXvrziSeemCQ56qijMmXKlCxZsmStW0Bu7J7r4u677878+fMzf/78fOYznyl7bc2aNaXfH3DAAVm4cGGSt5+VN3DgwLJj2tracuqpp+a5555LZWVltttuu5xzzjk59thjS3s8//zzOeyww7Js2bL06NEjn//85/PQQw+VXXF2/PHHZ+XKlTnhhBPy8ssvZ7fddsvdd9+d7bbbbp3nrayszDnnnJN58+ZlzZo16d27d4477riccMIJZcf/6U9/yowZM8ri2F+1b98+f/jDH3LNNdekpaUlW265Zf75n/8506dPz84771w67rrrrstxxx2XffbZJ+3atcvo0aNz8cUXl+11zTXX5Pvf/37WrFmToUOH5v777y97ft4bb7yR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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "Circuit(exp).decomp().to_dual_rail().draw()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, "id": "0406fa28", "metadata": {}, "outputs": [], @@ -193,19 +128,10 @@ "orig_f_exp = lambda xs: to_float(exp.lambdify(*free_syms)(*xs).eval().array.item())\n", "\n", "def d_f_exp(xs):\n", - " #path_exp.grad(list(free_syms)[0]).draw()#.lambdify(*free_syms)(*xs).draw()\n", " return [\n", " path_exp.grad(s).lambdify(*free_syms)(*xs).eval().tensor.array\n", " for s in free_syms\n", - " ]\n", - "\n", - "# def d_f_exp(xs):\n", - "# grads = [path_exp.grad(s) for s in free_syms]\n", - "# vals = [0] * len(grads)\n", - "# for i, g in enumerate(grads):\n", - "# for term in g.lambdify(*free_syms)(*xs).terms:\n", - "# vals[i] += to_float(term.eval().tensor.array)\n", - "# return vals" + " ]" ] }, { @@ -218,7 +144,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "41ea980c-40c4-4bd2-8731-fc84fb110f41", "metadata": {}, "outputs": [], @@ -236,14 +162,12 @@ " orig_fx = orig_f_exp(x)\n", " fx = f_exp(x)\n", " dfx = d_f_exp(x)\n", - " print(orig_fx)\n", " # verifies that the conversion is correct\n", " assert abs(orig_fx - fx) < 1e-10\n", "\n", " xs.append(x[::])\n", " fxs.append(fx)\n", " dfxs.append(dfx)\n", - " # print(x, fx, dfx)\n", " for i, dfxx in enumerate(dfx):\n", " x[i] = to_float(x[i] - 0.01 * dfxx)\n", " xs.append(x[::])\n", @@ -253,7 +177,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 10, "id": "cd5e3e93-5d75-415d-bbcc-14022c9ecf97", "metadata": { "scrolled": true @@ -263,43 +187,287 @@ "name": "stderr", "output_type": "stream", "text": [ - " 0%| | 0/20 [00:00" - ] - }, - "metadata": {}, - "output_type": "display_data" + "name": "stdout", + "output_type": "stream", + "text": [ + "0.8385254915624215\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 10%|█ | 2/20 [00:04<00:38, 2.16s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.7711039313289111\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 15%|█▌ | 3/20 [00:06<00:36, 2.15s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.6787280203868928\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 20%|██ | 4/20 [00:08<00:33, 2.09s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.561851722253541\n" + ] }, { "name": "stderr", "output_type": "stream", "text": [ - " 0%| | 0/20 [00:02 \u001b[39m\u001b[32m1\u001b[39m \u001b[43moptimize\u001b[49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[32;43m0.1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[32;43m0.2\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[12]\u001b[39m\u001b[32m, line 13\u001b[39m, in \u001b[36moptimize\u001b[39m\u001b[34m(x0)\u001b[39m\n\u001b[32m 11\u001b[39m orig_fx = orig_f_exp(x)\n\u001b[32m 12\u001b[39m fx = f_exp(x)\n\u001b[32m---> \u001b[39m\u001b[32m13\u001b[39m dfx = \u001b[43md_f_exp\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 14\u001b[39m \u001b[38;5;28mprint\u001b[39m(orig_fx)\n\u001b[32m 15\u001b[39m \u001b[38;5;66;03m# verifies that the conversion is correct\u001b[39;00m\n", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[11]\u001b[39m\u001b[32m, line 17\u001b[39m, in \u001b[36md_f_exp\u001b[39m\u001b[34m(xs)\u001b[39m\n\u001b[32m 14\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34md_f_exp\u001b[39m(xs):\n\u001b[32m 15\u001b[39m path_exp.grad(\u001b[38;5;28mlist\u001b[39m(free_syms)[\u001b[32m0\u001b[39m]).draw()\u001b[38;5;66;03m#.lambdify(*free_syms)(*xs).draw()\u001b[39;00m\n\u001b[32m 16\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m [\n\u001b[32m---> \u001b[39m\u001b[32m17\u001b[39m \u001b[43mpath_exp\u001b[49m\u001b[43m.\u001b[49m\u001b[43mgrad\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mlambdify\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43mfree_syms\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43mxs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m.tensor.array\n\u001b[32m 18\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m s \u001b[38;5;129;01min\u001b[39;00m free_syms\n\u001b[32m 19\u001b[39m ]\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/optyx/optyx/core/channel.py:475\u001b[39m, in \u001b[36mDiagram.eval\u001b[39m\u001b[34m(self, backend, **kwargs)\u001b[39m\n\u001b[32m 472\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m backend \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 473\u001b[39m backend = QuimbBackend()\n\u001b[32m--> \u001b[39m\u001b[32m475\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mbackend\u001b[49m\u001b[43m.\u001b[49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/optyx/optyx/core/backends.py:397\u001b[39m, in \u001b[36mQuimbBackend.eval\u001b[39m\u001b[34m(self, diagram, **extra)\u001b[39m\n\u001b[32m 384\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34meval\u001b[39m(\n\u001b[32m 385\u001b[39m \u001b[38;5;28mself\u001b[39m,\n\u001b[32m 386\u001b[39m diagram: Diagram,\n\u001b[32m 387\u001b[39m **extra: Any) -> EvalResult:\n\u001b[32m 388\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 389\u001b[39m \u001b[33;03m Evaluate the diagram using Quimb.\u001b[39;00m\n\u001b[32m 390\u001b[39m \n\u001b[32m (...)\u001b[39m\u001b[32m 395\u001b[39m \u001b[33;03m The result of the evaluation.\u001b[39;00m\n\u001b[32m 396\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m397\u001b[39m quimb_tn = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_get_quimb_tensor\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdiagram\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 398\u001b[39m tensor_diagram = \u001b[38;5;28mself\u001b[39m._get_discopy_tensor(diagram)\n\u001b[32m 400\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m quimb_tn:\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/optyx/optyx/core/backends.py:320\u001b[39m, in \u001b[36mAbstractBackend._get_quimb_tensor\u001b[39m\u001b[34m(self, diagram)\u001b[39m\n\u001b[32m 313\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_get_quimb_tensor\u001b[39m(\n\u001b[32m 314\u001b[39m \u001b[38;5;28mself\u001b[39m,\n\u001b[32m 315\u001b[39m diagram: Diagram\n\u001b[32m 316\u001b[39m ) -> TensorNetwork:\n\u001b[32m 317\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 318\u001b[39m \u001b[33;03m Get the Quimb tensor representation of the diagram.\u001b[39;00m\n\u001b[32m 319\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m320\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_get_discopy_tensor\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdiagram\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mto_quimb\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/.venv/lib/python3.12/site-packages/discopy/tensor.py:451\u001b[39m, in \u001b[36mDiagram.to_quimb\u001b[39m\u001b[34m(self, dtype)\u001b[39m\n\u001b[32m 448\u001b[39m tensors = inputs[:]\n\u001b[32m 449\u001b[39m scan = [(t, \u001b[32m1\u001b[39m) \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m inputs]\n\u001b[32m--> \u001b[39m\u001b[32m451\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m i, (box, off) \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(\u001b[38;5;28mzip\u001b[39m(\u001b[38;5;28mself\u001b[39m.boxes, \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43moffsets\u001b[49m)):\n\u001b[32m 452\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(box, Swap):\n\u001b[32m 453\u001b[39m scan[off], scan[off + \u001b[32m1\u001b[39m] = scan[off + \u001b[32m1\u001b[39m], scan[off]\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/.venv/lib/python3.12/site-packages/discopy/monoidal.py:598\u001b[39m, in \u001b[36mDiagram.offsets\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 595\u001b[39m \u001b[38;5;129m@property\u001b[39m\n\u001b[32m 596\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34moffsets\u001b[39m(\u001b[38;5;28mself\u001b[39m) -> \u001b[38;5;28mlist\u001b[39m[\u001b[38;5;28mint\u001b[39m]:\n\u001b[32m 597\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\" The offset of a box is the length of the type on its left. \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m598\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mlist\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mleft\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mleft\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m_\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m_\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/.venv/lib/python3.12/site-packages/discopy/monoidal.py:598\u001b[39m, in \u001b[36m\u001b[39m\u001b[34m(.0)\u001b[39m\n\u001b[32m 595\u001b[39m \u001b[38;5;129m@property\u001b[39m\n\u001b[32m 596\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34moffsets\u001b[39m(\u001b[38;5;28mself\u001b[39m) -> \u001b[38;5;28mlist\u001b[39m[\u001b[38;5;28mint\u001b[39m]:\n\u001b[32m 597\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\" The offset of a box is the length of the type on its left. \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m598\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mlist\u001b[39m(\u001b[38;5;28mlen\u001b[39m(left) \u001b[38;5;28;01mfor\u001b[39;00m left, _, _ \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m)\n", - "\u001b[31mValueError\u001b[39m: too many values to unpack (expected 3)" + "name": "stdout", + "output_type": "stream", + "text": [ + "0.4296238247323758\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 30%|███ | 6/20 [00:12<00:29, 2.13s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.29959341800206996\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 35%|███▌ | 7/20 [00:14<00:27, 2.13s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.18996344005095658\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 40%|████ | 8/20 [00:16<00:25, 2.09s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.10985803661254136\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 45%|████▌ | 9/20 [00:19<00:23, 2.11s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.057103882372305376\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 50%|█████ | 10/20 [00:21<00:21, 2.11s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.023521573022446115\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 55%|█████▌ | 11/20 [00:23<00:18, 2.08s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.000415985082452835\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 60%|██████ | 12/20 [00:25<00:16, 2.10s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.01932481270375224\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 65%|██████▌ | 13/20 [00:27<00:14, 2.11s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.04148099296641865\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 70%|███████ | 14/20 [00:29<00:12, 2.08s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.0714343170674597\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 75%|███████▌ | 15/20 [00:31<00:10, 2.10s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.11488446907551937\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 80%|████████ | 16/20 [00:33<00:08, 2.11s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.17779636062909193\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 85%|████████▌ | 17/20 [00:35<00:06, 2.11s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.2649466539403759\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 90%|█████████ | 18/20 [00:37<00:04, 2.09s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.3766785210831544\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 95%|█████████▌| 19/20 [00:40<00:02, 2.11s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.5051429153418859\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 20/20 [00:42<00:00, 2.11s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.6340993442622342\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" ] } ], @@ -309,7 +477,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "3a0c4436-86d9-4a16-9bc2-7eba1cc440f7", "metadata": {}, "outputs": [ @@ -319,13 +487,13 @@ "" ] }, - "execution_count": 7, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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", + "image/png": "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JyenyfacnBwiIyNP+9wnnniCRx99lK+++ooRI0a02M7Lywsvrw66oqdHy3WIiIhIx7DraSNPT0/GjBlDUlJS4zabzUZSUhLx8fEtPu/vf/87jzzyCCtWrGDs2LH2LFFERERcjN3PfyxatIjrrruOsWPHMn78eJYsWUJ5eTk33HADAPPnzyc6OprExEQAHnvsMR544AHeeecd+vTp0zg2xt/fH39/f3uXKyIiIk7O7uFl7ty55OXl8cADD5Cdnc2oUaNYsWJF4yDejIwMrNbjHUBLly6lpqaGX/ziF01e58EHH+Shhx6yd7kiIiLi5Ow+z0tHs+s8LyIiImIX7fn87pDbA4iIiIicKwovIiIi4lIUXkRERMSlKLyIiIiIS1F4EREREZei8CIiIiIuReFFREREXIrCi4iIiLgUhRcRERFxKQovIiIi4lIUXkRERMSlKLyIiIiIS1F4EREREZei8CIiIiIuReFFREREXIrCi4iIiLgUhRcRERFxKQovIiIi4lIUXkRERMSlKLyIiIiIS1F4EREREZei8CIiIiIuReFFREREXIrCi4iIiLgUhRcRERFxKQovIiIi4lIUXkRERMSlKLyIiIiIS1F4EREREZei8CIiIiIuReFFREREXIrCi4iIiLgUhRcRERFxKQovIiIi4lIUXkRERMSldEh4ef755+nTpw/e3t7ExcWxadOmFtvu3LmTn//85/Tp0weLxcKSJUs6okQRERFxEXYPL++//z6LFi3iwQcfZMuWLYwcOZLp06eTm5vbbPuKigr69evHo48+SmRkpL3LExERERdj9/Dy5JNPsmDBAm644QaGDh3KCy+8gK+vL6+99lqz7ceNG8fjjz/OVVddhZeXl73LExERERfjbs8Xr6mpISUlhcWLFzdus1qtJCQkkJycfE7eo7q6murq6sb1kpKSc/K6JyuurOXaVzcSFeRDVLAPUcHeRAcf+96HUH9PLBaLXd5bREREjrNreMnPz6e+vp6IiIgm2yMiIkhNTT0n75GYmMjDDz98Tl7rdDKLKtl+uJjth4ubfdzT3UpUkHdjmIkK9iE6+IT1IB98PN3sXqeIiEhnZ9fw0hEWL17MokWLGtdLSkqIiYk55+8T3c2HV+aPJbO4kiNFlWQWVZFZVElmUSU5JVXU1NlIL6ggvaCixdcI8fMkKti7sffmeM+NN9HdfAjz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xnfffWfEx8cb8fHxTV5n8ODBxocffti43pbf27Ol8HKSZ5991ujVq5fh6elpjB8/3vj2228bH5s8ebJx3XXXNWn/wQcfGIMGDTI8PT2N8847z/j00087uOK2AZpdXn/99cY2J+/fnXfe2fhvERERYcyaNcvYsmVLxxffRnPnzjV69OhheHp6GtHR0cbcuXONvXv3Nj7uysfvmC+++MIAjLS0tFMec8Xjt3r16mZ/Lo/th81mM/785z8bERERhpeXlzFt2rRT9r13797Ggw8+2GTb6X6PO9Lp9u/AgQMt/l6uXr268TVO3r/Wfs470un2r6KiwrjkkkuMsLAww8PDw+jdu7exYMGCU0KIMx8/w2j9Z9QwDOPFF180fHx8jKKiomZfw1mPYVs+FyorK43f/va3Rrdu3QxfX1/jiiuuMLKysk55nROf05bf27NlaXhjEREREZegMS8iIiLiUhReRERExKUovIiIiIhLUXgRERERl6LwIiIiIi5F4UVERERcisKLiIiIuBSFFxEREXEpCi8iIiLiUhReRERExKUovIiIiIhLUXgRERERl/L/AXNq6SqzT1dHAAAAAElFTkSuQmCC", "text/plain": [ "
" ] diff --git a/optyx/core/backends.py b/optyx/core/backends.py index 9a792f41..5b8b2441 100644 --- a/optyx/core/backends.py +++ b/optyx/core/backends.py @@ -393,18 +393,20 @@ def eval( The result of the evaluation. """ + tensor_diagram = self._get_discopy_tensor(diagram) + if hasattr(diagram, 'terms'): - results = sum(self._process_term(term) for term in diagram.terms) + results = sum( + self._process_term(term) for term in tensor_diagram.terms + ) else: - results = self._process_term(diagram) + results = self._process_term(tensor_diagram) if diagram.is_pure: state_type = StateType.AMP else: state_type = StateType.DM - tensor_diagram = self._get_discopy_tensor(diagram) - return EvalResult( discopy_tensor.Box( "Result", @@ -426,7 +428,7 @@ def _process_term(self, term: Diagram) -> np.ndarray: Returns: np.ndarray: The processed term as a numpy array. """ - quimb_tn = self._get_quimb_tensor(term) + quimb_tn = term.to_quimb() for t in quimb_tn: dt = t.data.dtype diff --git a/optyx/core/channel.py b/optyx/core/channel.py index db29fd64..2934fdbe 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -410,16 +410,36 @@ def from_discopy(cls, discopy_circuit): from optyx.qubits import Circuit return Circuit(discopy_circuit) + # @classmethod + # def from_bosonic_operator(cls, n_modes, operators, scalar=1): + # return Channel( + # "Bosonic operator", + # diagram.Diagram.from_bosonic_operator( + # n_modes, operators, scalar=scalar + # ) + # ) + @classmethod def from_bosonic_operator(cls, n_modes, operators, scalar=1): - """Convert from a list of bosonic operators. Based on - diagram.Diagram.from_bosonic_operator.""" - return Channel( - "Bosonic operator", - diagram.Diagram.from_bosonic_operator( - n_modes, operators, scalar=scalar - ) - ) + """Create a :class:`zw` diagram from a bosonic operator.""" + # pylint: disable=import-outside-toplevel + from optyx.core import zw + from optyx.photonic import Scalar + + # pylint: disable=invalid-name + d = Diagram.id(qmode**n_modes) + annil = Channel("n", zw.Split(2) >> zw.Select(1) @ zw.Id(1)) + create = annil.dagger() + for idx, dagger in operators: + if not 0 <= idx < n_modes: + raise ValueError(f"Index {idx} out of bounds.") + box = create if dagger else annil + d = d >> qmode**idx @ box @ qmode**(n_modes - idx - 1) + + if scalar != 1: + # pylint: disable=invalid-name + d = Scalar(scalar) @ d + return d @classmethod def from_graphix(cls, measurement_pattern): diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index 3850a210..99533074 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -394,26 +394,26 @@ def to_tensor( diagram >>= zboxes return diagram - @classmethod - def from_bosonic_operator(cls, n_modes, operators, scalar=1): - """Create a :class:`zw` diagram from a bosonic operator.""" - # pylint: disable=import-outside-toplevel - from optyx.core import zw - - # pylint: disable=invalid-name - d = cls.id(Mode(n_modes)) - annil = zw.Split(2) >> zw.Select(1) @ zw.Id(1) - create = annil.dagger() - for idx, dagger in operators: - if not 0 <= idx < n_modes: - raise ValueError(f"Index {idx} out of bounds.") - box = create if dagger else annil - d = d >> zw.Id(idx) @ box @ zw.Id(n_modes - idx - 1) - - if scalar != 1: - # pylint: disable=invalid-name - d = Scalar(scalar) @ d - return d + # @classmethod + # def from_bosonic_operator(cls, n_modes, operators, scalar=1): + # """Create a :class:`zw` diagram from a bosonic operator.""" + # # pylint: disable=import-outside-toplevel + # from optyx.core import zw + + # # pylint: disable=invalid-name + # d = cls.id(Mode(n_modes)) + # annil = zw.Split(2) >> zw.Select(1) @ zw.Id(1) + # create = annil.dagger() + # for idx, dagger in operators: + # if not 0 <= idx < n_modes: + # raise ValueError(f"Index {idx} out of bounds.") + # box = create if dagger else annil + # d = d >> zw.Id(idx) @ box @ zw.Id(n_modes - idx - 1) + + # if scalar != 1: + # # pylint: disable=invalid-name + # d = Scalar(scalar) @ d + # return d def to_pyzx(self): # pylint: disable=import-outside-toplevel diff --git a/optyx/core/zx.py b/optyx/core/zx.py index c52c20c3..a8753ace 100644 --- a/optyx/core/zx.py +++ b/optyx/core/zx.py @@ -507,139 +507,11 @@ def scalar(data): return diagram.Scalar(data) -def make_spiders(n): - """Constructs the Z spider 1 -> n from spiders 1 -> 2. - - >>> assert len(make_spiders(6)) == 5 - """ - spider = Id(1) - for k in range(n - 1): - spider = spider >> Z(1, 2) @ Id(k) - return spider - - -def decomp_ar(box): - """ - Decomposes a ZX diagram into Z spiders - with at most two inputs/outputs and hadamards. - - >>> assert len(decomp(X(2, 2, 0.25))) == 7 - """ - n, m = len(box.dom), len(box.cod) - if isinstance(box, X): - phase = box.phase - if (n, m) in ((1, 0), (0, 1)): - return box - box = ( - Id(0).tensor(*[H] * n) >> Z(n, m, phase) >> Id(0).tensor(*[H] * m) - ) - return decomp(box) - if isinstance(box, Z): - phase = box.phase - rot = Id(1) if phase == 0 else Z(1, 1, phase) - if n == 0: - return X(0, 1) >> H >> rot >> make_spiders(m) - if m == 0: - return X(1, 0) << H << rot << make_spiders(n).dagger() - return make_spiders(n).dagger() >> rot >> make_spiders(m) - return box - - -decomp = symmetric.Functor( - ob=lambda x: diagram.Bit(len(x)), - ar=decomp_ar, - cod=symmetric.Category(diagram.Bit, diagram.Diagram), -) - - def Id(n): return diagram.Diagram.id(n) if isinstance(n, diagram.Ty) \ else diagram.Diagram.id(diagram.Bit(n)) -def ar_zx2path(box): - """Mapping from ZX generators to QPath diagrams - - >>> zx2path(decomp(X(0, 1) @ X(0, 1) >> Z(2, 1))).to_path().eval() - Amplitudes([2.+0.j, 0.+0.j], dom=1, cod=2) - """ - # pylint: disable=import-outside-toplevel - from optyx.photonic import HadamardBS, Phase, BS - - unit = zw.Create(0) - counit = zw.Select(0) - create = zw.Create(1) - annil = zw.Select(1) - comonoid = zw.Split(2) - monoid = zw.Merge(2) - BS = BS.get_kraus() - - n, m = len(box.dom), len(box.cod) - if isinstance(box, diagram.Scalar): - return diagram.Scalar(box.data) - if isinstance(box, X): - phase = 1 + box.phase if box.phase < 0 else box.phase - if (n, m, phase) == (0, 1, 0): - return create @ unit @ root2 - if (n, m, phase) == (0, 1, 0.5): - return unit @ create @ root2 - if (n, m, phase) == (1, 0, 0): - return annil @ counit @ root2 - if (n, m, phase) == (1, 0, 0.5): - return counit @ annil @ root2 - if (n, m, phase) == (1, 1, 0.25): - return BS.dagger() - if (n, m, phase) == (1, 1, -0.25): - return BS - if isinstance(box, Z): - phase = box.phase - if (n, m) == (0, 1): - return create >> comonoid - if (n, m) == (1, 1): - return Id(diagram.Mode(1)) @ Phase(phase).get_kraus() - if (n, m, phase) == (2, 1, 0): - return ( - Id(diagram.Mode(1)) @ - (monoid >> annil) @ - Id(diagram.Mode(1)) - ) - if (n, m, phase) == (1, 2, 0): - plus = create >> comonoid - bot = ( - (plus >> Id(diagram.Mode(1)) @ plus @ Id(diagram.Mode(1))) @ - (Id(diagram.Mode(1)) @ plus @ Id(diagram.Mode(1))) - ) - mid = Id(diagram.Mode(2)) @ BS.dagger() @ BS @ Id(diagram.Mode(2)) - fusion = ( - Id(diagram.Mode(1)) @ plus.dagger() @ - Id(diagram.Mode(1)) >> plus.dagger() - ) - return ( - bot >> mid >> (Id(diagram.Mode(2)) @ - fusion @ Id(diagram.Mode(2))) - ) - if box == H: - return HadamardBS().get_kraus() - raise NotImplementedError(f"No translation of {box} in QPath.") - - -zx2path = symmetric.Functor( - ob=lambda x: diagram.Mode(2 * len(x)), - ar=ar_zx2path, - cod=symmetric.Category(diagram.Mode, diagram.Diagram), -) - - -def zx_to_path(diagram: diagram.Diagram) -> diagram.Diagram: - """ - Dual-rail encoding of any ZX diagram as a QPath diagram. - """ - return zx2path(decomp(diagram)) - - -root2 = scalar(2**0.5) - - H = ZXBox("H", 1, 1) H.draw_as_spider = False (H.drawing_name, H.tikzstyle_name,) = ( diff --git a/optyx/qubits.py b/optyx/qubits.py index b84d69bc..bd3dc07a 100644 --- a/optyx/qubits.py +++ b/optyx/qubits.py @@ -636,7 +636,7 @@ def decomp(self): def _make_spiders(n): """Constructs the Z spider 1 -> n from spiders 1 -> 2. - >>> assert len(make_spiders(6)) == 5 + >>> assert len(Z._make_spiders(6)) == 5 """ from optyx import qubits diff --git a/test/grad.py b/test/grad.py index cfd82a4f..f9005ff5 100644 --- a/test/grad.py +++ b/test/grad.py @@ -23,7 +23,7 @@ @pytest.mark.parametrize("circ, value", product(param_circuits, values)) def test_daggers_cancel(circ, value): d = circ >> circ.dagger() - out = d.grad(psi).subs((psi, value)).eval(2).array + out = d.grad(psi).subs((psi, value)).eval().tensor.array assert np.allclose(out, np.zeros(shape=out.shape)) diff --git a/test/qpath.py b/test/qpath.py index 810ea16c..bd795640 100644 --- a/test/qpath.py +++ b/test/qpath.py @@ -27,16 +27,16 @@ def test_dilate(): assert np.allclose(unitary.eval(3).array, matrix.eval(3).array) -def test_bosonic_operator(): - d1 = Diagram.from_bosonic_operator( - n_modes= 2, - operators=((0, False), (1, False), (0, True)), - scalar=2.1 - ) +# def test_bosonic_operator(): +# d1 = Diagram.from_bosonic_operator( +# n_modes= 2, +# operators=((0, False), (1, False), (0, True)), +# scalar=2.1 +# ) - annil = Split(2) >> Select(1) @ Id(Mode(1)) - create = annil.dagger() +# annil = Split(2) >> Select(1) @ Id(Mode(1)) +# create = annil.dagger() - d2 = Scalar(2.1) @ annil @ Id(Mode(1)) >> Id(Mode(1)) @ annil >> create @ Id(Mode(1)) +# d2 = Scalar(2.1) @ annil @ Id(Mode(1)) >> Id(Mode(1)) @ annil >> create @ Id(Mode(1)) - assert d1 == d2 \ No newline at end of file +# assert d1 == d2 \ No newline at end of file diff --git a/test/test_channel.py b/test/test_channel.py index 9d07de6c..34d220c9 100644 --- a/test/test_channel.py +++ b/test/test_channel.py @@ -57,5 +57,8 @@ def test_from_bosonic_op(): terms.append(term) hamiltonian = Diagram.sum_factory(terms) - sum_1 = hamiltonian.eval() - assert np.allclose(sum_1.array, 0.0) \ No newline at end of file + + sum_1 = np.sign(hamiltonian.get_kraus().to_tensor().eval().array) + sum_2 = np.sign(hamiltonian.eval().tensor.array) # bug in discopy.tensor.Tensor.eval() for Sums (?) + + assert np.allclose(sum_2, sum_1) \ No newline at end of file diff --git a/test/test_qubit.py b/test/test_qubit.py index 003f08df..345383ec 100644 --- a/test/test_qubit.py +++ b/test/test_qubit.py @@ -94,11 +94,11 @@ def test_pure_double_kraus(): assert qubits.Circuit(g).get_kraus() == qubits.Circuit(g).get_kraus() -def test_to_dual_rail(): - circuit = qubits.Z(1, 2) >> qubits.H() @ qubits.H() - dr_1 = qubits.Circuit(circuit).to_dual_rail().get_kraus() - dr_2 = zx.zx2path(circuit.get_kraus()) - assert dr_1 == dr_2 +# def test_to_dual_rail(): +# circuit = qubits.Z(1, 2) >> qubits.H() @ qubits.H() +# dr_1 = qubits.Circuit(circuit).to_dual_rail().get_kraus() +# dr_2 = zx.zx2path(circuit.get_kraus()) +# assert dr_1 == dr_2 def test_discard_qubits(): a = (qubits.Discard(2).double().to_tensor().to_quimb() ^ ...).data From 45bada4c2bad0b65f6b3b34b580da80cb423c4e8 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Sat, 6 Sep 2025 12:51:57 +0100 Subject: [PATCH 39/59] dual rail and decomp fixed --- optyx/core/channel.py | 46 ++++++++++++++++++++++++++++++++++++++++--- optyx/core/diagram.py | 20 ------------------- optyx/photonic.py | 6 +++--- optyx/qubits.py | 16 +++++++-------- 4 files changed, 54 insertions(+), 34 deletions(-) diff --git a/optyx/core/channel.py b/optyx/core/channel.py index 2934fdbe..2237fd88 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -104,6 +104,46 @@ >>> lossy_prob = (state >> lossy_channel >> effect).double(\\ ... ).to_tensor().eval().array >>> assert np.allclose(lossy_prob, prob * (eff ** 2)) + +**Diagrams from Bosonic Operators** + +The :code:`from_bosonic_operator` method +supports creating :class:`path` diagrams: + +>>> from optyx.core.zw import Split, Select, Id +>>> from optyx.core.diagram import Mode +>>> from optyx.photonic import Scalar +>>> d1 = Diagram.from_bosonic_operator( +... n_modes=2, +... operators=((0, False), (1, False), (0, True)), +... scalar=2.1 +... ) + +>>> annil = Channel( +... "annil", Split(2) >> Select(1) @ Id(Mode(1)) +... ) +>>> create = annil.dagger() + +>>> d2 = Scalar(2.1) @ annil @ qmode >> \\ +... qmode @ annil >> create @ qmode + +>>> assert d1 == d2 + +We can map ZX diagrams to :class:`path` diagrams using +dual-rail encoding. For example, we can create a GHZ state: + +>>> from discopy.drawing import Equation +>>> from optyx.qubits import Z +>>> from optyx.photonic import DualRail +>>> ghz = Z(0, 3) +>>> ghz_path = ghz.to_dual_rail() +>>> Equation(ghz >> DualRail(3), ghz_path, \\ +... symbol="$\\mapsto$").draw(figsize=(10, 10), \\ +... path="docs/_static/ghz_dr.svg") + +.. image:: /_static/ghz_dr.svg + :align: center + """ from __future__ import annotations @@ -428,7 +468,7 @@ def from_bosonic_operator(cls, n_modes, operators, scalar=1): # pylint: disable=invalid-name d = Diagram.id(qmode**n_modes) - annil = Channel("n", zw.Split(2) >> zw.Select(1) @ zw.Id(1)) + annil = Channel("annil", zw.Split(2) >> zw.Select(1) @ zw.Id(1)) create = annil.dagger() for idx, dagger in operators: if not 0 <= idx < n_modes: @@ -611,13 +651,13 @@ def dagger(self): cod=self.dom, ) - def decomp(self): + def _decomp(self): # pylint: disable=import-outside-toplevel raise NotImplementedError( "Decomposition is only implemented for ZX channels." ) - def to_dual_rail(self): + def _to_dual_rail(self): raise TypeError( "Only ZX channels can be converted to dual rail." ) diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index 99533074..58d6b346 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -149,26 +149,6 @@ ... Hong_Ou_Mandel.to_tensor().eval().array,\\ ... np.array([0])) -**:class:`zw` diagrams from Bosonic Operators** - -The :code:`from_bosonic_operator` method -supports creating :class:`path` diagrams: - ->>> from optyx.core.zw import Split, Select, Id ->>> d1 = Diagram.from_bosonic_operator( -... n_modes= 2, -... operators=((0, False), (1, False), (0, True)), -... scalar=2.1 -... ) - ->>> annil = Split(2) >> Select(1) @ Id(Mode(1)) ->>> create = annil.dagger() - ->>> d2 = Scalar(2.1) @ annil @ Id(Mode(1)) >> \\ -... Id(Mode(1)) @ annil >> create @ Id(Mode(1)) - ->>> assert d1 == d2 - **Permanent evaluation for QPath diagrams** The :code:`to_path` method supports evaluation by diff --git a/optyx/photonic.py b/optyx/photonic.py index 6641fd55..8f3e17cf 100644 --- a/optyx/photonic.py +++ b/optyx/photonic.py @@ -929,7 +929,7 @@ class FusionTypeI(Diagram): **Codomain** ``qmode ** 2 @ bit ** 2`` - – the surviving dual-rail qubit followed by two classical bits + - the surviving dual-rail qubit followed by two classical bits ``[s, k]`` where * ``s`` is the parity (success) bit @@ -1071,8 +1071,8 @@ class FusionTypeII(Diagram): ``bit ** 2`` containing - * ``s`` – success / parity bit - * ``k`` – Pauli-correction bit (applied to neighbouring nodes). + * ``s`` - success / parity bit + * ``k`` - Pauli-correction bit (applied to neighbouring nodes). Notes ----- diff --git a/optyx/qubits.py b/optyx/qubits.py index bd3dc07a..5e2ad95e 100644 --- a/optyx/qubits.py +++ b/optyx/qubits.py @@ -622,7 +622,7 @@ def lambdify(self, *symbols, **kwargs): lambdify(symbols, self.phase, **kwargs)(*xs) ) - def decomp(self): + def _decomp(self): n, m = len(self.dom), len(self.cod) phase = self.phase rot = Id(1) if phase == 0 else Z(1, 1, phase) @@ -645,7 +645,7 @@ def _make_spiders(n): spider = spider >> qubits.Z(1, 2) @ qubits.Id(k) return spider - def to_dual_rail(self): + def _to_dual_rail(self): """Convert to dual-rail encoding.""" from optyx import ( @@ -722,7 +722,7 @@ def lambdify(self, *symbols, **kwargs): lambdify(symbols, self.phase, **kwargs)(*xs), ) - def decomp(self): + def _decomp(self): n, m = len(self.dom), len(self.cod) phase = self.phase if (n, m) in ((1, 0), (0, 1)): @@ -732,7 +732,7 @@ def decomp(self): ) return box.decomp() - def to_dual_rail(self): + def _to_dual_rail(self): """Convert to dual-rail encoding.""" from optyx import ( photonic, @@ -784,10 +784,10 @@ def __init__(self): qubit, ) - def decomp(self): + def _decomp(self): return H() - def to_dual_rail(self): + def _to_dual_rail(self): """Convert to dual-rail encoding.""" from optyx import photonic return photonic.HadamardBS() @@ -809,10 +809,10 @@ def __init__(self, value: float): ) self.data = value - def decomp(self): + def _decomp(self): return Scalar(self.data) - def to_dual_rail(self): + def _to_dual_rail(self): """Convert to dual-rail encoding.""" from optyx import photonic return photonic.Scalar(self.data) From f6a9cda9caba19d616599de4eec8dc4d954d3913 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Sat, 6 Sep 2025 12:52:18 +0100 Subject: [PATCH 40/59] remove notes from notebooks --- docs/notebooks/bosonic-vqe-2.ipynb | 150 ----------------------------- 1 file changed, 150 deletions(-) diff --git a/docs/notebooks/bosonic-vqe-2.ipynb b/docs/notebooks/bosonic-vqe-2.ipynb index 3ff6d24e..d028b85c 100644 --- a/docs/notebooks/bosonic-vqe-2.ipynb +++ b/docs/notebooks/bosonic-vqe-2.ipynb @@ -2318,156 +2318,6 @@ "plt.plot(range(len(xs)),fxs,'b.')\n", "plt.show()" ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "346a4294", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.photonic import BBS, Create, Scalar" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "eea8a769", - "metadata": {}, - "outputs": [], - "source": [ - "#diagram = BBS(0.3) + BBS(0.9) + BBS(0.5)\n", - "#diagram.draw()\n", - "\n", - "diagram = Create(1) @ Scalar(0.34) + Create(2) @ Scalar(0.56) + Create(3) @ Scalar(0.12)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "5e2fd068", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0. +0.j, 0.34+0.j, 0.56+0.j, 0.12+0.j])" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "diagram.eval().tensor.array" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "fa135207", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0. +0.j 0.34+0.j 0. +0.j 0. +0.j]\n", - "-----\n", - "[0. +0.j 0.34+0.j 0. +0.j 0. +0.j]\n", - "======\n", - "[0. +0.j 0. +0.j 0.56+0.j 0. +0.j]\n", - "-----\n", - "[0. +0.j 0. +0.j 0.56+0.j 0. +0.j]\n", - "======\n", - "[0. +0.j 0. +0.j 0. +0.j 0.12+0.j]\n", - "-----\n", - "[0. +0.j 0. +0.j 0. +0.j 0.12+0.j]\n", - "======\n" - ] - } - ], - "source": [ - "import numpy as np\n", - "\n", - "for term in diagram.get_kraus().to_tensor():\n", - " print((term.to_quimb()^...).data)\n", - " print(\"-----\")\n", - " print(term.eval().array)\n", - " print(\"======\")\n", - " assert np.allclose((term.to_quimb()^...).data, term.eval().array)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "f20a782f", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/discopy/matrix.py:161: ComplexWarning: Casting complex values to real discards the imaginary part\n", - " self.array = np.array(array, dtype=self.dtype).reshape((dom, cod))\n" - ] - }, - { - "data": { - "text/plain": [ - "array([0, 0, 0, 0])" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "diagram.get_kraus().to_tensor().eval().array" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "abf30abe", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "tensor.Sum(terms=(tensor.Diagram(inside=(rigid.Layer(Dim(1), tensor.Box[complex128]('Create(1)', Dim(2), Dim(1), data=array([0.+0.j, 1.+0.j])).dagger(), Dim(1)), rigid.Layer(Dim(2), tensor.Box[complex128]('scalar', Dim(1), Dim(1), data=[(0.34+0j)]), Dim(1)), rigid.Layer(Dim(1), tensor.Box[int64]('ZBox(1, 1, mode)', Dim(2), Dim(2), data=array([[1, 0],\n", - " [0, 1]])), Dim(1)), rigid.Layer(Dim(1), tensor.Spider(1, 1, Dim(2)), Dim(1)), rigid.Layer(Dim(1), optyx.core.diagram.EmbeddingTensor('Embedding', Dim(2), Dim(4), data=array([[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],\n", - " [0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j]])), Dim(1))), dom=Dim(1), cod=Dim(4)), tensor.Diagram(inside=(rigid.Layer(Dim(1), tensor.Box[complex128]('Create((2,))', Dim(3), Dim(1), data=array([0.+0.j, 0.+0.j, 1.+0.j])).dagger(), Dim(1)), rigid.Layer(Dim(3), tensor.Box[complex128]('scalar', Dim(1), Dim(1), data=[(0.56+0j)]), Dim(1)), rigid.Layer(Dim(1), tensor.Box[int64]('ZBox(1, 1, mode)', Dim(3), Dim(3), data=array([[1, 0, 0],\n", - " [0, 1, 0],\n", - " [0, 0, 1]])), Dim(1)), rigid.Layer(Dim(1), tensor.Spider(1, 1, Dim(3)), Dim(1)), rigid.Layer(Dim(1), optyx.core.diagram.EmbeddingTensor('Embedding', Dim(3), Dim(4), data=array([[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],\n", - " [0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j],\n", - " [0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j]])), Dim(1))), dom=Dim(1), cod=Dim(4)), tensor.Diagram(inside=(rigid.Layer(Dim(1), tensor.Box[complex128]('Create((3,))', Dim(4), Dim(1), data=array([0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j])).dagger(), Dim(1)), rigid.Layer(Dim(4), tensor.Box[complex128]('scalar', Dim(1), Dim(1), data=[(0.12+0j)]), Dim(1)), rigid.Layer(Dim(1), tensor.Box[int64]('ZBox(1, 1, mode)', Dim(4), Dim(4), data=array([[1, 0, 0, 0],\n", - " [0, 1, 0, 0],\n", - " [0, 0, 1, 0],\n", - " [0, 0, 0, 1]])), Dim(1)), rigid.Layer(Dim(1), tensor.Spider(1, 1, Dim(4)), Dim(1)), rigid.Layer(Dim(1), optyx.core.diagram.EmbeddingTensor('Embedding', Dim(4), Dim(4), data=array([[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],\n", - " [0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j],\n", - " [0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],\n", - " [0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j]])), Dim(1))), dom=Dim(1), cod=Dim(4))))" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "diagram.get_kraus().to_tensor()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "554c80f7", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From c8da03f40f6739b138e26b1f1309ee115affc6f9 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Mon, 8 Sep 2025 13:48:48 +0100 Subject: [PATCH 41/59] flake8 --- optyx/core/channel.py | 52 ------------------------------------------- optyx/core/zx.py | 1 - optyx/qubits.py | 14 +++++++----- test/test_channel.py | 2 +- 4 files changed, 10 insertions(+), 59 deletions(-) diff --git a/optyx/core/channel.py b/optyx/core/channel.py index 2237fd88..26a58fc4 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -148,7 +148,6 @@ from __future__ import annotations -import numpy as np from discopy import tensor from discopy import symmetric, frobenius, hypergraph from discopy.cat import factory @@ -723,57 +722,6 @@ def get_kraus(self): [term.get_kraus() for term in self.terms] ) - # def to_path(self, dtype: type = complex): - # """Evaluate the sum of diagrams.""" - # array = 0 - # doms = [] - # cods = [] - # creations = [] - # selections = [] - # normalisations = [] - # for term in self.terms: - # path_diagram = term.to_path(dtype) - # array += path_diagram.array - # creations.append(path_diagram.creations) - # selections.append(path_diagram.selections) - # doms.append(path_diagram.dom) - # cods.append(path_diagram.cod) - # normalisations.append(path_diagram.normalisation) - - # assert all(d == doms[0] for d in doms), "All terms must have the same dom" - # assert all(c == cods[0] for c in cods), "All terms must have the same cod" - # assert all(creations[0] == cr for cr in creations), "All creations tuples must be identical" - # assert all(selections[0] == se for se in selections), "All selections tuples must be identical" - # assert all(normalisations[0] == n for n in normalisations), "All normalisations must be identical" - - # array = array/len(self.terms) - - # dom = doms[0] - # cod = cods[0] - - # return Matrix[dtype]( - # array, - # dom, - # cod, - # creations=creations[0], - # selections=selections[0], - # normalisation=normalisations[0] - # ) - - # def eval(self, n_photons=0, permanent=None, dtype=complex): - # """Evaluate the sum of diagrams.""" - # # we need to implement the proper sums of qpath diagrams - # # this is only a temporary solution, so that the grad tests pass - # if permanent is None: - # # pylint: disable=import-outside-toplevel - # from optyx.core.path import npperm - - # permanent = npperm - # return sum( - # term.to_path(dtype).eval(n_photons, permanent) - # for term in self.terms - # ) - class CQMap(Diagram, frobenius.Box): """ diff --git a/optyx/core/zx.py b/optyx/core/zx.py index a8753ace..71c524a7 100644 --- a/optyx/core/zx.py +++ b/optyx/core/zx.py @@ -127,7 +127,6 @@ from typing import List import numpy as np -from discopy import symmetric from discopy import cat from discopy.utils import factory_name from discopy.frobenius import Dim diff --git a/optyx/qubits.py b/optyx/qubits.py index 5e2ad95e..647ed2d3 100644 --- a/optyx/qubits.py +++ b/optyx/qubits.py @@ -265,14 +265,14 @@ """ # noqa E501 -from typing import Literal, Iterable +from typing import Literal from enum import Enum import numpy as np from pyzx.graph.base import BaseGraph import graphix from discopy import quantum as quantum_discopy from discopy import symmetric -from sympy import Expr, lambdify, Symbol, Mul +from sympy import lambdify # from pytket import circuit as tket_circuit from optyx.utils.utils import explode_channel from optyx.core import ( @@ -445,7 +445,6 @@ class QubitChannel(Channel): # cod=symmetric.Category(channel.Ty, channel.Diagram), # )(self) - # pylint: disable=too-many-locals # pylint: disable=too-many-return-statements # pylint: disable=too-many-branches @@ -696,6 +695,7 @@ def dagger(self): -self.phase ) + # pylint: disable=invalid-name class X(Channel): """X spider.""" @@ -728,7 +728,9 @@ def _decomp(self): if (n, m) in ((1, 0), (0, 1)): return self box = ( - Id(0).tensor(*[H()] * n) >> Z(n, m, phase) >> Id(0).tensor(*[H()] * m) + Id(0).tensor(*[H()] * n) >> + Z(n, m, phase) >> + Id(0).tensor(*[H()] * m) ) return box.decomp() @@ -738,7 +740,6 @@ def _to_dual_rail(self): photonic, classical ) - from optyx.core import zw root2 = photonic.Scalar(2**0.5) unit = photonic.Create(0) @@ -769,6 +770,7 @@ def dagger(self): -self.phase ) + # pylint: disable=invalid-name class H(Channel): """Hadamard gate.""" @@ -795,6 +797,7 @@ def _to_dual_rail(self): def dagger(self): return self + class Scalar(Channel): """ Scalar. @@ -820,6 +823,7 @@ def _to_dual_rail(self): def dagger(self): return type(self)(np.conj(self.data)) + class BitFlipError(Channel): """ Represents a bit-flip error channel. diff --git a/test/test_channel.py b/test/test_channel.py index 34d220c9..b926f20b 100644 --- a/test/test_channel.py +++ b/test/test_channel.py @@ -1,7 +1,7 @@ import pytest from optyx.core.channel import * -from optyx.core import diagram +from optyx.core import diagram, zx import numpy as np bell_density_re = np.array([ From 93dbb18ce7d341f09c0936f74ec0c817724a46a3 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Wed, 10 Sep 2025 16:31:12 +0100 Subject: [PATCH 42/59] testing_some_extra_functions --- examples/test_light_cones.ipynb | 16828 ++++++++++++++++++++++++++++++ 1 file changed, 16828 insertions(+) create mode 100644 examples/test_light_cones.ipynb diff --git a/examples/test_light_cones.ipynb b/examples/test_light_cones.ipynb new file mode 100644 index 00000000..408ebc05 --- /dev/null +++ b/examples/test_light_cones.ipynb @@ -0,0 +1,16828 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 186, + "id": "31149112", + "metadata": {}, + "outputs": [], + "source": [ + "from __future__ import annotations\n", + "\n", + "from typing import List, Tuple\n", + "from optyx.core.diagram import Box, Diagram, Spider, Swap\n", + "from optyx.core import zw\n", + "\n", + "LO_ELEMENTS = (\n", + " zw.Create,\n", + " zw.W,\n", + " zw.Select,\n", + " zw.Add,\n", + " zw.Endo\n", + ")\n", + "\n", + "def update_connections(\n", + " wires_in_light_cone: List[bool],\n", + " previous_left_offset: int,\n", + " previous_box: Box,\n", + " previous_right_offset: int,\n", + ") -> List[bool]:\n", + " \"\"\"\n", + " Replace the previous box's COD segment in the light-cone by a DOM-length\n", + " segment that is either all True (if connected) or all False.\n", + " This pulls the cone one layer backward.\n", + " \"\"\"\n", + " connected = is_previous_box_connected_to_current_box(\n", + " wires_in_light_cone,\n", + " previous_left_offset,\n", + " len(previous_box.cod),\n", + " previous_right_offset,\n", + " )\n", + "\n", + " start = previous_left_offset\n", + " end = len(wires_in_light_cone) - previous_right_offset\n", + "\n", + " # replace cod slice with a dom-length slice of the same boolean\n", + " return (\n", + " wires_in_light_cone[:start]\n", + " + [connected] * len(previous_box.dom)\n", + " + wires_in_light_cone[end:]\n", + " )\n", + "\n", + "def calculate_right_offset(total_wires: int, left_offset: int, span_len: int) -> int:\n", + " \"\"\"Right offset = number of wires to the right of a span.\"\"\"\n", + " return total_wires - span_len - left_offset\n", + "\n", + "def is_previous_box_connected_to_current_box(\n", + " wires_in_light_cone: List[bool],\n", + " previous_left_offset: int,\n", + " previous_box_cod_len: int,\n", + " previous_right_offset: int,\n", + ") -> bool:\n", + " \"\"\"\n", + " Do the current light-cone wires intersect the COD of the previous box?\n", + " \"\"\"\n", + " mask = (\n", + " [False] * previous_left_offset\n", + " + [True] * previous_box_cod_len\n", + " + [False] * previous_right_offset\n", + " )\n", + " # lengths should match by construction\n", + " assert len(mask) == len(wires_in_light_cone), (\n", + " f\"Mask/wires length mismatch: {len(mask)} != {len(wires_in_light_cone)}\"\n", + " )\n", + "\n", + " return any(w and m for w, m in zip(wires_in_light_cone, mask))\n", + "\n", + "def get_previous_box_cod_index_in_light_cone(\n", + " wires_in_light_cone: List[bool],\n", + " previous_left_offset: int,\n", + " previous_box_cod_len: int,\n", + " previous_right_offset: int,\n", + ") -> List[int]:\n", + " \"\"\"\n", + " Get the indices of the COD of the previous box that are in the current light-cone.\n", + " \"\"\"\n", + " mask = (\n", + " [False] * previous_left_offset\n", + " + [True] * previous_box_cod_len\n", + " + [False] * previous_right_offset\n", + " )\n", + " # lengths should match by construction\n", + " assert len(mask) == len(wires_in_light_cone), (\n", + " f\"Mask/wires length mismatch: {len(mask)} != {len(wires_in_light_cone)}\"\n", + " )\n", + "\n", + " return [\n", + " i - previous_left_offset for i, (w, m) in enumerate(zip(wires_in_light_cone, mask))\n", + " if w and m\n", + " ]\n", + "\n", + "\n", + "def get_max_dim_for_box(\n", + " left_offset: int,\n", + " box: Box,\n", + " right_offset: int,\n", + " input_dims: List[int],\n", + " prev_layers: List[Tuple[int, Box]],\n", + "):\n", + "\n", + " if len(box.dom) == 0 or isinstance(box, Swap):\n", + " return 1e20\n", + "\n", + " dim_for_box = 0\n", + "\n", + " # light-cone at the current layer inputs\n", + " wires_in_light_cone: List[bool] = (\n", + " [False] * left_offset\n", + " + [True] * len(box.dom)\n", + " + [False] * right_offset\n", + " )\n", + "\n", + " for previous_left_offset, previous_box in prev_layers[::-1]:\n", + " previous_right_offset = calculate_right_offset(\n", + " len(wires_in_light_cone), previous_left_offset, len(previous_box.cod)\n", + " )\n", + "\n", + " if is_previous_box_connected_to_current_box(\n", + " wires_in_light_cone,\n", + " previous_left_offset,\n", + " len(previous_box.cod),\n", + " previous_right_offset,\n", + " ):\n", + "\n", + " if isinstance(previous_box, zw.Create):\n", + " idxs = get_previous_box_cod_index_in_light_cone(\n", + " wires_in_light_cone,\n", + " previous_left_offset,\n", + " len(previous_box.cod),\n", + " previous_right_offset,\n", + " )\n", + " dim_for_box += sum(previous_box.photons[i] for i in idxs)\n", + "\n", + " wires_in_light_cone = update_connections(\n", + " wires_in_light_cone,\n", + " previous_left_offset,\n", + " previous_box,\n", + " previous_right_offset,\n", + " )\n", + "\n", + " dim_for_box += sum(2*dim for wire, dim in zip(wires_in_light_cone, input_dims) if wire) + 1\n", + " return dim_for_box\n" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "id": "e97d833d", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.photonic import ansatz, Create\n", + "import numpy as np\n", + "from optyx import qmode\n", + "\n", + "def chip_mzi(w, l):\n", + " ansatz_ = ansatz(w, l)\n", + " symbs = list(ansatz_.free_symbols)\n", + " s = [(i, np.random.uniform(0, 1)) for i in symbs]\n", + " return ansatz_.subs(*s)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5e3c7ea2", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.core import zw\n", + "from optyx import Channel\n", + "\n", + "def _number_operator():\n", + " return (\n", + " zw.W(2) >>\n", + " zw.Select(1) @ zw.Id(1) >>\n", + " zw.Create(1) @ zw.Id(1) >>\n", + " zw.W(2).dagger()\n", + " )\n", + "\n", + "def _monomial_number_operator(power):\n", + " diag = zw.Id(1)\n", + " for i in range(power):\n", + " diag = diag >> _number_operator()\n", + " return diag\n", + "\n", + "def _get_monomial_layer(powers):\n", + " monomial_layer = zw.Id(0)\n", + " for power in powers:\n", + " monomial_layer = monomial_layer @ _monomial_number_operator(power)\n", + "\n", + " return Channel(\"l\", monomial_layer)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc152566", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 190, + "id": "353c0a1c", + "metadata": {}, + "outputs": [], + "source": [ + "from discopy import tensor\n", + "from optyx.core.diagram import Dim, modify_io_dims_against_max_dim\n", + "\n", + "# pylint: disable=too-many-locals\n", + "def to_tensor(\n", + " self, input_dims: list = None\n", + ") -> tensor.Diagram:\n", + " \"\"\"Returns a :class:`tensor.Diagram` for evaluation\"\"\"\n", + " from optyx.core import zw\n", + "\n", + " prev_layers: List[Tuple[int, Box]] = []\n", + "\n", + " # pylint: disable=import-outside-toplevel\n", + " def list_to_dim(dims: np.ndarray | list) -> Dim:\n", + " \"\"\"Converts a list of dimensions to a Dim object\"\"\"\n", + " return Dim(*[int(i) for i in dims])\n", + "\n", + " number_of_input_layer_wires = len(self.dom)\n", + "\n", + " if input_dims is None:\n", + " layer_dims = [2 for _ in range(len(self.dom))]\n", + " else:\n", + " assert len(self.dom) == len(input_dims), (\n", + " f\"Input dims length {len(input_dims)} does not match number of input wires {len(self.dom)}\"\n", + " )\n", + " layer_dims = input_dims\n", + "\n", + " if len(self.boxes) == 0 and len(self.offsets) == 0:\n", + " return tensor.Diagram.id(list_to_dim(layer_dims))\n", + "\n", + " for i, (box, left_offset) in enumerate(zip(self.boxes, self.offsets)):\n", + " right_offset = calculate_right_offset(\n", + " number_of_input_layer_wires, left_offset, len(box.dom)\n", + " )\n", + "\n", + " max_dim = get_max_dim_for_box(\n", + " left_offset,\n", + " box,\n", + " right_offset,\n", + " layer_dims,\n", + " prev_layers\n", + " )\n", + "\n", + " dims_in = layer_dims[left_offset:left_offset + len(box.dom)]\n", + " dims_out, _ = modify_io_dims_against_max_dim(\n", + " box.determine_output_dimensions(dims_in),\n", + " None,\n", + " max_dim\n", + " )\n", + " if isinstance(box, LO_ELEMENTS):\n", + " prev_layers.append((left_offset, box))\n", + " else:\n", + " prev_layers.append(\n", + " (left_offset, zw.Select(*dims_in) >> zw.Create(*dims_out))\n", + " )\n", + "\n", + " left = Dim()\n", + " if left_offset > 0:\n", + " left = list_to_dim(layer_dims[0:left_offset])\n", + " right = Dim()\n", + " if left_offset + len(box.dom) < number_of_input_layer_wires:\n", + " right = list_to_dim(\n", + " layer_dims[left_offset + len(box.dom): number_of_input_layer_wires]\n", + " )\n", + "\n", + " number_of_input_layer_wires += -len(box.dom) + len(box.cod)\n", + " cod_layer_dims = (\n", + " layer_dims[0:left_offset]\n", + " + dims_out\n", + " + layer_dims[left_offset + len(box.dom):]\n", + " )\n", + "\n", + " diagram_ = left @ box.truncation(dims_in, dims_out) @ right\n", + " if i == 0:\n", + " diagram = diagram_\n", + " else:\n", + " diagram = diagram >> diagram_\n", + "\n", + " layer_dims = cod_layer_dims\n", + "\n", + " zboxes = tensor.Id(Dim(1))\n", + "\n", + " # pylint: disable=invalid-name\n", + " for c in diagram.cod:\n", + " zboxes @= zw.ZBox(1, 1, lambda i: 1).truncation(\n", + " input_dims=[int(c.inside[0])], output_dims=[int(c.inside[0])]\n", + " )\n", + " diagram >>= zboxes\n", + " return diagram\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e19e4271", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 160, + "id": "e6a63953", + "metadata": {}, + "outputs": [], + "source": [ + "d = _get_monomial_layer([2, 0, 1, 3]).get_kraus()" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "id": "cc6faece", + "metadata": {}, + "outputs": [], + "source": [ + "#d.to_tensor().foliation().draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "id": "88f71084", + "metadata": {}, + "outputs": [], + "source": [ + "#to_tensor(d).foliation().draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "id": "19729f78", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-10T16:05:26.720705\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "chip = chip_mzi(8, 2)\n", + "(Create(*[1]*8) >> chip).get_kraus().to_tensor().foliation().draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 188, + "id": "4e128eb7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Create((1, 1, 1, 1, 1, 1, 1, 1))\n", + "W\n", + "W\n", + "Endo((-0.3234307046382588+0.11332561404425955j))\n", + "Endo((0.32195587565695744+0.8825498844986909j))\n", + "Endo((0.8865927060326879-0.3106497354068188j))\n", + "Endo((0.11745011550130909+0.32195587565695744j))\n", + "Swap(mode, mode)\n", + "W[::-1]\n", + "W[::-1]\n", + "W\n", + "W\n", + "Endo((0.4169034852779769+0.5488356489283379j))\n", + "Endo((-0.4993760641366437+0.5249709144284862j))\n", + "Endo((0.43827131417118825+0.5769654838923606j))\n", + "Endo((0.4750290855715139-0.4993760641366437j))\n", + "Swap(mode, mode)\n", + "W[::-1]\n", + "W[::-1]\n", + "W\n", + "W\n", + "Endo((-0.30134644704603486+0.04581902450731501j))\n", + "Endo((0.29030496026090463+0.9070909358459293j))\n", + "Endo((0.9415913197596348-0.1431667642968796j))\n", + "Endo((0.09290906415407064+0.29030496026090463j))\n", + "Swap(mode, mode)\n", + "W[::-1]\n", + "W[::-1]\n", + "W\n", + "W\n", + "Endo((0.024661152392129276-0.6329378798550435j))\n", + "Endo((-0.4901451026153749+0.5987814678072949j))\n", + "Endo((0.03012708063058259-0.773223012345063j))\n", + "Endo((0.4012185321927052-0.4901451026153749j))\n", + "Swap(mode, mode)\n", + "W[::-1]\n", + "W[::-1]\n", + "W\n", + "W\n", + "Endo((-0.928115312565149-0.2467101549282078j))\n", + "Endo((-0.26775580306395785+0.07773606603739527j))\n", + "Endo((-0.26945460155217793-0.07162599904889509j))\n", + "Endo((0.9222639339626046-0.26775580306395785j))\n", + "Swap(mode, mode)\n", + "W[::-1]\n", + "W[::-1]\n", + "W\n", + "W\n", + "Endo((0.23716593670529645-0.8996573532247728j))\n", + "Endo((-0.3410483051292247+0.1343689652552956j))\n", + "Endo((0.09344055088272257-0.3544542688500576j))\n", + "Endo((0.8656310347447043-0.3410483051292247j))\n", + "Swap(mode, mode)\n", + "W[::-1]\n", + "W[::-1]\n", + "W\n", + "W\n", + "Endo((0.31787953262197693+0.9447662280369127j))\n", + "Endo((0.07955380654804424+0.006369377100937596j))\n", + "Endo((-0.025450631513357046-0.07564153922620105j))\n", + "Endo((0.9936306228990623+0.07955380654804424j))\n", + "Swap(mode, mode)\n", + "W[::-1]\n", + "W[::-1]\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-10T16:29:45.637437\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "to_tensor((Create(*[1]*8) >> chip).get_kraus()).foliation().draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 191, + "id": "896f5f67", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-10T16:30:44.755238\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "to_tensor((Create(*[1]*8) >> chip).get_kraus()).foliation().draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 192, + "id": "07abf735", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-10T16:30:51.746532\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "to_tensor((chip).get_kraus()).foliation().draw()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ca90920", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "335306fa", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "893f207e", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "517b6976", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "51635d8f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9f89239e", + "metadata": {}, + "outputs": [], + "source": [ + "# IF THE DIAGRAM IS ONLY COMPOSED OF LO BOXES\n", + "def dims_for_lo_boxes(diagram: Diagram, input_dims: List[int]) -> List[Tuple[Box, int]]:\n", + " prev_layers: List[Tuple[int, Box]] = []\n", + " dims_for_boxes: List[Tuple[Box, int]] = []\n", + "\n", + "\n", + " assert len(diagram.dom) == len(input_dims), (\n", + " f\"Input dims length {len(input_dims)} does not match number of input wires {len(diagram.dom)}\"\n", + " )\n", + " number_of_input_layer_wires = len(diagram.dom)\n", + "\n", + " #post_selections = get_postselections(diagram)\n", + "\n", + " for box, left_offset in zip(\n", + " diagram.boxes,\n", + " diagram.offsets,\n", + " #post_selections\n", + " ):\n", + " right_offset = calculate_right_offset(\n", + " number_of_input_layer_wires, left_offset, len(box.dom)\n", + " )\n", + "\n", + " # light-cone at the current layer inputs\n", + " wires_in_light_cone: List[bool] = (\n", + " [False] * left_offset\n", + " + [True] * len(box.dom)\n", + " + [False] * right_offset\n", + " )\n", + "\n", + " dim_for_box = 0\n", + "\n", + " # walk backwards through previous layers\n", + " #used_ps = []\n", + "\n", + " for previous_left_offset, previous_box in prev_layers[::-1]:\n", + " previous_right_offset = calculate_right_offset(\n", + " len(wires_in_light_cone), previous_left_offset, len(previous_box.cod)\n", + " )\n", + "\n", + " if is_previous_box_connected_to_current_box(\n", + " wires_in_light_cone,\n", + " previous_left_offset,\n", + " len(previous_box.cod),\n", + " previous_right_offset,\n", + " ):\n", + "\n", + " if isinstance(previous_box, zw.Create):\n", + " idxs = get_previous_box_cod_index_in_light_cone(\n", + " wires_in_light_cone,\n", + " previous_left_offset,\n", + " len(previous_box.cod),\n", + " previous_right_offset,\n", + " )\n", + " dim_for_box += sum(previous_box.photons[i] for i in idxs)\n", + "\n", + " # for p in ps:\n", + " # if p[0] not in used_ps:\n", + " # dim_for_box -= p[1]\n", + " # used_ps.append(p[0])\n", + "\n", + " wires_in_light_cone = update_connections(\n", + " wires_in_light_cone,\n", + " previous_left_offset,\n", + " previous_box,\n", + " previous_right_offset,\n", + " )\n", + "\n", + " dim_for_box += sum(1*dim for wire, dim in zip(wires_in_light_cone, input_dims) if wire)\n", + "\n", + " dims_for_boxes.append((box, dim_for_box + 1))\n", + " if isinstance(box, LO_ELEMENTS):\n", + " prev_layers.append((left_offset, box))\n", + " else:\n", + " pass\n", + "\n", + " number_of_input_layer_wires += -len(box.dom) + len(box.cod)\n", + "\n", + " return dims_for_boxes" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4d726481", + "metadata": {}, + "outputs": [], + "source": [ + "# IF THE DIAGRAM IS ONLY COMPOSED OF LO BOXES\n", + "def get_postselections(diagram: Diagram) -> List[Tuple[Box, int]]:\n", + " diagram = diagram.dagger()\n", + " prev_layers: List[Tuple[int, Box]] = []\n", + " postselection_for_boxes: List[Tuple[Box, int]] = []\n", + "\n", + " number_of_input_layer_wires = len(diagram.dom)\n", + "\n", + " for box, left_offset in zip(diagram.boxes, diagram.offsets):\n", + " right_offset = calculate_right_offset(\n", + " number_of_input_layer_wires, left_offset, len(box.dom)\n", + " )\n", + "\n", + " # light-cone at the current layer inputs\n", + " wires_in_light_cone: List[bool] = (\n", + " [False] * left_offset\n", + " + [True] * len(box.dom)\n", + " + [False] * right_offset\n", + " )\n", + "\n", + " postselections_for_box = []\n", + "\n", + " # walk backwards through previous layers\n", + " for previous_left_offset, previous_box in prev_layers[::-1]:\n", + " previous_right_offset = calculate_right_offset(\n", + " len(wires_in_light_cone), previous_left_offset, len(previous_box.cod)\n", + " )\n", + "\n", + " if is_previous_box_connected_to_current_box(\n", + " wires_in_light_cone,\n", + " previous_left_offset,\n", + " len(previous_box.cod),\n", + " previous_right_offset,\n", + " ):\n", + "\n", + " if isinstance(previous_box, zw.Create):\n", + " idxs = get_previous_box_cod_index_in_light_cone(\n", + " wires_in_light_cone,\n", + " previous_left_offset,\n", + " len(previous_box.cod),\n", + " previous_right_offset,\n", + " )\n", + " postselections_for_box.append(\n", + " (id(previous_box), sum(previous_box.photons[i] for i in idxs))\n", + " )\n", + "\n", + " wires_in_light_cone = update_connections(\n", + " wires_in_light_cone,\n", + " previous_left_offset,\n", + " previous_box,\n", + " previous_right_offset,\n", + " )\n", + "\n", + " postselection_for_boxes.append((postselections_for_box))\n", + " if isinstance(box, LO_ELEMENTS):\n", + " prev_layers.append((left_offset, box))\n", + " else:\n", + " pass\n", + "\n", + " number_of_input_layer_wires += -len(box.dom) + len(box.cod)\n", + "\n", + " return postselection_for_boxes[::-1]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "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.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 19b80169ed44083e7a6ffc57b5d24a1f5ddf60fe Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Fri, 19 Sep 2025 12:19:05 +0100 Subject: [PATCH 43/59] fix tests --- optyx/core/channel.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/optyx/core/channel.py b/optyx/core/channel.py index 26a58fc4..577d6e21 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -390,9 +390,9 @@ def to_dual_rail(self): return frobenius.Functor( ob=lambda x: qmode**(2*len(x)), - ar=lambda arr: arr.to_dual_rail(), + ar=lambda arr: arr._to_dual_rail(), cod=frobenius.Category(Ty, Diagram), - )(self._decomp()) + )(self.decomp()) def to_tket(self): """ From 82a33a43f3b5d80f0d042c8890519465387d20a1 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Wed, 24 Sep 2025 18:45:03 +0100 Subject: [PATCH 44/59] remove debugging code --- optyx/core/diagram.py | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index 58d6b346..e1ea90ab 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -374,26 +374,26 @@ def to_tensor( diagram >>= zboxes return diagram - # @classmethod - # def from_bosonic_operator(cls, n_modes, operators, scalar=1): - # """Create a :class:`zw` diagram from a bosonic operator.""" - # # pylint: disable=import-outside-toplevel - # from optyx.core import zw - - # # pylint: disable=invalid-name - # d = cls.id(Mode(n_modes)) - # annil = zw.Split(2) >> zw.Select(1) @ zw.Id(1) - # create = annil.dagger() - # for idx, dagger in operators: - # if not 0 <= idx < n_modes: - # raise ValueError(f"Index {idx} out of bounds.") - # box = create if dagger else annil - # d = d >> zw.Id(idx) @ box @ zw.Id(n_modes - idx - 1) - - # if scalar != 1: - # # pylint: disable=invalid-name - # d = Scalar(scalar) @ d - # return d + @classmethod + def from_bosonic_operator(cls, n_modes, operators, scalar=1): + """Create a :class:`zw` diagram from a bosonic operator.""" + # pylint: disable=import-outside-toplevel + from optyx.core import zw + + # pylint: disable=invalid-name + d = cls.id(Mode(n_modes)) + annil = zw.Split(2) >> zw.Select(1) @ zw.Id(1) + create = annil.dagger() + for idx, dagger in operators: + if not 0 <= idx < n_modes: + raise ValueError(f"Index {idx} out of bounds.") + box = create if dagger else annil + d = d >> zw.Id(idx) @ box @ zw.Id(n_modes - idx - 1) + + if scalar != 1: + # pylint: disable=invalid-name + d = Scalar(scalar) @ d + return d def to_pyzx(self): # pylint: disable=import-outside-toplevel From 67f588b06f901bd1e937927cebd168316bdd19f8 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Mon, 6 Oct 2025 11:16:38 +0100 Subject: [PATCH 45/59] new readme --- README.md | 770 +++++++- docs/notebooks/readme_example.ipynb | 949 +++++----- .../readme_example_33_0.svg | 1685 +++++++++++++++++ .../readme_example_38_2.svg | 1226 ++++++++++++ .../readme_example_42_2.svg | 1128 +++++++++++ .../readme_example_47_0.svg | 1573 +++++++++++++++ .../readme_example_52_0.svg | 1309 +++++++++++++ .../readme_example_55_1.svg | 830 ++++++++ .../readme_example_5_0.svg | 368 ++++ .../readme_example_61_0.svg | 200 ++ .../readme_example_6_0.svg | 535 ++++++ 11 files changed, 10113 insertions(+), 460 deletions(-) create mode 100644 docs/notebooks/readme_example_files/readme_example_33_0.svg create mode 100644 docs/notebooks/readme_example_files/readme_example_38_2.svg create mode 100644 docs/notebooks/readme_example_files/readme_example_42_2.svg create mode 100644 docs/notebooks/readme_example_files/readme_example_47_0.svg create mode 100644 docs/notebooks/readme_example_files/readme_example_52_0.svg create mode 100644 docs/notebooks/readme_example_files/readme_example_55_1.svg create mode 100644 docs/notebooks/readme_example_files/readme_example_5_0.svg create mode 100644 docs/notebooks/readme_example_files/readme_example_61_0.svg create mode 100644 docs/notebooks/readme_example_files/readme_example_6_0.svg diff --git a/README.md b/README.md index 228b0c0c..c7e63af1 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,777 @@ -# optyx +# Optyx: A ZX-based Python library for networked quantum architectures -Compiler for photonics technologies +Optyx is an open-source Python library for designing, simulating, and optimizing networked, hybrid qubit–photon architectures. It offers a compositional, ZX/ZW-based string-diagram front end (built within the DisCoPy ecosystem) that lets you specify experiments mixing qubit registers with discrete-variable photonic modes, lossy channels, heralded measurements, and classical/quantum feedback. Optyx compiles these diagrams to optimized tensor networks and executes them with state-of-the-art contraction backends (Quimb + Cotengra), delivering substantial speedups on low-depth circuits. The result is an end-to-end workflow—from high-level syntax to numerics—well-suited for rapid prototyping of qubit-photon experiments. -# Development +## Basic Optyx syntax: the Hong-Ou-Mandel effect -## Format the code +We will present the basics of Optyx with a simple example from linear optics. +The Hong–Ou–Mandel (HOM) effect is a two-photon interference phenomenon where indistinguishable photons entering a 50:50 beamsplitter “bunch” and exit together through the same port. When their temporal, spectral, polarization, and spatial modes overlap perfectly, destructive interference suppresses the outcome with one photon in each output. This effect is a standard benchmark for photon indistinguishability and alignment in photonic experiments. + +### Experiment definition + +Circuits in Optyx are diagrams made of typed wires (qubits, photonic modes, classical bits) and generators (gates, sources, optics, measurements). You build them by connecting outputs to inputs (sequence) and placing blocks side-by-side (parallel); types must match at every connection. Generators carry parameters and labels; measurements produce classical wires you can route into later blocks. A circuit is just the set of generators plus the wiring between their ports. + +Let us build a diagram to study the HOM effect. + + +```python +from optyx.photonic import BBS + +# diagram generators: +# beam-splitter +beam_splitter = BBS(0) +beam_splitter.draw() +``` + + + +![svg](./docs/notebooks/readme_example_files/readme_example_5_0.svg) + + + + +```python +from optyx.photonic import Create + +# diagram composition with monoidal syntax +# create two single-photon states and send them to a beam-splitter +hong_ou_mandel = ( + Create(1) @ Create(1) >> + beam_splitter +) + +hong_ou_mandel.draw() +``` + + + +![svg](./docs/notebooks/readme_example_files/readme_example_6_0.svg) + + + +The result of this experiment should be a zero probability of having single photons in two output modes: + + ![HOM](./docs/notebooks/hom.png "Hong-Ou-Mandel Effect") + +### Diagram evaluation + +Call `diagram.eval()` to evaluate a diagram (Quimb backend by default). It returns an evaluated object; use `.tensor.array` to extract the numeric tensor/array, or `.prob_dist()` to get an outcome distribution. You can chain it inline, e.g., `(...).eval().tensor.array`. + + +```python +# an amplitude (raw result of tensor contraction) +from optyx.classical import Select +( + hong_ou_mandel >> Select(1, 1) +).eval().tensor.array +``` + + + + + array(-0.+0.j) + + + + +```python +hong_ou_mandel.eval().prob_dist() +``` + + + + + {(0, 2): 0.5, (1, 1): 4.9303806576313227e-32, (2, 0): 0.5} + + + +## Function syntax and backends: qubit teleportation + +Quantum teleportation transfers an unknown qubit state from sender (Alice) to receiver (Bob) using shared entanglement and two classical bits. Alice performs a joint Bell-state measurement on the unknown qubit and her half of an entangled pair, which projects Bob’s distant qubit into a state related to the original. She sends the two-bit outcome to Bob, who applies a corresponding Pauli correction (I, X, Z, or XZ) to recover the exact state. No information travels faster than light and the original is destroyed by measurement, so the state is relocated—not copied. + +https://en.wikipedia.org/wiki/Quantum_teleportation#/media/File:Quantum_teleportation_circuit.svg : + +Teleportation Protocol + + +```python +from optyx import qubit, bit +from optyx.qubits import Scalar + +from optyx import Channel +from optyx.qubits import Z, X, H, Measure, Scalar, qubit, bit +from optyx.classical import BitControlledGate +``` + +### Define the protocol + + +Instead of wiring generators together with sequential (`>>`) and parallel (`@`) composition (which we call the monoidal syntax), you can treat each generator as a **function on its domain wires**. You **label the wires** and then **call generators with those labels**, which lets you feed specific wires directly into the right box without inserting explicit `Swap`s to reorder them. This makes complex diagrams easier to read and write, and mirrors the style used in **Guppy**; it’s an alternative surface syntax that’s equivalent to the usual `>>`/`@` composition. + + + +```python +# function syntax +# CNOT from ZX generators + +@Channel.from_callable( + dom=qubit @ qubit, cod=qubit @ qubit +) +def cnot(a, b): + c, d = Z(1, 2)(a) + Scalar(2 ** 0.5)() + return c, X(2, 1)(d, b) +``` + + +```python +bell = Scalar(0.5 ** 0.5) @ Z(0, 2) + +@Channel.from_callable( + dom=qubit, cod=qubit +) +def teleportation(c): + a, b = bell() + cc, aa = cnot(c, a) + c_ = Measure(1)(H()(cc)) + a_ = Measure(1)(aa) + bb = BitControlledGate(X(1, 1, 0.5))(a_, b) + return BitControlledGate(Z(1, 1, 0.5))(c_, bb) +``` + + +```python +# function syntax avoids explicit swaps and identity wires +# this is the equivalent monoidal syntax: + +teleportation_monoidal_syntax = ( + qubit @ bell >> + cnot @ qubit >> + H() @ qubit ** 2 >> + Measure(1) @ Measure(1) @ qubit >> + bit @ BitControlledGate(X(1, 1, 0.5)) >> + BitControlledGate(Z(1, 1, 0.5)) +) +``` + +### Verify the protocol + + +```python +import numpy as np +from optyx.qubits import Id + +# both implementations are equivalent +np.allclose( + teleportation.eval().tensor.array, + teleportation_monoidal_syntax.eval().tensor.array, + Id(1).double().to_tensor().eval().array +) +``` + + + + + True + + + +Optyx evaluates diagrams via pluggable backends. By default it compiles a diagram to a tensor network, optimizes a contraction path with **cotengra**, and contracts it with **quimb** (CPU/GPU; dense/sparse). For linear-optical circuits, Optyx also exposes a **Perceval** backend using permanent-based algorithms, and a tensor-network-based **DisCoPy** backend; you can choose among these depending on the task. + + + +```python +# backends (Perceval, Discopy, Quimb) + +from optyx.core.backends import ( + DiscopyBackend, + QuimbBackend +) + +np.allclose( + teleportation.eval(DiscopyBackend()).tensor.array, + teleportation.eval(QuimbBackend()).tensor.array +) ``` -black optyx/ + + + + + True + + + +## Approximate contraction and photon loss: fusion teleportation + +Teleportation with **fusion measurements** uses a Bell pair of dual-rail qubits as the channel: Alice fuses the input with her half using a Type-II fusion, reads the classical outcomes, and Bob applies the corresponding correction. In the **success** branch, the overall map is the **identity** on the teleported qubit up to a known Pauli byproduct, which Bob removes with a conditioned \(X\) correction. In the **failure** branch, the input is effectively measured and the opposite state is prepared at the output. For the standard Type-II scheme this yields identity with probability \(1/2\), and failure otherwise; the paper’s diagrams show both branches explicitly and how the correction restores the state. + + +Ursin, R., Jennewein, T., Aspelmeyer, M. et al. Quantum teleportation across the Danube. Nature 430, 849 (2004). https://doi.org/10.1038/430849a : + +Fusion teleportation across the Danube + +Graphically, the fusion measurement we would like to use, takes the following form: + +Fusion measurement + + +where $\underline{a}, \underline{b}, \underline{c}, \underline{d}$ are the measurement outcomes as the measured photon numbers. + +$\underline{s} = \underline{a} \oplus \underline{b}$ + +$\underline{k} = \underline{s} (\underline{b} + \underline{d}) + \neg \underline s (1 - \frac{\underline{a} + \underline{b}}{2})$ + +### Define the protocol + + +```python +from optyx.photonic import DualRail + +dual_rail_encoded_bell = ( + bell >> + DualRail(1) @ DualRail(1) +) ``` -## Lint the code +```python +from optyx.classical import PostselectBit, BitControlledGate +from optyx.photonic import Phase +from optyx.photonic import HadamardBS, qmode + +# postselect on fusion success +fusion_failure_processing = PostselectBit(1) + +# apply the box if the control bit is 1, otherwise apply an identity channel +correction = BitControlledGate( + HadamardBS() >> + (Phase(0.5) @ qmode) >> + HadamardBS() +) ``` -pflake8 optyx/ -pylint optyx/ + + +```python +from optyx.photonic import FusionTypeII + +@Channel.from_callable( + dom=qubit, cod=qmode @ qmode +) +def fusion_teleportation(a): + dual_rail_encoded_input = DualRail(1)(a) + b, c, d, e = dual_rail_encoded_bell() + s, k = FusionTypeII()(*dual_rail_encoded_input, b, c) + fusion_failure_processing(s) + dr_output_1, dr_output_2 = correction(k, d, e) + return dr_output_1, dr_output_2 ``` -## Test the code + +```python +from optyx.photonic import FusionTypeII + +fusion_teleportation_monoidal_syntax = ( + DualRail(1) @ dual_rail_encoded_bell >> + FusionTypeII() @ qmode**2 >> + fusion_failure_processing @ correction +) + +fusion_teleportation_monoidal_syntax.foliation().draw(figsize=(8, 8)) ``` -pytest . + + + +![svg](./docs/notebooks/readme_example_files/readme_example_33_0.svg) + + + +### Verify the protocol + + +```python +import numpy as np +from optyx.photonic import Id + +array_teleportation = fusion_teleportation_monoidal_syntax.eval().tensor.array +array_dr = (DualRail(1) @ Scalar(0.5**0.5)).double().to_tensor().eval().array + +np.allclose(array_teleportation[:, :, :2, :2, :2, :2], array_dr) + ``` -## Test the code and produce coverage statistics + + + True + + + +### Approximate contraction with Quimb and Cotengra + +Approximate contraction in Optyx uses cotengra to plan a low-cost contraction with memory-aware slicing, then executes it in quimb with optional compression of intermediates. Instead of multiplying tensors exactly, large merges are factorized and truncated (e.g., SVD) so only the dominant singular components are kept; you trade speed and memory for a controlled approximation error. Tightening the truncation tolerance (or increasing the allowed bond size) yields higher accuracy at higher cost, while more aggressive truncation/slicing gives faster, lower-memory contractions with small, quantifiable loss in fidelity. + + +```python +def _flat(x): + return np.asarray(x, dtype=complex).ravel() + +def cosine_similarity(SU, SV): + a, b = _flat(SU), _flat(SV) + num = abs(np.vdot(a, b)) + den = np.linalg.norm(a) * np.linalg.norm(b) + if den == 0: + return 0.0 + return float(num / den) ``` -coverage run -m pytest . -coverage report --fail-under=95 --show-missing + + +```python +from cotengra import HyperCompressedOptimizer + +# cosine similarity between the result of exact contaction and approximate contraction for different chis +errors = [] +for chi in range(1, 6): + optimiser = HyperCompressedOptimizer( + chi=chi + ) + error_for_chi = [] + for _ in range(10): + error_for_chi.append( + cosine_similarity( + fusion_teleportation.eval(QuimbBackend(optimiser)).tensor.array, + array_teleportation + ) + ) + errors.append(np.median(error_for_chi)) + +import matplotlib.pyplot as plt +plt.plot(range(1, 6), errors, marker='o') +plt.grid() +plt.xlabel('Chi') +plt.ylabel('Average cosine similarity') +plt.title('Fusion-based Teleportation similarity vs Contraction Chi') + ``` -## Build the documentation + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + + + + + Text(0.5, 1.0, 'Fusion-based Teleportation similarity vs Contraction Chi') + + + + + +![svg](./docs/notebooks/readme_example_files/readme_example_38_2.svg) + + + +### Photon loss and channel fidelity + +Photon loss is when a photon that should arrive simply doesn’t, so counts drop and patterns get noisier. In Optyx, you model this by placing a dedicated loss generator exactly where the loss occurs; its single parameter is the photon survival probability. Photon loss is the primary failure mode for photonic qubits. In photonic computing it breaks multi-photon interference and reduces the success of fusion/measurement steps. That’s why if we want to study architectures, thresholds, and mitigation (repeaters, multiplexing, loss-tolerant encodings), we need to be able to model photon loss accurately. + + +```python +from optyx.photonic import FusionTypeII, PhotonLoss + +# photo loss is one of the main error sources in photonic quantum computing +def fusion_teleportation_with_photon_loss(p): + @Channel.from_callable( + dom=qubit, cod=qmode**2 + ) + def fusion_teleportation(a): + dr_input_1, dr_input_2 = DualRail(1)(a) + b, c, d, e = dual_rail_encoded_bell() + # apply photon loss to all modes here: + #----------------------------------- + dr_input_1_loss, dr_input_2_loss, b_loss, c_loss, d_loss, e_loss = ( + PhotonLoss(p)(dr_input_1), PhotonLoss(p)(dr_input_2), + PhotonLoss(p)(b), PhotonLoss(p)(c), + PhotonLoss(p)(d), PhotonLoss(p)(e) + ) + #----------------------------------- + s, k = FusionTypeII()(dr_input_1_loss, dr_input_2_loss, b_loss, c_loss) + fusion_failure_processing(s) + output_rail_1, output_rail = correction(k, d_loss, e_loss) + return output_rail_1, output_rail + return fusion_teleportation ``` -sphinx-build docs docs/_build/html + + +```python +from optyx.core.channel import Spider, Diagram + +def get_perm(n): + return sorted(sorted(list(range(n))), key=lambda i: i % 2) + +def channel_fidelity(diagram_1, diagram_2): + bell_1 = Channel.tensor(*[Spider(0, 2, ty) for ty in diagram_1.dom]) + permutation_1 = Diagram.permutation(get_perm(len(bell_1.cod)), bell_1.cod) + + bell_2 = Channel.tensor(*[Spider(0, 2, ty) for ty in diagram_2.dom]) + permutation_2 = Diagram.permutation(get_perm(len(bell_2.cod)), bell_2.cod) + + choi_1 = bell_1 >> permutation_1 >> (diagram_1 @ diagram_1.dom) + choi_2 = bell_2 >> permutation_2 >> (diagram_2 @ diagram_2.dom) + + return (choi_1 >> choi_2.dagger()).eval().tensor.array + +``` + + +```python +import numpy as np +import matplotlib.pyplot as plt + +ps = np.linspace(0.0, 1.0, 20) + +# compute fidelity for different photon loss probabilities +F_avg_vals = [] +succ_probs = [] +for p in ps: + S_impl = fusion_teleportation_with_photon_loss(p) + S_tgt = fusion_teleportation_monoidal_syntax + s = channel_fidelity(S_impl, S_tgt) + + succ_probs.append(s) + +plt.figure() +plt.plot(ps, succ_probs, marker='o') +plt.grid(True) +plt.xlabel('Photon Survival Probability (p)') +plt.ylabel('Fidelity') +plt.title('Fusion-based Teleportation: Photon Survival Probability vs Fidelity') + +``` + + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1719: ComplexWarning: Casting complex values to real discards the imaginary part + return math.isfinite(val) + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1355: ComplexWarning: Casting complex values to real discards the imaginary part + return np.asarray(x, float) + + + + + + Text(0.5, 1.0, 'Fusion-based Teleportation: Photon Survival Probability vs Fidelity') + + + + + +![svg](./docs/notebooks/readme_example_files/readme_example_42_2.svg) + + + +## Photon distinguishability: distributed entanglement generation + +Distributed entanglement generation links two distant quantum nodes (A and B) by creating a shared entangled pair. Each node emits a photon that travels to a shared site, where the photons interfere and a joint (Bell-state) detection flags success — instantly projecting A and B into an entangled state. Because attempts often fail due to loss, the process is repeated-until-success with timing. This is the core primitive behind quantum networks and repeaters, enabling long-distance QKD, teleportation, and multi-node protocols. + +Main, D., Drmota, P., Nadlinger, D.P. et al. Distributed quantum computing across an optical network link. Nature 638, 383–388 (2025). https://doi.org/10.1038/s41586-024-08404-x~ : + +![Distributed entanglement](./docs/notebooks/distributed_entanglement.png "An example of distributed entanglement generation") + + + +### Fusion and photon distinguishability + +#### Define the protocol + + +```python +from optyx.qubits import Z, Scalar, Id, Measure +from optyx.photonic import DualRail +from optyx.classical import PostselectBit +from discopy.drawing import Equation + +bell_state = Z(0, 2) @ Scalar(0.5 ** 0.5) + +# generators introducing new qubits accepting internal states +internal_state_1 = [1, 0] +internal_state_2 = [0, 1] +dual_rail_encoding = lambda state: DualRail(1, internal_states=[state]) +encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(internal_state_2) + +# postselect on fusion success and no errors +post_select = PostselectBit(1) @ PostselectBit(0) + +protocol = ( + bell_state @ bell_state >> + Id(1) @ (encoding_layer >> FusionTypeII() >> post_select) @ Id(1) +) +measure = Measure(2) + +Equation(protocol >> measure, bell_state >> measure).draw(figsize=(8, 8)) +``` + + + +![svg](./docs/notebooks/readme_example_files/readme_example_47_0.svg) + + + +#### Define a set of internal states with varying degrees of distinguishability + +We test how partial photon distinguishability affects a heralded entanglement link. The experiment uses the overlap between two internal two-mode states (`rotated_unit_vectors`), encodes them into dual-rail photons (`dual_rail_encoding`), and performs a Type-II fusion with postselection (`FusionTypeII() >> post_select`). We then project onto the target Bell state (`... >> bell_state.dagger()`) to read off the heralded-state quality, and use a discard step (`... >> Discard(2)`) to extract the success probability. Plotting these versus the state overlap reveals how distinguishability simultaneously degrades fidelity and lowers the entanglement generation rate. + + + +```python +import math + +# internal states - 2 dimensional - move further and further apart +def rotated_unit_vectors(n: int = 10): + for i in range(n): + theta = i * (math.pi / 2) / (n - 1) + yield (math.cos(theta), math.sin(theta)) + +unit_vectors = list(rotated_unit_vectors(15)) +``` + +#### Run the experiments + + +```python +from optyx.qubits import Discard + +inner_product_states = [] +inner_product_bell_states = [] + +result_bell = bell_state.eval().tensor.array.flatten() +result_bell = result_bell / np.linalg.norm(result_bell) + +for vector in unit_vectors: + encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(vector) + experiment = bell_state @ bell_state >> Id(1) @ (encoding_layer >> FusionTypeII() + >> post_select) @ Id(1) + + f = (experiment >> bell_state.dagger()).inflate(2).eval().tensor.array + normalisation = (experiment >> Discard(2)).inflate(2).eval().tensor.array + + inner_product_states.append(np.inner(vector, internal_state_1)) + inner_product_bell_states.append(f/normalisation) +``` + + +```python +import matplotlib.pyplot as plt + +plt.figure(figsize=(6, 4)) +plt.plot(inner_product_states, inner_product_bell_states, marker='o') +plt.xlabel('') +plt.ylabel(' (fidelity)') +plt.title('Fidelity of the resulting state with the perfect Bell state') +plt.grid(True) +plt.show() +``` + + + +![svg](./docs/notebooks/readme_example_files/readme_example_52_0.svg) + + + +## Interfacing with external libraries + +### Graphix + +Open graphs supported only for now (graph + measurements; desire to implement deterministically - no corrections) + + +```python +import graphix + +circuit = graphix.Circuit(2) +circuit.cnot(0, 1) + +pattern = circuit.transpile().pattern + +pattern.draw_graph() +``` + + The pattern is not consistent with flow or gflow structure. + + + + +![svg](./docs/notebooks/readme_example_files/readme_example_55_1.svg) + + + + +```python +simulator = graphix.simulator.PatternSimulator(pattern, backend="statevector") +graphix_result = simulator.run().psi.conj() +``` + + +```python +from optyx import qubits + +optyx_zx = qubits.Circuit(pattern) + +optyx_res = ( + qubits.Ket("+")**2 >> optyx_zx +).eval().amplitudes() +``` + + +```python +for keys in optyx_res.keys(): + assert np.isclose(optyx_res[keys], graphix_result[keys], atol=1e-6) +``` + +### Perceval circuits and processors + +#### Define the protocol in Perceval + + +```python +import perceval as pcvl + +p = pcvl.Processor("SLOS", 6) +p.add(0, pcvl.catalog["postprocessed cnot"].build_processor()) + +p.add(0, pcvl.BS.H()) +p.add(0, pcvl.Detector.pnr()) +p.add(1, pcvl.Detector.pnr()) +p.add(2, pcvl.Detector.pnr()) +p.add(3, pcvl.Detector.pnr()) + +ff_X = pcvl.FFCircuitProvider( + 2, 0, pcvl.Circuit(2) +) +ff_X.add_configuration( + [0, 1], pcvl.PERM([1, 0]) +) +p.add(2, ff_X) + +phi = pcvl.P("phi") +ff_Z = pcvl.FFConfigurator( + 2, 3, + pcvl.PS(phi), + {"phi": 0} +).add_configuration( + [0, 1], + {"phi": np.pi} +) +p.add(0, ff_Z) + +pcvl.pdisplay(p, recursive=True) +``` + + + + + +![svg](./docs/notebooks/readme_example_files/readme_example_61_0.svg) + + + + + +```python +from optyx.qubits import Ket + +state = Ket("+") >> Z(1, 1, 0.3) +state_array = state.eval().tensor.array +state_array = state_array / np.linalg.norm(state_array) +``` + +#### Evaluate the protocol in Perceval + + +```python +to_transmit = (complex(state_array[0])*pcvl.BasicState([1, 0]) + + complex(state_array[1])*pcvl.BasicState([0, 1])) + +sg = pcvl.StateGenerator(pcvl.Encoding.DUAL_RAIL) +bell_state = sg.bell_state("phi+") + +input_state = to_transmit * bell_state +p.min_detected_photons_filter(2) + +input_state *= pcvl.BasicState([0, 0]) + +p.with_input(input_state) +``` + + +```python +result_perceval = p.probs() +``` + +#### Convert to Optyx and simulate + + +```python +from optyx import Channel + +optyx_diagram = Channel.from_perceval(p) +``` + + +```python +from optyx.qubits import Scalar, Ket +from optyx.photonic import DualRail + +bell_state = Z(0, 2) @ Scalar(0.5**0.5) +transmit = Ket("+") >> Z(1, 1, 0.3) + +input_state = transmit @ bell_state + +protocol = ( + input_state >> + DualRail(3) >> + Channel.from_perceval(p) +) +``` + + +```python +result_optyx = protocol.eval().prob_dist() +``` + + +```python +def check_dict_agreement(d1, d2, rtol=1e-5, atol=1e-8): + for key in d1.keys() - d2.keys(): + assert np.isclose(d1[key], 0, rtol=rtol, atol=atol) + for key in d2.keys() - d1.keys(): + assert np.isclose(d2[key], 0, rtol=rtol, atol=atol) + for key in d1.keys() & d2.keys(): + assert np.isclose(d1[key], d2[key], rtol=rtol, atol=atol) +``` + + +```python +check_dict_agreement( + {tuple(k): v for k, v in dict(result_perceval["results"]).items()}, + result_optyx +) +``` + + +```python + ``` diff --git a/docs/notebooks/readme_example.ipynb b/docs/notebooks/readme_example.ipynb index c05af05a..af001cb4 100644 --- a/docs/notebooks/readme_example.ipynb +++ b/docs/notebooks/readme_example.ipynb @@ -8,12 +8,30 @@ "# Optyx: A ZX-based Python library for networked quantum architectures" ] }, + { + "cell_type": "markdown", + "id": "6613f207", + "metadata": {}, + "source": [ + "Optyx is an open-source Python library for designing, simulating, and optimizing networked, hybrid qubit–photon architectures. It offers a compositional, ZX/ZW-based string-diagram front end (built within the DisCoPy ecosystem) that lets you specify experiments mixing qubit registers with discrete-variable photonic modes, lossy channels, heralded measurements, and classical/quantum feedback. Optyx compiles these diagrams to optimized tensor networks and executes them with state-of-the-art contraction backends (Quimb + Cotengra), delivering substantial speedups on low-depth circuits. The result is an end-to-end workflow—from high-level syntax to numerics—well-suited for rapid prototyping of qubit-photon experiments." + ] + }, { "cell_type": "markdown", "id": "b1adf8d9", "metadata": {}, "source": [ - "## Hong-Ou-Mandel effect" + "## Basic Optyx syntax: the Hong-Ou-Mandel effect" + ] + }, + { + "cell_type": "markdown", + "id": "89511ebf", + "metadata": {}, + "source": [ + "We will present the basics of Optyx with a simple example from linear optics. \n", + "\n", + "The Hong–Ou–Mandel (HOM) effect is a two-photon interference phenomenon where indistinguishable photons entering a 50:50 beamsplitter “bunch” and exit together through the same port. When their temporal, spectral, polarization, and spatial modes overlap perfectly, destructive interference suppresses the outcome with one photon in each output. This effect is a standard benchmark for photon indistinguishability and alignment in photonic experiments." ] }, { @@ -21,12 +39,16 @@ "id": "6f3dab5d", "metadata": {}, "source": [ - "### Experiment definition" + "### Experiment definition\n", + "\n", + "Circuits in Optyx are diagrams made of typed wires (qubits, photonic modes, classical bits) and generators (gates, sources, optics, measurements). You build them by connecting outputs to inputs (sequence) and placing blocks side-by-side (parallel); types must match at every connection. Generators carry parameters and labels; measurements produce classical wires you can route into later blocks. A circuit is just the set of generators plus the wiring between their ports.\n", + "\n", + "Let us build a diagram to study the HOM effect." ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "id": "13dbbb3a", "metadata": {}, "outputs": [ @@ -41,7 +63,7 @@ " \n", " \n", " \n", - " 2025-09-23T09:38:17.988554\n", + " 2025-10-06T10:51:58.654000\n", " image/svg+xml\n", " \n", " \n", @@ -70,27 +92,27 @@ "L 151.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pcb02312399)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p7ec12db398)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7ec12db398)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7ec12db398)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7ec12db398)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7ec12db398)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7ec12db398)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -396,7 +418,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -421,7 +443,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "id": "79ab4b08", "metadata": {}, "outputs": [ @@ -436,7 +458,7 @@ " \n", " \n", " \n", - " 2025-09-23T09:38:39.460152\n", + " 2025-10-06T10:51:58.741830\n", " image/svg+xml\n", " \n", " \n", @@ -465,27 +487,27 @@ "L 151.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pb5ed9dbb53)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pa6d6a4a1d2)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa6d6a4a1d2)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa6d6a4a1d2)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa6d6a4a1d2)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa6d6a4a1d2)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa6d6a4a1d2)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa6d6a4a1d2)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa6d6a4a1d2)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -958,7 +980,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -976,6 +998,7 @@ "from optyx.photonic import Create\n", "\n", "# diagram composition with monoidal syntax\n", + "# create two single-photon states and send them to a beam-splitter\n", "hong_ou_mandel = (\n", " Create(1) @ Create(1) >>\n", " beam_splitter\n", @@ -984,6 +1007,14 @@ "hong_ou_mandel.draw()" ] }, + { + "cell_type": "markdown", + "id": "dbdb1109", + "metadata": {}, + "source": [ + "The result of this experiment should be a zero probability of having single photons in two output modes:" + ] + }, { "cell_type": "markdown", "id": "a869643c", @@ -997,12 +1028,14 @@ "id": "94bfc225", "metadata": {}, "source": [ - "### Diagram evaluation" + "### Diagram evaluation\n", + "\n", + "Call `diagram.eval()` to evaluate a diagram (Quimb backend by default). It returns an evaluated object; use `.tensor.array` to extract the numeric tensor/array, or `.prob_dist()` to get an outcome distribution. You can chain it inline, e.g., `(...).eval().tensor.array`." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "id": "f1478f68", "metadata": {}, "outputs": [ @@ -1012,7 +1045,7 @@ "array(-0.+0.j)" ] }, - "execution_count": 3, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -1027,7 +1060,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "id": "801f0884", "metadata": {}, "outputs": [ @@ -1037,7 +1070,7 @@ "{(0, 2): 0.5, (1, 1): 4.9303806576313227e-32, (2, 0): 0.5}" ] }, - "execution_count": 4, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -1051,12 +1084,24 @@ "id": "b1f34bd2", "metadata": {}, "source": [ - "## Qubit teleportation - function syntax and backends" + "## Function syntax and backends: qubit teleportation\n", + "\n", + "Quantum teleportation transfers an unknown qubit state from sender (Alice) to receiver (Bob) using shared entanglement and two classical bits. Alice performs a joint Bell-state measurement on the unknown qubit and her half of an entangled pair, which projects Bob’s distant qubit into a state related to the original. She sends the two-bit outcome to Bob, who applies a corresponding Pauli correction (I, X, Z, or XZ) to recover the exact state. No information travels faster than light and the original is destroyed by measurement, so the state is relocated—not copied." + ] + }, + { + "cell_type": "markdown", + "id": "668cadf7", + "metadata": {}, + "source": [ + "https://en.wikipedia.org/wiki/Quantum_teleportation#/media/File:Quantum_teleportation_circuit.svg :\n", + "\n", + "\"Teleportation" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "47e64a7d", "metadata": {}, "outputs": [], @@ -1074,7 +1119,10 @@ "id": "748d7e3d", "metadata": {}, "source": [ - "### Define the protocol" + "### Define the protocol\n", + "\n", + "\n", + "Instead of wiring generators together with sequential (`>>`) and parallel (`@`) composition (which we call the monoidal syntax), you can treat each generator as a **function on its domain wires**. You **label the wires** and then **call generators with those labels**, which lets you feed specific wires directly into the right box without inserting explicit `Swap`s to reorder them. This makes complex diagrams easier to read and write, and mirrors the style used in **Guppy**; it’s an alternative surface syntax that’s equivalent to the usual `>>`/`@` composition.\n" ] }, { @@ -1096,17 +1144,9 @@ " return c, X(2, 1)(d, b)" ] }, - { - "cell_type": "markdown", - "id": "668cadf7", - "metadata": {}, - "source": [ - "\"Teleportation\n" - ] - }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "8c0301af", "metadata": {}, "outputs": [], @@ -1127,12 +1167,13 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "174c4713", "metadata": {}, "outputs": [], "source": [ "# function syntax avoids explicit swaps and identity wires\n", + "# this is the equivalent monoidal syntax:\n", "\n", "teleportation_monoidal_syntax = (\n", " qubit @ bell >>\n", @@ -1154,7 +1195,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "bb29783a", "metadata": {}, "outputs": [ @@ -1164,7 +1205,7 @@ "True" ] }, - "execution_count": 12, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -1181,9 +1222,17 @@ ")" ] }, + { + "cell_type": "markdown", + "id": "3b8a1829", + "metadata": {}, + "source": [ + "Optyx evaluates diagrams via pluggable backends. By default it compiles a diagram to a tensor network, optimizes a contraction path with **cotengra**, and contracts it with **quimb** (CPU/GPU; dense/sparse). For linear-optical circuits, Optyx also exposes a **Perceval** backend using permanent-based algorithms, and a tensor-network-based **DisCoPy** backend; you can choose among these depending on the task.\n" + ] + }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "id": "25af2db6", "metadata": {}, "outputs": [ @@ -1193,7 +1242,7 @@ "True" ] }, - "execution_count": 14, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -1217,7 +1266,15 @@ "id": "36241fe2", "metadata": {}, "source": [ - "## Fusion teleportation" + "## Approximate contraction and photon loss: fusion teleportation" + ] + }, + { + "cell_type": "markdown", + "id": "8959a31b", + "metadata": {}, + "source": [ + "Teleportation with **fusion measurements** uses a Bell pair of dual-rail qubits as the channel: Alice fuses the input with her half using a Type-II fusion, reads the classical outcomes, and Bob applies the corresponding correction. In the **success** branch, the overall map is the **identity** on the teleported qubit up to a known Pauli byproduct, which Bob removes with a conditioned \\(X\\) correction. In the **failure** branch, the input is effectively measured and the opposite state is prepared at the output. For the standard Type-II scheme this yields identity with probability \\(1/2\\), and failure otherwise; the paper’s diagrams show both branches explicitly and how the correction restores the state.\n" ] }, { @@ -1225,7 +1282,7 @@ "id": "7043700a", "metadata": {}, "source": [ - "Ursin, R., Jennewein, T., Aspelmeyer, M. et al. Quantum teleportation across the Danube. Nature 430, 849 (2004). https://doi.org/10.1038/430849a\n", + "Ursin, R., Jennewein, T., Aspelmeyer, M. et al. Quantum teleportation across the Danube. Nature 430, 849 (2004). https://doi.org/10.1038/430849a :\n", "\n", "\"Fusion" ] @@ -1268,7 +1325,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "id": "c557c4b8", "metadata": {}, "outputs": [], @@ -1283,7 +1340,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "id": "a1764edb", "metadata": {}, "outputs": [], @@ -1305,15 +1362,7 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "e83e3857", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "id": "7bb5e46f", "metadata": {}, "outputs": [], @@ -1334,7 +1383,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 16, "id": "4b5ee771", "metadata": {}, "outputs": [ @@ -1349,7 +1398,7 @@ " \n", " \n", " \n", - " 2025-09-23T09:43:12.181076\n", + " 2025-10-06T10:51:59.571927\n", " image/svg+xml\n", " \n", " \n", @@ -1378,217 +1427,217 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pa48b295a80)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2949,9 +2998,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2986,7 +3035,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2997,7 +3046,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3008,9 +3057,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3021,7 +3070,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3057,7 +3106,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 17, "id": "c19354d7", "metadata": {}, "outputs": [ @@ -3067,7 +3116,7 @@ "True" ] }, - "execution_count": 20, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -3087,12 +3136,14 @@ "id": "6e6b4039", "metadata": {}, "source": [ - "### Approximate contraction with Quimb and Cotengra" + "### Approximate contraction with Quimb and Cotengra\n", + "\n", + "Approximate contraction in Optyx uses cotengra to plan a low-cost contraction with memory-aware slicing, then executes it in quimb with optional compression of intermediates. Instead of multiplying tensors exactly, large merges are factorized and truncated (e.g., SVD) so only the dominant singular components are kept; you trade speed and memory for a controlled approximation error. Tightening the truncation tolerance (or increasing the allowed bond size) yields higher accuracy at higher cost, while more aggressive truncation/slicing gives faster, lower-memory contractions with small, quantifiable loss in fidelity." ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 18, "id": "51acb733", "metadata": {}, "outputs": [], @@ -3111,7 +3162,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 19, "id": "fb497580", "metadata": {}, "outputs": [ @@ -3143,7 +3194,7 @@ "Text(0.5, 1.0, 'Fusion-based Teleportation similarity vs Contraction Chi')" ] }, - "execution_count": 22, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, @@ -3158,7 +3209,7 @@ " \n", " \n", " \n", - " 2025-09-23T09:46:04.540850\n", + " 2025-10-06T10:53:36.366471\n", " image/svg+xml\n", " \n", " \n", @@ -3194,16 +3245,16 @@ " \n", " \n", + "\" clip-path=\"url(#p508842bcea)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3263,11 +3314,11 @@ " \n", " \n", + "\" clip-path=\"url(#p508842bcea)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3310,11 +3361,11 @@ " \n", " \n", + "\" clip-path=\"url(#p508842bcea)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3356,11 +3407,11 @@ " \n", " \n", + "\" clip-path=\"url(#p508842bcea)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3376,11 +3427,11 @@ " \n", " \n", + "\" clip-path=\"url(#p508842bcea)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3430,11 +3481,11 @@ " \n", " \n", + "\" clip-path=\"url(#p508842bcea)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3450,11 +3501,11 @@ " \n", " \n", + "\" clip-path=\"url(#p508842bcea)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3491,11 +3542,11 @@ " \n", " \n", + "\" clip-path=\"url(#p508842bcea)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3511,11 +3562,11 @@ " \n", " \n", + "\" clip-path=\"url(#p508842bcea)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3594,23 +3645,23 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3619,18 +3670,18 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3639,18 +3690,18 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3659,18 +3710,18 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4128,13 +4179,13 @@ " \n", " \n", " \n", + "L 384.668523 37.376688 \n", + "\" clip-path=\"url(#p508842bcea)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4371,7 +4422,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4417,12 +4468,14 @@ "id": "351608f0", "metadata": {}, "source": [ - "### Photon loss and channel fidelity" + "### Photon loss and channel fidelity\n", + "\n", + "Photon loss is when a photon that should arrive simply doesn’t, so counts drop and patterns get noisier. In Optyx, you model this by placing a dedicated loss generator exactly where the loss occurs; its single parameter is the photon survival probability. Photon loss is the primary failure mode for photonic qubits. In photonic computing it breaks multi-photon interference and reduces the success of fusion/measurement steps. That’s why if we want to study architectures, thresholds, and mitigation (repeaters, multiplexing, loss-tolerant encodings), we need to be able to model photon loss accurately." ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 20, "id": "ac439493", "metadata": {}, "outputs": [], @@ -4440,7 +4493,9 @@ " # apply photon loss to all modes here:\n", " #-----------------------------------\n", " dr_input_1_loss, dr_input_2_loss, b_loss, c_loss, d_loss, e_loss = (\n", - " PhotonLoss(p)(dr_input_1), PhotonLoss(p)(dr_input_2), PhotonLoss(p)(b), PhotonLoss(p)(c), PhotonLoss(p)(d), PhotonLoss(p)(e)\n", + " PhotonLoss(p)(dr_input_1), PhotonLoss(p)(dr_input_2),\n", + " PhotonLoss(p)(b), PhotonLoss(p)(c),\n", + " PhotonLoss(p)(d), PhotonLoss(p)(e)\n", " )\n", " #-----------------------------------\n", " s, k = FusionTypeII()(dr_input_1_loss, dr_input_2_loss, b_loss, c_loss)\n", @@ -4452,7 +4507,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 21, "id": "ccefb368", "metadata": {}, "outputs": [], @@ -4477,7 +4532,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 22, "id": "7e1a2957", "metadata": {}, "outputs": [ @@ -4497,7 +4552,7 @@ "Text(0.5, 1.0, 'Fusion-based Teleportation: Photon Survival Probability vs Fidelity')" ] }, - "execution_count": 25, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, @@ -4512,7 +4567,7 @@ " \n", " \n", " \n", - " 2025-09-23T09:46:43.925958\n", + " 2025-10-06T10:53:58.799411\n", " image/svg+xml\n", " \n", " \n", @@ -4548,16 +4603,16 @@ " \n", " \n", + "\" clip-path=\"url(#p1995c5ead3)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4603,11 +4658,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1995c5ead3)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4649,11 +4704,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1995c5ead3)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4690,11 +4745,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1995c5ead3)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4742,11 +4797,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1995c5ead3)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4803,11 +4858,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1995c5ead3)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5209,16 +5264,16 @@ " \n", " \n", + "\" clip-path=\"url(#p1995c5ead3)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5234,11 +5289,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1995c5ead3)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5254,11 +5309,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1995c5ead3)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5274,11 +5329,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1995c5ead3)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5294,11 +5349,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1995c5ead3)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5314,11 +5369,11 @@ " \n", " \n", + "\" clip-path=\"url(#p1995c5ead3)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5431,9 +5486,9 @@ "L 350.49436 92.857257 \n", "L 367.581441 64.923062 \n", "L 384.668523 34.414125 \n", - "\" clip-path=\"url(#p706808287f)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#p1995c5ead3)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -5627,7 +5682,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5670,7 +5725,9 @@ "id": "07c143a0", "metadata": {}, "source": [ - "## Distributed entanglement generation" + "## Photon distinguishability: distributed entanglement generation\n", + "\n", + "Distributed entanglement generation links two distant quantum nodes (A and B) by creating a shared entangled pair. Each node emits a photon that travels to a shared site, where the photons interfere and a joint (Bell-state) detection flags success — instantly projecting A and B into an entangled state. Because attempts often fail due to loss, the process is repeated-until-success with timing. This is the core primitive behind quantum networks and repeaters, enabling long-distance QKD, teleportation, and multi-node protocols." ] }, { @@ -5678,9 +5735,9 @@ "id": "9fa0ec11", "metadata": {}, "source": [ - "![Distributed entanglement](./distributed_entanglement.png \"An example of distributed entanglement generation\")\n", + "Main, D., Drmota, P., Nadlinger, D.P. et al. Distributed quantum computing across an optical network link. Nature 638, 383–388 (2025). https://doi.org/10.1038/s41586-024-08404-x~ :\n", "\n", - "Main, D., Drmota, P., Nadlinger, D.P. et al. Distributed quantum computing across an optical network link. Nature 638, 383–388 (2025). https://doi.org/10.1038/s41586-024-08404-x~\n", + "![Distributed entanglement](./distributed_entanglement.png \"An example of distributed entanglement generation\")\n", "\n" ] }, @@ -5702,7 +5759,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 23, "id": "bdb9611d", "metadata": {}, "outputs": [ @@ -5717,7 +5774,7 @@ " \n", " \n", " \n", - " 2025-09-23T09:47:37.669705\n", + " 2025-10-06T10:53:58.940074\n", " image/svg+xml\n", " \n", " \n", @@ -5746,157 +5803,157 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p1396d7936d)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p575c286d36)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -7204,9 +7261,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -7252,32 +7331,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7322,12 +7379,14 @@ "id": "eb9f34b3", "metadata": {}, "source": [ - "#### Define a set of internal states with varying degrees of distinguishability" + "#### Define a set of internal states with varying degrees of distinguishability\n", + "\n", + "We test how partial photon distinguishability affects a heralded entanglement link. The experiment uses the overlap between two internal two-mode states (`rotated_unit_vectors`), encodes them into dual-rail photons (`dual_rail_encoding`), and performs a Type-II fusion with postselection (`FusionTypeII() >> post_select`). We then project onto the target Bell state (`... >> bell_state.dagger()`) to read off the heralded-state quality, and use a discard step (`... >> Discard(2)`) to extract the success probability. Plotting these versus the state overlap reveals how distinguishability simultaneously degrades fidelity and lowers the entanglement generation rate.\n" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 24, "id": "9e5c4078", "metadata": {}, "outputs": [], @@ -7353,7 +7412,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 25, "id": "30b96ad0", "metadata": {}, "outputs": [], @@ -7380,7 +7439,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 26, "id": "1c50f388", "metadata": {}, "outputs": [ @@ -7395,7 +7454,7 @@ " \n", " \n", " \n", - " 2025-09-23T09:47:37.744591\n", + " 2025-10-06T10:54:29.717692\n", " image/svg+xml\n", " \n", " \n", @@ -7431,16 +7490,16 @@ " \n", " \n", + "\" clip-path=\"url(#p762c8ca300)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7486,11 +7545,11 @@ " \n", " \n", + "\" clip-path=\"url(#p762c8ca300)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7532,11 +7591,11 @@ " \n", " \n", + "\" clip-path=\"url(#p762c8ca300)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7573,11 +7632,11 @@ " \n", " \n", + "\" clip-path=\"url(#p762c8ca300)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7625,11 +7684,11 @@ " \n", " \n", + "\" clip-path=\"url(#p762c8ca300)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7686,11 +7745,11 @@ " \n", " \n", + "\" clip-path=\"url(#p762c8ca300)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7956,16 +8015,16 @@ " \n", " \n", + "\" clip-path=\"url(#p762c8ca300)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8008,11 +8067,11 @@ " \n", " \n", + "\" clip-path=\"url(#p762c8ca300)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8028,11 +8087,11 @@ " \n", " \n", + "\" clip-path=\"url(#p762c8ca300)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8060,11 +8119,11 @@ " \n", " \n", + "\" clip-path=\"url(#p762c8ca300)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8080,11 +8139,11 @@ " \n", " \n", + "\" clip-path=\"url(#p762c8ca300)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8132,11 +8191,11 @@ " \n", " \n", + "\" clip-path=\"url(#p762c8ca300)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8420,9 +8479,9 @@ "L 127.048587 224.015787 \n", "L 93.399222 231.470859 \n", "L 59.321307 233.998125 \n", - "\" clip-path=\"url(#p428f56623c)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#p762c8ca300)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -8691,7 +8750,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8732,12 +8791,12 @@ "source": [ "### Graphix\n", "\n", - "Open graphs only for now (graph + measurements; desire to implement deterministically - no corrections)" + "Open graphs supported only for now (graph + measurements; desire to implement deterministically - no corrections)" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 27, "id": "79f358ae", "metadata": {}, "outputs": [ @@ -8759,7 +8818,7 @@ " \n", " \n", " \n", - " 2025-09-23T09:47:43.571420\n", + " 2025-10-06T10:54:29.815082\n", " image/svg+xml\n", " \n", " \n", @@ -8793,35 +8852,35 @@ " \n", " \n", + "\" clip-path=\"url(#p4ee765351d)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p4ee765351d)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p4ee765351d)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p4ee765351d)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p4ee765351d)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p4ee765351d)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p4ee765351d)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -8940,11 +8999,11 @@ "L 167.778687 33.07423 \n", "L 169.081412 33.262286 \n", "L 170.382137 33.454569 \n", - "\" clip-path=\"url(#p1fd742a0aa)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#p4ee765351d)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9048,7 +9107,7 @@ "\" style=\"fill: none; stroke: #d62728; stroke-linecap: round\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9079,7 +9138,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9103,7 +9162,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9137,7 +9196,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9576,7 +9635,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9603,7 +9662,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 28, "id": "bff50dee", "metadata": {}, "outputs": [], @@ -9614,7 +9673,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 29, "id": "bf2d9106", "metadata": {}, "outputs": [], @@ -9630,7 +9689,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 30, "id": "908e477d", "metadata": {}, "outputs": [], @@ -9657,7 +9716,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 31, "id": "988c9618", "metadata": {}, "outputs": [ @@ -9866,10 +9925,10 @@ "" ], "text/plain": [ - "" + "" ] }, - "execution_count": 35, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -9910,7 +9969,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 32, "id": "96d5bf6b", "metadata": {}, "outputs": [], @@ -9932,7 +9991,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 33, "id": "bce649df", "metadata": {}, "outputs": [], @@ -9953,7 +10012,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 34, "id": "f0c1fbf3", "metadata": {}, "outputs": [], @@ -9971,7 +10030,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 35, "id": "463bcb6f", "metadata": {}, "outputs": [], @@ -9983,7 +10042,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 36, "id": "3f3fca2d", "metadata": {}, "outputs": [], @@ -10005,7 +10064,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 37, "id": "54633b7a", "metadata": {}, "outputs": [], @@ -10015,7 +10074,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 38, "id": "e019251e", "metadata": {}, "outputs": [], @@ -10031,7 +10090,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 39, "id": "ca6102c5", "metadata": {}, "outputs": [], diff --git a/docs/notebooks/readme_example_files/readme_example_33_0.svg b/docs/notebooks/readme_example_files/readme_example_33_0.svg new file mode 100644 index 00000000..50bef7f0 --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_33_0.svg @@ -0,0 +1,1685 @@ + + + + + + + + 2025-10-06T10:51:59.571927 + image/svg+xml + + + Matplotlib v3.10.5, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/notebooks/readme_example_files/readme_example_38_2.svg b/docs/notebooks/readme_example_files/readme_example_38_2.svg new file mode 100644 index 00000000..7d4c313c --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_38_2.svg @@ -0,0 +1,1226 @@ + + + + + + + + 2025-10-06T10:53:36.366471 + image/svg+xml + + + Matplotlib v3.10.5, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/notebooks/readme_example_files/readme_example_42_2.svg b/docs/notebooks/readme_example_files/readme_example_42_2.svg new file mode 100644 index 00000000..8e27a6d0 --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_42_2.svg @@ -0,0 +1,1128 @@ + + + + + + + + 2025-10-06T10:53:58.799411 + image/svg+xml + + + Matplotlib v3.10.5, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/notebooks/readme_example_files/readme_example_47_0.svg b/docs/notebooks/readme_example_files/readme_example_47_0.svg new file mode 100644 index 00000000..774ff1d3 --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_47_0.svg @@ -0,0 +1,1573 @@ + + + + + + + + 2025-10-06T10:53:58.940074 + image/svg+xml + + + Matplotlib v3.10.5, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/notebooks/readme_example_files/readme_example_52_0.svg b/docs/notebooks/readme_example_files/readme_example_52_0.svg new file mode 100644 index 00000000..f4ac6c81 --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_52_0.svg @@ -0,0 +1,1309 @@ + + + + + + + + 2025-10-06T10:54:29.717692 + image/svg+xml + + + Matplotlib v3.10.5, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/notebooks/readme_example_files/readme_example_55_1.svg b/docs/notebooks/readme_example_files/readme_example_55_1.svg new file mode 100644 index 00000000..1482a907 --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_55_1.svg @@ -0,0 +1,830 @@ + + + + + + + + 2025-10-06T10:54:29.815082 + image/svg+xml + + + Matplotlib v3.10.5, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/notebooks/readme_example_files/readme_example_5_0.svg b/docs/notebooks/readme_example_files/readme_example_5_0.svg new file mode 100644 index 00000000..19395a9d --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_5_0.svg @@ -0,0 +1,368 @@ + + + + + + + + 2025-10-06T10:51:58.654000 + image/svg+xml + + + Matplotlib v3.10.5, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/notebooks/readme_example_files/readme_example_61_0.svg b/docs/notebooks/readme_example_files/readme_example_61_0.svg new file mode 100644 index 00000000..bacb5f5e --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_61_0.svg @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + +POSTPROCESSED CNOT + + + + + + + + + +H + + + + + + + + + + + + + + +Θ=1.910633 + + +H + + + + + + +Θ=1.910633 + + +H + + + + + + +Θ=1.910633 + + +H + + + + + + + + + + + + + + + +H + + + + + + + + + + + + + + + + + +H + + + + + + + + + + + + + +PNR + + + +PNR + + + + + + + +FFC + + + +U(FFC) + + + + + + + + + + + + +PNR + + + +PNR + + + + + + + +FFC + + +Φ=phi + + + + + + + + + + + +[herald0] +0 + +[herald1] +0 + +[ctrl] + +[data] + +[ctrl] + +[data] + +[herald0] +0 + +[herald1] +0 +0 +1 +2 +3 +4 +5 +0 +1 +2 +3 +4 +5 + \ No newline at end of file diff --git a/docs/notebooks/readme_example_files/readme_example_6_0.svg b/docs/notebooks/readme_example_files/readme_example_6_0.svg new file mode 100644 index 00000000..66a402d2 --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_6_0.svg @@ -0,0 +1,535 @@ + + + + + + + + 2025-10-06T10:51:58.741830 + image/svg+xml + + + Matplotlib v3.10.5, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 9ba6f39c9e00cbae9b7aba06bf72bc394b87be22 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Mon, 6 Oct 2025 11:31:27 +0100 Subject: [PATCH 46/59] edit README --- README.md | 44 -------------------------------------------- 1 file changed, 44 deletions(-) diff --git a/README.md b/README.md index c7e63af1..03432c34 100644 --- a/README.md +++ b/README.md @@ -354,34 +354,6 @@ plt.ylabel('Average cosine similarity') plt.title('Fusion-based Teleportation similarity vs Contraction Chi') ``` - - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. - warnings.warn( - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. - warnings.warn( - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. - warnings.warn( - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. - warnings.warn( - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. - warnings.warn( - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. - warnings.warn( - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. - warnings.warn( - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. - warnings.warn( - - - - - - Text(0.5, 1.0, 'Fusion-based Teleportation similarity vs Contraction Chi') - - - - - ![svg](./docs/notebooks/readme_example_files/readme_example_38_2.svg) @@ -463,22 +435,6 @@ plt.ylabel('Fidelity') plt.title('Fusion-based Teleportation: Photon Survival Probability vs Fidelity') ``` - - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1719: ComplexWarning: Casting complex values to real discards the imaginary part - return math.isfinite(val) - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1355: ComplexWarning: Casting complex values to real discards the imaginary part - return np.asarray(x, float) - - - - - - Text(0.5, 1.0, 'Fusion-based Teleportation: Photon Survival Probability vs Fidelity') - - - - - ![svg](./docs/notebooks/readme_example_files/readme_example_42_2.svg) From 2579896dcd3e7026a2776376d5219d7c7dfa418b Mon Sep 17 00:00:00 2001 From: Mateusz Kupper Date: Mon, 6 Oct 2025 11:35:26 +0100 Subject: [PATCH 47/59] Update README with clearer explanations --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 03432c34..7c21e36b 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Optyx is an open-source Python library for designing, simulating, and optimizing We will present the basics of Optyx with a simple example from linear optics. -The Hong–Ou–Mandel (HOM) effect is a two-photon interference phenomenon where indistinguishable photons entering a 50:50 beamsplitter “bunch” and exit together through the same port. When their temporal, spectral, polarization, and spatial modes overlap perfectly, destructive interference suppresses the outcome with one photon in each output. This effect is a standard benchmark for photon indistinguishability and alignment in photonic experiments. +The Hong–Ou–Mandel (HOM) effect is a two-photon interference phenomenon where indistinguishable photons entering a 50:50 beamsplitter “bunch” and exit together through the same output register. When their temporal, spectral, polarization, and spatial modes overlap perfectly, destructive interference suppresses the outcome with one photon in each output. This effect is a standard benchmark for photon indistinguishability in photonic experiments. ### Experiment definition @@ -360,7 +360,7 @@ plt.title('Fusion-based Teleportation similarity vs Contraction Chi') ### Photon loss and channel fidelity -Photon loss is when a photon that should arrive simply doesn’t, so counts drop and patterns get noisier. In Optyx, you model this by placing a dedicated loss generator exactly where the loss occurs; its single parameter is the photon survival probability. Photon loss is the primary failure mode for photonic qubits. In photonic computing it breaks multi-photon interference and reduces the success of fusion/measurement steps. That’s why if we want to study architectures, thresholds, and mitigation (repeaters, multiplexing, loss-tolerant encodings), we need to be able to model photon loss accurately. +Photon loss is when a photon that should arrive simply doesn’t. In Optyx, you model this by placing a dedicated loss generator exactly where the loss occurs; its single parameter is the photon survival probability. Photon loss is the primary failure mode for photonic qubits. In photonic computing it breaks multi-photon interference and reduces the success of fusion/measurement steps. That’s why if we want to study architectures, thresholds, and mitigation (repeaters, multiplexing, loss-tolerant encodings), we need to be able to model photon loss accurately. ```python From 4400c20efb8b1563f7e811c0b6e1192f2b59a707 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Mon, 6 Oct 2025 13:39:17 +0100 Subject: [PATCH 48/59] pyzx in readme --- docs/notebooks/readme_example.ipynb | 2725 ++++++++++++++--- docs/notebooks/readme_example.md | 1163 +++++++ .../readme_example_25_0.svg | 1229 ++++++++ .../readme_example_40_0.svg | 1685 ++++++++++ .../readme_example_45_2.svg | 1310 ++++++++ .../readme_example_49_2.svg | 1128 +++++++ .../readme_example_54_0.svg | 1573 ++++++++++ .../readme_example_59_0.svg | 1309 ++++++++ .../readme_example_5_0.svg | 16 +- .../readme_example_62_1.svg | 830 +++++ .../readme_example_68_0.svg | 200 ++ .../readme_example_6_0.svg | 20 +- optyx/core/zx.py | 30 +- 13 files changed, 12699 insertions(+), 519 deletions(-) create mode 100644 docs/notebooks/readme_example.md create mode 100644 docs/notebooks/readme_example_files/readme_example_25_0.svg create mode 100644 docs/notebooks/readme_example_files/readme_example_40_0.svg create mode 100644 docs/notebooks/readme_example_files/readme_example_45_2.svg create mode 100644 docs/notebooks/readme_example_files/readme_example_49_2.svg create mode 100644 docs/notebooks/readme_example_files/readme_example_54_0.svg create mode 100644 docs/notebooks/readme_example_files/readme_example_59_0.svg create mode 100644 docs/notebooks/readme_example_files/readme_example_62_1.svg create mode 100644 docs/notebooks/readme_example_files/readme_example_68_0.svg diff --git a/docs/notebooks/readme_example.ipynb b/docs/notebooks/readme_example.ipynb index af001cb4..3dd8ef0d 100644 --- a/docs/notebooks/readme_example.ipynb +++ b/docs/notebooks/readme_example.ipynb @@ -31,7 +31,7 @@ "source": [ "We will present the basics of Optyx with a simple example from linear optics. \n", "\n", - "The Hong–Ou–Mandel (HOM) effect is a two-photon interference phenomenon where indistinguishable photons entering a 50:50 beamsplitter “bunch” and exit together through the same port. When their temporal, spectral, polarization, and spatial modes overlap perfectly, destructive interference suppresses the outcome with one photon in each output. This effect is a standard benchmark for photon indistinguishability and alignment in photonic experiments." + "The Hong–Ou–Mandel (HOM) effect is a two-photon interference phenomenon where indistinguishable photons entering a 50:50 beamsplitter “bunch” and exit together through the same output register. When their temporal, spectral, polarization, and spatial modes overlap perfectly, destructive interference suppresses the outcome with one photon in each output. This effect is a standard benchmark for photon indistinguishability in photonic experiments." ] }, { @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "id": "13dbbb3a", "metadata": {}, "outputs": [ @@ -63,7 +63,7 @@ " \n", " \n", " \n", - " 2025-10-06T10:51:58.654000\n", + " 2025-10-06T13:32:06.995543\n", " image/svg+xml\n", " \n", " \n", @@ -92,27 +92,27 @@ "L 151.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p7ec12db398)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p99fb8a6430)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p99fb8a6430)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p99fb8a6430)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p99fb8a6430)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p99fb8a6430)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p99fb8a6430)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -418,7 +418,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -443,7 +443,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "id": "79ab4b08", "metadata": {}, "outputs": [ @@ -458,7 +458,7 @@ " \n", " \n", " \n", - " 2025-10-06T10:51:58.741830\n", + " 2025-10-06T13:32:07.037551\n", " image/svg+xml\n", " \n", " \n", @@ -487,27 +487,27 @@ "L 151.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pa6d6a4a1d2)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pfaef8b967d)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pfaef8b967d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pfaef8b967d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pfaef8b967d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pfaef8b967d)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pfaef8b967d)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pfaef8b967d)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pfaef8b967d)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -980,7 +980,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1035,7 +1035,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "id": "f1478f68", "metadata": {}, "outputs": [ @@ -1045,7 +1045,7 @@ "array(-0.+0.j)" ] }, - "execution_count": 5, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -1060,7 +1060,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "id": "801f0884", "metadata": {}, "outputs": [ @@ -1070,7 +1070,7 @@ "{(0, 2): 0.5, (1, 1): 4.9303806576313227e-32, (2, 0): 0.5}" ] }, - "execution_count": 6, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -1101,7 +1101,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "id": "47e64a7d", "metadata": {}, "outputs": [], @@ -1111,7 +1111,8 @@ "\n", "from optyx import Channel\n", "from optyx.qubits import Z, X, H, Measure, Scalar, qubit, bit\n", - "from optyx.classical import BitControlledGate" + "from optyx.classical import BitControlledGate\n", + "from optyx.core import zx, diagram" ] }, { @@ -1127,7 +1128,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "id": "8fa3a149", "metadata": {}, "outputs": [], @@ -1146,13 +1147,30 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "id": "8c0301af", "metadata": {}, "outputs": [], "source": [ "bell = Scalar(0.5 ** 0.5) @ Z(0, 2)\n", "\n", + "controlled_X = Channel(\n", + " \"Controlled-X\",\n", + " zx.X(2, 1) @ diagram.Scalar(2 ** 0.5),\n", + " dom = bit @ qubit,\n", + " cod = qubit\n", + ")\n", + "\n", + "controlled_Z = Channel(\n", + " \"Controlled-Z\",\n", + " (\n", + " zx.H @ diagram.bit >>\n", + " zx.Z(2, 1) @ diagram.Scalar(2 ** 0.5)\n", + " ),\n", + " dom = bit @ qubit,\n", + " cod = qubit\n", + ")\n", + "\n", "@Channel.from_callable(\n", " dom=qubit, cod=qubit\n", ")\n", @@ -1161,104 +1179,1755 @@ " cc, aa = cnot(c, a)\n", " c_ = Measure(1)(H()(cc))\n", " a_ = Measure(1)(aa)\n", - " bb = BitControlledGate(X(1, 1, 0.5))(a_, b)\n", - " return BitControlledGate(Z(1, 1, 0.5))(c_, bb)" + " bb = controlled_X(a_, b)\n", + " return controlled_Z(c_, bb)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "174c4713", + "metadata": {}, + "outputs": [], + "source": [ + "# function syntax avoids explicit swaps and identity wires\n", + "# this is the equivalent monoidal syntax:\n", + "\n", + "teleportation_monoidal_syntax = (\n", + " qubit @ bell >>\n", + " cnot @ qubit >>\n", + " H() @ qubit ** 2 >>\n", + " Measure(1) @ Measure(1) @ qubit >>\n", + " bit @ controlled_X >>\n", + " controlled_Z\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "7fcce92a", + "metadata": {}, + "source": [ + "### Verify the protocol" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "bb29783a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "from optyx.qubits import Id\n", + "\n", + "# both implementations are equivalent\n", + "np.allclose(\n", + " teleportation.eval().tensor.array,\n", + " teleportation_monoidal_syntax.eval().tensor.array,\n", + " Id(1).double().to_tensor().eval().array\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a24d31ac", + "metadata": {}, + "source": [ + "Optyx evaluates diagrams via pluggable backends. By default it compiles a diagram to a tensor network, optimizes a contraction path with **cotengra**, and contracts it with **quimb** (CPU/GPU; dense/sparse). For linear-optical circuits, Optyx also exposes a **Perceval** backend using permanent-based algorithms, and a tensor-network-based **DisCoPy** backend; you can choose among these depending on the task.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "ddf6db65", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# backends (Perceval, Discopy, Quimb)\n", + "\n", + "from optyx.core.backends import (\n", + " DiscopyBackend,\n", + " QuimbBackend\n", + ")\n", + "\n", + "np.allclose(\n", + " teleportation.eval(DiscopyBackend()).tensor.array,\n", + " teleportation.eval(QuimbBackend()).tensor.array\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "984a7c1f", + "metadata": {}, + "source": [ + "### Verify with PyZX" + ] + }, + { + "cell_type": "markdown", + "id": "80e3231d", + "metadata": {}, + "source": [ + "We can obtain the underlying CPTP map by doubling (CP-construction) an Optyx diagram:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "226da509", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-10-06T13:32:08.407976\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "teleportation_monoidal_syntax.double().draw(figsize=(8, 8))" ] }, { - "cell_type": "code", - "execution_count": 10, - "id": "174c4713", + "cell_type": "markdown", + "id": "a405228c", "metadata": {}, - "outputs": [], "source": [ - "# function syntax avoids explicit swaps and identity wires\n", - "# this is the equivalent monoidal syntax:\n", - "\n", - "teleportation_monoidal_syntax = (\n", - " qubit @ bell >>\n", - " cnot @ qubit >>\n", - " H() @ qubit ** 2 >>\n", - " Measure(1) @ Measure(1) @ qubit >>\n", - " bit @ BitControlledGate(X(1, 1, 0.5)) >>\n", - " BitControlledGate(Z(1, 1, 0.5))\n", - ")" + "This way we can use PyZX and its optimisation/simplifications functionalities:" ] }, { - "cell_type": "markdown", - "id": "7fcce92a", + "cell_type": "code", + "execution_count": 12, + "id": "b3db33f9", "metadata": {}, + "outputs": [], "source": [ - "### Verify the protocol" + "import pyzx\n", + "pyzx_graph = teleportation_monoidal_syntax.double().to_pyzx()" ] }, { "cell_type": "code", - "execution_count": 11, - "id": "bb29783a", + "execution_count": 13, + "id": "9574fa05", "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
\n", + "" + ], "text/plain": [ - "True" + "" ] }, - "execution_count": 11, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "import numpy as np\n", - "from optyx.qubits import Id\n", - "\n", - "# both implementations are equivalent\n", - "np.allclose(\n", - " teleportation.eval().tensor.array,\n", - " teleportation_monoidal_syntax.eval().tensor.array,\n", - " Id(1).double().to_tensor().eval().array\n", - ")" + "pyzx.full_reduce(pyzx_graph, quiet=True)\n", + "pyzx_graph.normalize()\n", + "pyzx.draw(pyzx_graph)" ] }, { "cell_type": "markdown", - "id": "3b8a1829", - "metadata": {}, - "source": [ - "Optyx evaluates diagrams via pluggable backends. By default it compiles a diagram to a tensor network, optimizes a contraction path with **cotengra**, and contracts it with **quimb** (CPU/GPU; dense/sparse). For linear-optical circuits, Optyx also exposes a **Perceval** backend using permanent-based algorithms, and a tensor-network-based **DisCoPy** backend; you can choose among these depending on the task.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "25af2db6", + "id": "8ae0bfcb", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "# backends (Perceval, Discopy, Quimb)\n", - "\n", - "from optyx.core.backends import (\n", - " DiscopyBackend,\n", - " QuimbBackend\n", - ")\n", - "\n", - "np.allclose(\n", - " teleportation.eval(DiscopyBackend()).tensor.array,\n", - " teleportation.eval(QuimbBackend()).tensor.array\n", - ")" + "The diagram is a double identity diagram." ] }, { @@ -1325,7 +2994,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "c557c4b8", "metadata": {}, "outputs": [], @@ -1340,7 +3009,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "a1764edb", "metadata": {}, "outputs": [], @@ -1362,7 +3031,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "7bb5e46f", "metadata": {}, "outputs": [], @@ -1383,7 +3052,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "id": "4b5ee771", "metadata": {}, "outputs": [ @@ -1398,7 +3067,7 @@ " \n", " \n", " \n", - " 2025-10-06T10:51:59.571927\n", + " 2025-10-06T13:32:08.799221\n", " image/svg+xml\n", " \n", " \n", @@ -1427,217 +3096,217 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p718c1186ad)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p88d5cb5aac)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2998,9 +4667,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3035,9 +4704,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3046,7 +4715,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3057,9 +4726,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3070,7 +4739,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3106,7 +4775,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "id": "c19354d7", "metadata": {}, "outputs": [ @@ -3116,7 +4785,7 @@ "True" ] }, - "execution_count": 17, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -3143,7 +4812,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "id": "51acb733", "metadata": {}, "outputs": [], @@ -3162,7 +4831,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "id": "fb497580", "metadata": {}, "outputs": [ @@ -3194,7 +4863,7 @@ "Text(0.5, 1.0, 'Fusion-based Teleportation similarity vs Contraction Chi')" ] }, - "execution_count": 19, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, @@ -3209,7 +4878,7 @@ " \n", " \n", " \n", - " 2025-10-06T10:53:36.366471\n", + " 2025-10-06T13:33:52.400270\n", " image/svg+xml\n", " \n", " \n", @@ -3245,16 +4914,16 @@ " \n", " \n", + "\" clip-path=\"url(#pad9bb90c87)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3314,11 +4983,11 @@ " \n", " \n", + "\" clip-path=\"url(#pad9bb90c87)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3361,11 +5030,11 @@ " \n", " \n", + "\" clip-path=\"url(#pad9bb90c87)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3407,11 +5076,11 @@ " \n", " \n", + "\" clip-path=\"url(#pad9bb90c87)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3427,11 +5096,11 @@ " \n", " \n", + "\" clip-path=\"url(#pad9bb90c87)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3481,11 +5150,11 @@ " \n", " \n", + "\" clip-path=\"url(#pad9bb90c87)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3501,11 +5170,11 @@ " \n", " \n", + "\" clip-path=\"url(#pad9bb90c87)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3542,11 +5211,11 @@ " \n", " \n", + "\" clip-path=\"url(#pad9bb90c87)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3562,11 +5231,11 @@ " \n", " \n", + "\" clip-path=\"url(#pad9bb90c87)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3645,83 +5314,83 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4177,15 +5930,15 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", + "L 141.177614 161.304736 \n", + "L 222.34125 115.81409 \n", + "L 303.504886 42.160331 \n", + "L 384.668523 34.414125 \n", + "\" clip-path=\"url(#pad9bb90c87)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4225,7 +5978,7 @@ "L 400.90125 22.318125 \n", "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4422,7 +6175,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4470,12 +6223,12 @@ "source": [ "### Photon loss and channel fidelity\n", "\n", - "Photon loss is when a photon that should arrive simply doesn’t, so counts drop and patterns get noisier. In Optyx, you model this by placing a dedicated loss generator exactly where the loss occurs; its single parameter is the photon survival probability. Photon loss is the primary failure mode for photonic qubits. In photonic computing it breaks multi-photon interference and reduces the success of fusion/measurement steps. That’s why if we want to study architectures, thresholds, and mitigation (repeaters, multiplexing, loss-tolerant encodings), we need to be able to model photon loss accurately." + "Photon loss is when a photon that should arrive simply doesn’t. In Optyx, you model this by placing a dedicated loss generator exactly where the loss occurs; its single parameter is the photon survival probability. Photon loss is the primary failure mode for photonic qubits. In photonic computing it breaks multi-photon interference and reduces the success of fusion/measurement steps. That’s why if we want to study architectures, thresholds, and mitigation (repeaters, multiplexing, loss-tolerant encodings), we need to be able to model photon loss accurately." ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "id": "ac439493", "metadata": {}, "outputs": [], @@ -4507,7 +6260,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "id": "ccefb368", "metadata": {}, "outputs": [], @@ -4532,7 +6285,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "id": "7e1a2957", "metadata": {}, "outputs": [ @@ -4552,7 +6305,7 @@ "Text(0.5, 1.0, 'Fusion-based Teleportation: Photon Survival Probability vs Fidelity')" ] }, - "execution_count": 22, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, @@ -4567,7 +6320,7 @@ " \n", " \n", " \n", - " 2025-10-06T10:53:58.799411\n", + " 2025-10-06T13:34:14.953098\n", " image/svg+xml\n", " \n", " \n", @@ -4603,16 +6356,16 @@ " \n", " \n", + "\" clip-path=\"url(#p9c49fc57d0)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4658,11 +6411,11 @@ " \n", " \n", + "\" clip-path=\"url(#p9c49fc57d0)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4704,11 +6457,11 @@ " \n", " \n", + "\" clip-path=\"url(#p9c49fc57d0)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4745,11 +6498,11 @@ " \n", " \n", + "\" clip-path=\"url(#p9c49fc57d0)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4797,11 +6550,11 @@ " \n", " \n", + "\" clip-path=\"url(#p9c49fc57d0)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4858,11 +6611,11 @@ " \n", " \n", + "\" clip-path=\"url(#p9c49fc57d0)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5264,16 +7017,16 @@ " \n", " \n", + "\" clip-path=\"url(#p9c49fc57d0)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5289,11 +7042,11 @@ " \n", " \n", + "\" clip-path=\"url(#p9c49fc57d0)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5309,11 +7062,11 @@ " \n", " \n", + "\" clip-path=\"url(#p9c49fc57d0)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5329,11 +7082,11 @@ " \n", " \n", + "\" clip-path=\"url(#p9c49fc57d0)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5349,11 +7102,11 @@ " \n", " \n", + "\" clip-path=\"url(#p9c49fc57d0)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5369,11 +7122,11 @@ " \n", " \n", + "\" clip-path=\"url(#p9c49fc57d0)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5486,9 +7239,9 @@ "L 350.49436 92.857257 \n", "L 367.581441 64.923062 \n", "L 384.668523 34.414125 \n", - "\" clip-path=\"url(#p1995c5ead3)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#p9c49fc57d0)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -5682,7 +7435,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5759,7 +7512,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "id": "bdb9611d", "metadata": {}, "outputs": [ @@ -5774,7 +7527,7 @@ " \n", " \n", " \n", - " 2025-10-06T10:53:58.940074\n", + " 2025-10-06T13:34:15.096898\n", " image/svg+xml\n", " \n", " \n", @@ -5803,157 +7556,157 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p575c286d36)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa66bac8181)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -7261,9 +9014,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7298,18 +9051,7 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7331,10 +9073,21 @@ " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7386,7 +9139,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "id": "9e5c4078", "metadata": {}, "outputs": [], @@ -7412,7 +9165,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "id": "30b96ad0", "metadata": {}, "outputs": [], @@ -7439,7 +9192,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "id": "1c50f388", "metadata": {}, "outputs": [ @@ -7454,7 +9207,7 @@ " \n", " \n", " \n", - " 2025-10-06T10:54:29.717692\n", + " 2025-10-06T13:34:45.695603\n", " image/svg+xml\n", " \n", " \n", @@ -7490,16 +9243,16 @@ " \n", " \n", + "\" clip-path=\"url(#p96966be80c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7545,11 +9298,11 @@ " \n", " \n", + "\" clip-path=\"url(#p96966be80c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7591,11 +9344,11 @@ " \n", " \n", + "\" clip-path=\"url(#p96966be80c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7632,11 +9385,11 @@ " \n", " \n", + "\" clip-path=\"url(#p96966be80c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7684,11 +9437,11 @@ " \n", " \n", + "\" clip-path=\"url(#p96966be80c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7745,11 +9498,11 @@ " \n", " \n", + "\" clip-path=\"url(#p96966be80c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8015,16 +9768,16 @@ " \n", " \n", + "\" clip-path=\"url(#p96966be80c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8067,11 +9820,11 @@ " \n", " \n", + "\" clip-path=\"url(#p96966be80c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8087,11 +9840,11 @@ " \n", " \n", + "\" clip-path=\"url(#p96966be80c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8119,11 +9872,11 @@ " \n", " \n", + "\" clip-path=\"url(#p96966be80c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8139,11 +9892,11 @@ " \n", " \n", + "\" clip-path=\"url(#p96966be80c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8191,11 +9944,11 @@ " \n", " \n", + "\" clip-path=\"url(#p96966be80c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8479,9 +10232,9 @@ "L 127.048587 224.015787 \n", "L 93.399222 231.470859 \n", "L 59.321307 233.998125 \n", - "\" clip-path=\"url(#p762c8ca300)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#p96966be80c)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -8750,7 +10503,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8796,7 +10549,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "id": "79f358ae", "metadata": {}, "outputs": [ @@ -8818,7 +10571,7 @@ " \n", " \n", " \n", - " 2025-10-06T10:54:29.815082\n", + " 2025-10-06T13:34:45.798186\n", " image/svg+xml\n", " \n", " \n", @@ -8852,35 +10605,35 @@ " \n", " \n", + "\" clip-path=\"url(#pb710741082)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb710741082)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb710741082)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb710741082)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pb710741082)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb710741082)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pb710741082)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -8999,11 +10752,11 @@ "L 167.778687 33.07423 \n", "L 169.081412 33.262286 \n", "L 170.382137 33.454569 \n", - "\" clip-path=\"url(#p4ee765351d)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#pb710741082)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9107,7 +10860,7 @@ "\" style=\"fill: none; stroke: #d62728; stroke-linecap: round\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9138,7 +10891,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9162,7 +10915,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9196,7 +10949,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9635,7 +11388,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9662,7 +11415,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 29, "id": "bff50dee", "metadata": {}, "outputs": [], @@ -9673,7 +11426,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 30, "id": "bf2d9106", "metadata": {}, "outputs": [], @@ -9689,7 +11442,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 31, "id": "908e477d", "metadata": {}, "outputs": [], @@ -9716,7 +11469,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 32, "id": "988c9618", "metadata": {}, "outputs": [ @@ -9925,10 +11678,10 @@ "" ], "text/plain": [ - "" + "" ] }, - "execution_count": 31, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -9969,7 +11722,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 33, "id": "96d5bf6b", "metadata": {}, "outputs": [], @@ -9991,7 +11744,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 34, "id": "bce649df", "metadata": {}, "outputs": [], @@ -10012,7 +11765,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 35, "id": "f0c1fbf3", "metadata": {}, "outputs": [], @@ -10030,7 +11783,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 36, "id": "463bcb6f", "metadata": {}, "outputs": [], @@ -10042,7 +11795,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 37, "id": "3f3fca2d", "metadata": {}, "outputs": [], @@ -10064,7 +11817,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 38, "id": "54633b7a", "metadata": {}, "outputs": [], @@ -10074,7 +11827,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 39, "id": "e019251e", "metadata": {}, "outputs": [], @@ -10090,7 +11843,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 40, "id": "ca6102c5", "metadata": {}, "outputs": [], diff --git a/docs/notebooks/readme_example.md b/docs/notebooks/readme_example.md new file mode 100644 index 00000000..511bbd3d --- /dev/null +++ b/docs/notebooks/readme_example.md @@ -0,0 +1,1163 @@ +# Optyx: A ZX-based Python library for networked quantum architectures + +Optyx is an open-source Python library for designing, simulating, and optimizing networked, hybrid qubit–photon architectures. It offers a compositional, ZX/ZW-based string-diagram front end (built within the DisCoPy ecosystem) that lets you specify experiments mixing qubit registers with discrete-variable photonic modes, lossy channels, heralded measurements, and classical/quantum feedback. Optyx compiles these diagrams to optimized tensor networks and executes them with state-of-the-art contraction backends (Quimb + Cotengra), delivering substantial speedups on low-depth circuits. The result is an end-to-end workflow—from high-level syntax to numerics—well-suited for rapid prototyping of qubit-photon experiments. + +## Basic Optyx syntax: the Hong-Ou-Mandel effect + +We will present the basics of Optyx with a simple example from linear optics. + +The Hong–Ou–Mandel (HOM) effect is a two-photon interference phenomenon where indistinguishable photons entering a 50:50 beamsplitter “bunch” and exit together through the same output register. When their temporal, spectral, polarization, and spatial modes overlap perfectly, destructive interference suppresses the outcome with one photon in each output. This effect is a standard benchmark for photon indistinguishability in photonic experiments. + +### Experiment definition + +Circuits in Optyx are diagrams made of typed wires (qubits, photonic modes, classical bits) and generators (gates, sources, optics, measurements). You build them by connecting outputs to inputs (sequence) and placing blocks side-by-side (parallel); types must match at every connection. Generators carry parameters and labels; measurements produce classical wires you can route into later blocks. A circuit is just the set of generators plus the wiring between their ports. + +Let us build a diagram to study the HOM effect. + + +```python +from optyx.photonic import BBS + +# diagram generators: +# beam-splitter +beam_splitter = BBS(0) +beam_splitter.draw() +``` + + + +![svg](readme_example_files/readme_example_5_0.svg) + + + + +```python +from optyx.photonic import Create + +# diagram composition with monoidal syntax +# create two single-photon states and send them to a beam-splitter +hong_ou_mandel = ( + Create(1) @ Create(1) >> + beam_splitter +) + +hong_ou_mandel.draw() +``` + + + +![svg](readme_example_files/readme_example_6_0.svg) + + + +The result of this experiment should be a zero probability of having single photons in two output modes: + + ![HOM](./hom.png "Hong-Ou-Mandel Effect") + +### Diagram evaluation + +Call `diagram.eval()` to evaluate a diagram (Quimb backend by default). It returns an evaluated object; use `.tensor.array` to extract the numeric tensor/array, or `.prob_dist()` to get an outcome distribution. You can chain it inline, e.g., `(...).eval().tensor.array`. + + +```python +# an amplitude (raw result of tensor contraction) +from optyx.classical import Select +( + hong_ou_mandel >> Select(1, 1) +).eval().tensor.array +``` + + + + + array(-0.+0.j) + + + + +```python +hong_ou_mandel.eval().prob_dist() +``` + + + + + {(0, 2): 0.5, (1, 1): 4.9303806576313227e-32, (2, 0): 0.5} + + + +## Function syntax and backends: qubit teleportation + +Quantum teleportation transfers an unknown qubit state from sender (Alice) to receiver (Bob) using shared entanglement and two classical bits. Alice performs a joint Bell-state measurement on the unknown qubit and her half of an entangled pair, which projects Bob’s distant qubit into a state related to the original. She sends the two-bit outcome to Bob, who applies a corresponding Pauli correction (I, X, Z, or XZ) to recover the exact state. No information travels faster than light and the original is destroyed by measurement, so the state is relocated—not copied. + +https://en.wikipedia.org/wiki/Quantum_teleportation#/media/File:Quantum_teleportation_circuit.svg : + +Teleportation Protocol + + +```python +from optyx import qubit, bit +from optyx.qubits import Scalar + +from optyx import Channel +from optyx.qubits import Z, X, H, Measure, Scalar, qubit, bit +from optyx.classical import BitControlledGate +from optyx.core import zx, diagram +``` + +### Define the protocol + + +Instead of wiring generators together with sequential (`>>`) and parallel (`@`) composition (which we call the monoidal syntax), you can treat each generator as a **function on its domain wires**. You **label the wires** and then **call generators with those labels**, which lets you feed specific wires directly into the right box without inserting explicit `Swap`s to reorder them. This makes complex diagrams easier to read and write, and mirrors the style used in **Guppy**; it’s an alternative surface syntax that’s equivalent to the usual `>>`/`@` composition. + + + +```python +# function syntax +# CNOT from ZX generators + +@Channel.from_callable( + dom=qubit @ qubit, cod=qubit @ qubit +) +def cnot(a, b): + c, d = Z(1, 2)(a) + Scalar(2 ** 0.5)() + return c, X(2, 1)(d, b) +``` + + +```python +bell = Scalar(0.5 ** 0.5) @ Z(0, 2) + +controlled_X = Channel( + "Controlled-X", + zx.X(2, 1) @ diagram.Scalar(2 ** 0.5), + dom = bit @ qubit, + cod = qubit +) + +controlled_Z = Channel( + "Controlled-Z", + ( + zx.H @ diagram.bit >> + zx.Z(2, 1) @ diagram.Scalar(2 ** 0.5) + ), + dom = bit @ qubit, + cod = qubit +) + +@Channel.from_callable( + dom=qubit, cod=qubit +) +def teleportation(c): + a, b = bell() + cc, aa = cnot(c, a) + c_ = Measure(1)(H()(cc)) + a_ = Measure(1)(aa) + bb = controlled_X(a_, b) + return controlled_Z(c_, bb) +``` + + +```python +# function syntax avoids explicit swaps and identity wires +# this is the equivalent monoidal syntax: + +teleportation_monoidal_syntax = ( + qubit @ bell >> + cnot @ qubit >> + H() @ qubit ** 2 >> + Measure(1) @ Measure(1) @ qubit >> + bit @ controlled_X >> + controlled_Z +) +``` + +### Verify the protocol + + +```python +import numpy as np +from optyx.qubits import Id + +# both implementations are equivalent +np.allclose( + teleportation.eval().tensor.array, + teleportation_monoidal_syntax.eval().tensor.array, + Id(1).double().to_tensor().eval().array +) +``` + + + + + True + + + +Optyx evaluates diagrams via pluggable backends. By default it compiles a diagram to a tensor network, optimizes a contraction path with **cotengra**, and contracts it with **quimb** (CPU/GPU; dense/sparse). For linear-optical circuits, Optyx also exposes a **Perceval** backend using permanent-based algorithms, and a tensor-network-based **DisCoPy** backend; you can choose among these depending on the task. + + + +```python +# backends (Perceval, Discopy, Quimb) + +from optyx.core.backends import ( + DiscopyBackend, + QuimbBackend +) + +np.allclose( + teleportation.eval(DiscopyBackend()).tensor.array, + teleportation.eval(QuimbBackend()).tensor.array +) +``` + + + + + True + + + +### Verify with PyZX + +We can obtain the underlying CPTP map by doubling (CP-construction) an Optyx diagram: + + +```python +teleportation_monoidal_syntax.double().draw(figsize=(8, 8)) +``` + + + +![svg](readme_example_files/readme_example_25_0.svg) + + + +This way we can use PyZX and its optimisation/simplifications functionalities: + + +```python +import pyzx +pyzx_graph = teleportation_monoidal_syntax.double().to_pyzx() +``` + + +```python +pyzx.full_reduce(pyzx_graph, quiet=True) +pyzx_graph.normalize() +pyzx.draw(pyzx_graph) +``` + + +
+ + + +The diagram is a double identity diagram. + +## Approximate contraction and photon loss: fusion teleportation + +Teleportation with **fusion measurements** uses a Bell pair of dual-rail qubits as the channel: Alice fuses the input with her half using a Type-II fusion, reads the classical outcomes, and Bob applies the corresponding correction. In the **success** branch, the overall map is the **identity** on the teleported qubit up to a known Pauli byproduct, which Bob removes with a conditioned \(X\) correction. In the **failure** branch, the input is effectively measured and the opposite state is prepared at the output. For the standard Type-II scheme this yields identity with probability \(1/2\), and failure otherwise; the paper’s diagrams show both branches explicitly and how the correction restores the state. + + +Ursin, R., Jennewein, T., Aspelmeyer, M. et al. Quantum teleportation across the Danube. Nature 430, 849 (2004). https://doi.org/10.1038/430849a : + +Fusion teleportation across the Danube + +Graphically, the fusion measurement we would like to use, takes the following form: + +Fusion measurement + + +where $\underline{a}, \underline{b}, \underline{c}, \underline{d}$ are the measurement outcomes as the measured photon numbers. + +$\underline{s} = \underline{a} \oplus \underline{b}$ + +$\underline{k} = \underline{s} (\underline{b} + \underline{d}) + \neg \underline s (1 - \frac{\underline{a} + \underline{b}}{2})$ + +### Define the protocol + + +```python +from optyx.photonic import DualRail + +dual_rail_encoded_bell = ( + bell >> + DualRail(1) @ DualRail(1) +) +``` + + +```python +from optyx.classical import PostselectBit, BitControlledGate +from optyx.photonic import Phase +from optyx.photonic import HadamardBS, qmode + +# postselect on fusion success +fusion_failure_processing = PostselectBit(1) + +# apply the box if the control bit is 1, otherwise apply an identity channel +correction = BitControlledGate( + HadamardBS() >> + (Phase(0.5) @ qmode) >> + HadamardBS() +) +``` + + +```python +from optyx.photonic import FusionTypeII + +@Channel.from_callable( + dom=qubit, cod=qmode @ qmode +) +def fusion_teleportation(a): + dual_rail_encoded_input = DualRail(1)(a) + b, c, d, e = dual_rail_encoded_bell() + s, k = FusionTypeII()(*dual_rail_encoded_input, b, c) + fusion_failure_processing(s) + dr_output_1, dr_output_2 = correction(k, d, e) + return dr_output_1, dr_output_2 +``` + + +```python +from optyx.photonic import FusionTypeII + +fusion_teleportation_monoidal_syntax = ( + DualRail(1) @ dual_rail_encoded_bell >> + FusionTypeII() @ qmode**2 >> + fusion_failure_processing @ correction +) + +fusion_teleportation_monoidal_syntax.foliation().draw(figsize=(8, 8)) + +``` + + + +![svg](readme_example_files/readme_example_40_0.svg) + + + +### Verify the protocol + + +```python +import numpy as np +from optyx.photonic import Id + +array_teleportation = fusion_teleportation_monoidal_syntax.eval().tensor.array +array_dr = (DualRail(1) @ Scalar(0.5**0.5)).double().to_tensor().eval().array + +np.allclose(array_teleportation[:, :, :2, :2, :2, :2], array_dr) + +``` + + + + + True + + + +### Approximate contraction with Quimb and Cotengra + +Approximate contraction in Optyx uses cotengra to plan a low-cost contraction with memory-aware slicing, then executes it in quimb with optional compression of intermediates. Instead of multiplying tensors exactly, large merges are factorized and truncated (e.g., SVD) so only the dominant singular components are kept; you trade speed and memory for a controlled approximation error. Tightening the truncation tolerance (or increasing the allowed bond size) yields higher accuracy at higher cost, while more aggressive truncation/slicing gives faster, lower-memory contractions with small, quantifiable loss in fidelity. + + +```python +def _flat(x): + return np.asarray(x, dtype=complex).ravel() + +def cosine_similarity(SU, SV): + a, b = _flat(SU), _flat(SV) + num = abs(np.vdot(a, b)) + den = np.linalg.norm(a) * np.linalg.norm(b) + if den == 0: + return 0.0 + return float(num / den) +``` + + +```python +from cotengra import HyperCompressedOptimizer + +# cosine similarity between the result of exact contaction and approximate contraction for different chis +errors = [] +for chi in range(1, 6): + optimiser = HyperCompressedOptimizer( + chi=chi + ) + error_for_chi = [] + for _ in range(10): + error_for_chi.append( + cosine_similarity( + fusion_teleportation.eval(QuimbBackend(optimiser)).tensor.array, + array_teleportation + ) + ) + errors.append(np.median(error_for_chi)) + +import matplotlib.pyplot as plt +plt.plot(range(1, 6), errors, marker='o') +plt.grid() +plt.xlabel('Chi') +plt.ylabel('Average cosine similarity') +plt.title('Fusion-based Teleportation similarity vs Contraction Chi') + +``` + + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + + + + + + Text(0.5, 1.0, 'Fusion-based Teleportation similarity vs Contraction Chi') + + + + + +![svg](readme_example_files/readme_example_45_2.svg) + + + +### Photon loss and channel fidelity + +Photon loss is when a photon that should arrive simply doesn’t. In Optyx, you model this by placing a dedicated loss generator exactly where the loss occurs; its single parameter is the photon survival probability. Photon loss is the primary failure mode for photonic qubits. In photonic computing it breaks multi-photon interference and reduces the success of fusion/measurement steps. That’s why if we want to study architectures, thresholds, and mitigation (repeaters, multiplexing, loss-tolerant encodings), we need to be able to model photon loss accurately. + + +```python +from optyx.photonic import FusionTypeII, PhotonLoss + +# photo loss is one of the main error sources in photonic quantum computing +def fusion_teleportation_with_photon_loss(p): + @Channel.from_callable( + dom=qubit, cod=qmode**2 + ) + def fusion_teleportation(a): + dr_input_1, dr_input_2 = DualRail(1)(a) + b, c, d, e = dual_rail_encoded_bell() + # apply photon loss to all modes here: + #----------------------------------- + dr_input_1_loss, dr_input_2_loss, b_loss, c_loss, d_loss, e_loss = ( + PhotonLoss(p)(dr_input_1), PhotonLoss(p)(dr_input_2), + PhotonLoss(p)(b), PhotonLoss(p)(c), + PhotonLoss(p)(d), PhotonLoss(p)(e) + ) + #----------------------------------- + s, k = FusionTypeII()(dr_input_1_loss, dr_input_2_loss, b_loss, c_loss) + fusion_failure_processing(s) + output_rail_1, output_rail = correction(k, d_loss, e_loss) + return output_rail_1, output_rail + return fusion_teleportation +``` + + +```python +from optyx.core.channel import Spider, Diagram + +def get_perm(n): + return sorted(sorted(list(range(n))), key=lambda i: i % 2) + +def channel_fidelity(diagram_1, diagram_2): + bell_1 = Channel.tensor(*[Spider(0, 2, ty) for ty in diagram_1.dom]) + permutation_1 = Diagram.permutation(get_perm(len(bell_1.cod)), bell_1.cod) + + bell_2 = Channel.tensor(*[Spider(0, 2, ty) for ty in diagram_2.dom]) + permutation_2 = Diagram.permutation(get_perm(len(bell_2.cod)), bell_2.cod) + + choi_1 = bell_1 >> permutation_1 >> (diagram_1 @ diagram_1.dom) + choi_2 = bell_2 >> permutation_2 >> (diagram_2 @ diagram_2.dom) + + return (choi_1 >> choi_2.dagger()).eval().tensor.array + +``` + + +```python +import numpy as np +import matplotlib.pyplot as plt + +ps = np.linspace(0.0, 1.0, 20) + +# compute fidelity for different photon loss probabilities +F_avg_vals = [] +succ_probs = [] +for p in ps: + S_impl = fusion_teleportation_with_photon_loss(p) + S_tgt = fusion_teleportation_monoidal_syntax + s = channel_fidelity(S_impl, S_tgt) + + succ_probs.append(s) + +plt.figure() +plt.plot(ps, succ_probs, marker='o') +plt.grid(True) +plt.xlabel('Photon Survival Probability (p)') +plt.ylabel('Fidelity') +plt.title('Fusion-based Teleportation: Photon Survival Probability vs Fidelity') + +``` + + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1719: ComplexWarning: Casting complex values to real discards the imaginary part + return math.isfinite(val) + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1355: ComplexWarning: Casting complex values to real discards the imaginary part + return np.asarray(x, float) + + + + + + Text(0.5, 1.0, 'Fusion-based Teleportation: Photon Survival Probability vs Fidelity') + + + + + +![svg](readme_example_files/readme_example_49_2.svg) + + + +## Photon distinguishability: distributed entanglement generation + +Distributed entanglement generation links two distant quantum nodes (A and B) by creating a shared entangled pair. Each node emits a photon that travels to a shared site, where the photons interfere and a joint (Bell-state) detection flags success — instantly projecting A and B into an entangled state. Because attempts often fail due to loss, the process is repeated-until-success with timing. This is the core primitive behind quantum networks and repeaters, enabling long-distance QKD, teleportation, and multi-node protocols. + +Main, D., Drmota, P., Nadlinger, D.P. et al. Distributed quantum computing across an optical network link. Nature 638, 383–388 (2025). https://doi.org/10.1038/s41586-024-08404-x~ : + +![Distributed entanglement](./distributed_entanglement.png "An example of distributed entanglement generation") + + + +### Fusion and photon distinguishability + +#### Define the protocol + + +```python +from optyx.qubits import Z, Scalar, Id, Measure +from optyx.photonic import DualRail +from optyx.classical import PostselectBit +from discopy.drawing import Equation + +bell_state = Z(0, 2) @ Scalar(0.5 ** 0.5) + +# generators introducing new qubits accepting internal states +internal_state_1 = [1, 0] +internal_state_2 = [0, 1] +dual_rail_encoding = lambda state: DualRail(1, internal_states=[state]) +encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(internal_state_2) + +# postselect on fusion success and no errors +post_select = PostselectBit(1) @ PostselectBit(0) + +protocol = ( + bell_state @ bell_state >> + Id(1) @ (encoding_layer >> FusionTypeII() >> post_select) @ Id(1) +) +measure = Measure(2) + +Equation(protocol >> measure, bell_state >> measure).draw(figsize=(8, 8)) +``` + + + +![svg](readme_example_files/readme_example_54_0.svg) + + + +#### Define a set of internal states with varying degrees of distinguishability + +We test how partial photon distinguishability affects a heralded entanglement link. The experiment uses the overlap between two internal two-mode states (`rotated_unit_vectors`), encodes them into dual-rail photons (`dual_rail_encoding`), and performs a Type-II fusion with postselection (`FusionTypeII() >> post_select`). We then project onto the target Bell state (`... >> bell_state.dagger()`) to read off the heralded-state quality, and use a discard step (`... >> Discard(2)`) to extract the success probability. Plotting these versus the state overlap reveals how distinguishability simultaneously degrades fidelity and lowers the entanglement generation rate. + + + +```python +import math + +# internal states - 2 dimensional - move further and further apart +def rotated_unit_vectors(n: int = 10): + for i in range(n): + theta = i * (math.pi / 2) / (n - 1) + yield (math.cos(theta), math.sin(theta)) + +unit_vectors = list(rotated_unit_vectors(15)) +``` + +#### Run the experiments + + +```python +from optyx.qubits import Discard + +inner_product_states = [] +inner_product_bell_states = [] + +result_bell = bell_state.eval().tensor.array.flatten() +result_bell = result_bell / np.linalg.norm(result_bell) + +for vector in unit_vectors: + encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(vector) + experiment = bell_state @ bell_state >> Id(1) @ (encoding_layer >> FusionTypeII() + >> post_select) @ Id(1) + + f = (experiment >> bell_state.dagger()).inflate(2).eval().tensor.array + normalisation = (experiment >> Discard(2)).inflate(2).eval().tensor.array + + inner_product_states.append(np.inner(vector, internal_state_1)) + inner_product_bell_states.append(f/normalisation) +``` + + +```python +import matplotlib.pyplot as plt + +plt.figure(figsize=(6, 4)) +plt.plot(inner_product_states, inner_product_bell_states, marker='o') +plt.xlabel('') +plt.ylabel(' (fidelity)') +plt.title('Fidelity of the resulting state with the perfect Bell state') +plt.grid(True) +plt.show() +``` + + + +![svg](readme_example_files/readme_example_59_0.svg) + + + +## Interfacing with external libraries + +### Graphix + +Open graphs supported only for now (graph + measurements; desire to implement deterministically - no corrections) + + +```python +import graphix + +circuit = graphix.Circuit(2) +circuit.cnot(0, 1) + +pattern = circuit.transpile().pattern + +pattern.draw_graph() +``` + + The pattern is not consistent with flow or gflow structure. + + + + +![svg](readme_example_files/readme_example_62_1.svg) + + + + +```python +simulator = graphix.simulator.PatternSimulator(pattern, backend="statevector") +graphix_result = simulator.run().psi.conj() +``` + + +```python +from optyx import qubits + +optyx_zx = qubits.Circuit(pattern) + +optyx_res = ( + qubits.Ket("+")**2 >> optyx_zx +).eval().amplitudes() +``` + + +```python +for keys in optyx_res.keys(): + assert np.isclose(optyx_res[keys], graphix_result[keys], atol=1e-6) +``` + +### Perceval circuits and processors + +#### Define the protocol in Perceval + + +```python +import perceval as pcvl + +p = pcvl.Processor("SLOS", 6) +p.add(0, pcvl.catalog["postprocessed cnot"].build_processor()) + +p.add(0, pcvl.BS.H()) +p.add(0, pcvl.Detector.pnr()) +p.add(1, pcvl.Detector.pnr()) +p.add(2, pcvl.Detector.pnr()) +p.add(3, pcvl.Detector.pnr()) + +ff_X = pcvl.FFCircuitProvider( + 2, 0, pcvl.Circuit(2) +) +ff_X.add_configuration( + [0, 1], pcvl.PERM([1, 0]) +) +p.add(2, ff_X) + +phi = pcvl.P("phi") +ff_Z = pcvl.FFConfigurator( + 2, 3, + pcvl.PS(phi), + {"phi": 0} +).add_configuration( + [0, 1], + {"phi": np.pi} +) +p.add(0, ff_Z) + +pcvl.pdisplay(p, recursive=True) +``` + + + + + +![svg](readme_example_files/readme_example_68_0.svg) + + + + + +```python +from optyx.qubits import Ket + +state = Ket("+") >> Z(1, 1, 0.3) +state_array = state.eval().tensor.array +state_array = state_array / np.linalg.norm(state_array) +``` + +#### Evaluate the protocol in Perceval + + +```python +to_transmit = (complex(state_array[0])*pcvl.BasicState([1, 0]) + + complex(state_array[1])*pcvl.BasicState([0, 1])) + +sg = pcvl.StateGenerator(pcvl.Encoding.DUAL_RAIL) +bell_state = sg.bell_state("phi+") + +input_state = to_transmit * bell_state +p.min_detected_photons_filter(2) + +input_state *= pcvl.BasicState([0, 0]) + +p.with_input(input_state) +``` + + +```python +result_perceval = p.probs() +``` + +#### Convert to Optyx and simulate + + +```python +from optyx import Channel + +optyx_diagram = Channel.from_perceval(p) +``` + + +```python +from optyx.qubits import Scalar, Ket +from optyx.photonic import DualRail + +bell_state = Z(0, 2) @ Scalar(0.5**0.5) +transmit = Ket("+") >> Z(1, 1, 0.3) + +input_state = transmit @ bell_state + +protocol = ( + input_state >> + DualRail(3) >> + Channel.from_perceval(p) +) +``` + + +```python +result_optyx = protocol.eval().prob_dist() +``` + + +```python +def check_dict_agreement(d1, d2, rtol=1e-5, atol=1e-8): + for key in d1.keys() - d2.keys(): + assert np.isclose(d1[key], 0, rtol=rtol, atol=atol) + for key in d2.keys() - d1.keys(): + assert np.isclose(d2[key], 0, rtol=rtol, atol=atol) + for key in d1.keys() & d2.keys(): + assert np.isclose(d1[key], d2[key], rtol=rtol, atol=atol) +``` + + +```python +check_dict_agreement( + {tuple(k): v for k, v in dict(result_perceval["results"]).items()}, + result_optyx +) +``` + + +```python + +``` diff --git a/docs/notebooks/readme_example_files/readme_example_25_0.svg b/docs/notebooks/readme_example_files/readme_example_25_0.svg new file mode 100644 index 00000000..7307c0da --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_25_0.svg @@ -0,0 +1,1229 @@ + + + + + + + + 2025-10-06T13:32:08.407976 + image/svg+xml + + + Matplotlib v3.10.5, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/notebooks/readme_example_files/readme_example_40_0.svg b/docs/notebooks/readme_example_files/readme_example_40_0.svg new file mode 100644 index 00000000..ee9079c2 --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_40_0.svg @@ -0,0 +1,1685 @@ + + + + + + + + 2025-10-06T13:32:08.799221 + image/svg+xml + + + Matplotlib v3.10.5, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/notebooks/readme_example_files/readme_example_45_2.svg b/docs/notebooks/readme_example_files/readme_example_45_2.svg new file mode 100644 index 00000000..9ec11e07 --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_45_2.svg @@ -0,0 +1,1310 @@ + + + + + + + + 2025-10-06T13:33:52.400270 + image/svg+xml + + + Matplotlib v3.10.5, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/notebooks/readme_example_files/readme_example_49_2.svg b/docs/notebooks/readme_example_files/readme_example_49_2.svg new file mode 100644 index 00000000..aca22b95 --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_49_2.svg @@ -0,0 +1,1128 @@ + + + + + + + + 2025-10-06T13:34:14.953098 + image/svg+xml + + + Matplotlib v3.10.5, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/notebooks/readme_example_files/readme_example_54_0.svg b/docs/notebooks/readme_example_files/readme_example_54_0.svg new file mode 100644 index 00000000..c61b12e0 --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_54_0.svg @@ -0,0 +1,1573 @@ + + + + + + + + 2025-10-06T13:34:15.096898 + image/svg+xml + + + Matplotlib v3.10.5, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/notebooks/readme_example_files/readme_example_59_0.svg b/docs/notebooks/readme_example_files/readme_example_59_0.svg new file mode 100644 index 00000000..d18f33a1 --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_59_0.svg @@ -0,0 +1,1309 @@ + + + + + + + + 2025-10-06T13:34:45.695603 + image/svg+xml + + + Matplotlib v3.10.5, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/notebooks/readme_example_files/readme_example_5_0.svg b/docs/notebooks/readme_example_files/readme_example_5_0.svg index 19395a9d..f1c74db0 100644 --- a/docs/notebooks/readme_example_files/readme_example_5_0.svg +++ b/docs/notebooks/readme_example_files/readme_example_5_0.svg @@ -6,7 +6,7 @@ - 2025-10-06T10:51:58.654000 + 2025-10-06T13:32:06.995543 image/svg+xml @@ -35,27 +35,27 @@ L 151.2 79.2 L 151.2 7.2 L 7.2 7.2 z -" clip-path="url(#p7ec12db398)" style="fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter"/> +" clip-path="url(#p99fb8a6430)" style="fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter"/>
+" clip-path="url(#p99fb8a6430)" style="fill: none; stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#p99fb8a6430)" style="fill: none; stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#p99fb8a6430)" style="fill: none; stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#p99fb8a6430)" style="fill: none; stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#p99fb8a6430)" style="fill: #ffffff; stroke: #000000; stroke-linejoin: miter"/> @@ -361,7 +361,7 @@ z
- + diff --git a/docs/notebooks/readme_example_files/readme_example_62_1.svg b/docs/notebooks/readme_example_files/readme_example_62_1.svg new file mode 100644 index 00000000..db87cb36 --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_62_1.svg @@ -0,0 +1,830 @@ + + + + + + + + 2025-10-06T13:34:45.798186 + image/svg+xml + + + Matplotlib v3.10.5, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/notebooks/readme_example_files/readme_example_68_0.svg b/docs/notebooks/readme_example_files/readme_example_68_0.svg new file mode 100644 index 00000000..bacb5f5e --- /dev/null +++ b/docs/notebooks/readme_example_files/readme_example_68_0.svg @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + +POSTPROCESSED CNOT + + + + + + + + + +H + + + + + + + + + + + + + + +Θ=1.910633 + + +H + + + + + + +Θ=1.910633 + + +H + + + + + + +Θ=1.910633 + + +H + + + + + + + + + + + + + + + +H + + + + + + + + + + + + + + + + + +H + + + + + + + + + + + + + +PNR + + + +PNR + + + + + + + +FFC + + + +U(FFC) + + + + + + + + + + + + +PNR + + + +PNR + + + + + + + +FFC + + +Φ=phi + + + + + + + + + + + +[herald0] +0 + +[herald1] +0 + +[ctrl] + +[data] + +[ctrl] + +[data] + +[herald0] +0 + +[herald1] +0 +0 +1 +2 +3 +4 +5 +0 +1 +2 +3 +4 +5 + \ No newline at end of file diff --git a/docs/notebooks/readme_example_files/readme_example_6_0.svg b/docs/notebooks/readme_example_files/readme_example_6_0.svg index 66a402d2..57da6828 100644 --- a/docs/notebooks/readme_example_files/readme_example_6_0.svg +++ b/docs/notebooks/readme_example_files/readme_example_6_0.svg @@ -6,7 +6,7 @@ - 2025-10-06T10:51:58.741830 + 2025-10-06T13:32:07.037551 image/svg+xml @@ -35,27 +35,27 @@ L 151.2 223.2 L 151.2 7.2 L 7.2 7.2 z -" clip-path="url(#pa6d6a4a1d2)" style="fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter"/> +" clip-path="url(#pfaef8b967d)" style="fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter"/>
+" clip-path="url(#pfaef8b967d)" style="fill: none; stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pfaef8b967d)" style="fill: none; stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pfaef8b967d)" style="fill: none; stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pfaef8b967d)" style="fill: none; stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pfaef8b967d)" style="fill: #ffffff; stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pfaef8b967d)" style="fill: #ffffff; stroke: #000000; stroke-linejoin: miter"/> +" clip-path="url(#pfaef8b967d)" style="fill: #ffffff; stroke: #000000; stroke-linejoin: miter"/> @@ -528,7 +528,7 @@ z
- + diff --git a/optyx/core/zx.py b/optyx/core/zx.py index 71c524a7..d73469b3 100644 --- a/optyx/core/zx.py +++ b/optyx/core/zx.py @@ -338,21 +338,21 @@ def to_pyzx(self): elif box == H: node, hadamard = scan[offset] scan[offset] = (node, not hadamard) - # elif isinstance(box, diagram.Spider): - # node = graph.add_vertex( - # VertexType.Z, - # phase=box.phase * 2 if box.phase else None, - # ) - # graph.set_position(node, offset, row + 1) - # for i, _ in enumerate(box.dom): - # source, hadamard = scan[offset + i] - # etype = EdgeType.HADAMARD if hadamard else EdgeType.SIMPLE - # graph.add_edge((source, node), etype) - # scan = ( - # scan[:offset] - # + len(box.cod) * [(node, False)] - # + scan[offset + len(box.dom):] - # ) + elif isinstance(box, diagram.Spider): + node = graph.add_vertex( + VertexType.Z, + phase=box.phase * 2 if box.phase else None, + ) + graph.set_position(node, offset, row + 1) + for i, _ in enumerate(box.dom): + source, hadamard = scan[offset + i] + etype = EdgeType.HADAMARD if hadamard else EdgeType.SIMPLE + graph.add_edge((source, node), etype) + scan = ( + scan[:offset] + + len(box.cod) * [(node, False)] + + scan[offset + len(box.dom):] + ) else: raise NotImplementedError for i, _ in enumerate(self.cod): From 93e079e4ab0f5406bd6aac4a58be8a056c4b8d27 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Mon, 6 Oct 2025 13:42:17 +0100 Subject: [PATCH 49/59] readme with pyzx --- README.md | 454 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 442 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 7c21e36b..d0aac3ad 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Optyx is an open-source Python library for designing, simulating, and optimizing networked, hybrid qubit–photon architectures. It offers a compositional, ZX/ZW-based string-diagram front end (built within the DisCoPy ecosystem) that lets you specify experiments mixing qubit registers with discrete-variable photonic modes, lossy channels, heralded measurements, and classical/quantum feedback. Optyx compiles these diagrams to optimized tensor networks and executes them with state-of-the-art contraction backends (Quimb + Cotengra), delivering substantial speedups on low-depth circuits. The result is an end-to-end workflow—from high-level syntax to numerics—well-suited for rapid prototyping of qubit-photon experiments. -## Basic Optyx syntax: the Hong-Ou-Mandel effect +## Basic Optyx syntax: the Hong-Ou-Mandel effect./docs/notebooks/ We will present the basics of Optyx with a simple example from linear optics. @@ -102,6 +102,7 @@ from optyx.qubits import Scalar from optyx import Channel from optyx.qubits import Z, X, H, Measure, Scalar, qubit, bit from optyx.classical import BitControlledGate +from optyx.core import zx, diagram ``` ### Define the protocol @@ -128,6 +129,23 @@ def cnot(a, b): ```python bell = Scalar(0.5 ** 0.5) @ Z(0, 2) +controlled_X = Channel( + "Controlled-X", + zx.X(2, 1) @ diagram.Scalar(2 ** 0.5), + dom = bit @ qubit, + cod = qubit +) + +controlled_Z = Channel( + "Controlled-Z", + ( + zx.H @ diagram.bit >> + zx.Z(2, 1) @ diagram.Scalar(2 ** 0.5) + ), + dom = bit @ qubit, + cod = qubit +) + @Channel.from_callable( dom=qubit, cod=qubit ) @@ -136,8 +154,8 @@ def teleportation(c): cc, aa = cnot(c, a) c_ = Measure(1)(H()(cc)) a_ = Measure(1)(aa) - bb = BitControlledGate(X(1, 1, 0.5))(a_, b) - return BitControlledGate(Z(1, 1, 0.5))(c_, bb) + bb = controlled_X(a_, b) + return controlled_Z(c_, bb) ``` @@ -150,8 +168,8 @@ teleportation_monoidal_syntax = ( cnot @ qubit >> H() @ qubit ** 2 >> Measure(1) @ Measure(1) @ qubit >> - bit @ BitControlledGate(X(1, 1, 0.5)) >> - BitControlledGate(Z(1, 1, 0.5)) + bit @ controlled_X >> + controlled_Z ) ``` @@ -202,6 +220,374 @@ np.allclose( +### Verify with PyZX + +We can obtain the underlying CPTP map by doubling (CP-construction) an Optyx diagram: + + +```python +teleportation_monoidal_syntax.double().draw(figsize=(8, 8)) +``` + + + +![svg](./docs/notebooks/readme_example_files/readme_example_25_0.svg) + + + +This way we can use PyZX and its optimisation/simplifications functionalities: + + +```python +import pyzx +pyzx_graph = teleportation_monoidal_syntax.double().to_pyzx() +``` + + +```python +pyzx.full_reduce(pyzx_graph, quiet=True) +pyzx_graph.normalize() +pyzx.draw(pyzx_graph) +``` + + +
+ + + +The diagram is a double identity diagram. + ## Approximate contraction and photon loss: fusion teleportation Teleportation with **fusion measurements** uses a Bell pair of dual-rail qubits as the channel: Alice fuses the input with her half using a Type-II fusion, reads the classical outcomes, and Bob applies the corresponding correction. In the **success** branch, the overall map is the **identity** on the teleported qubit up to a known Pauli byproduct, which Bob removes with a conditioned \(X\) correction. In the **failure** branch, the input is effectively measured and the opposite state is prepared at the output. For the standard Type-II scheme this yields identity with probability \(1/2\), and failure otherwise; the paper’s diagrams show both branches explicitly and how the correction restores the state. @@ -283,7 +669,7 @@ fusion_teleportation_monoidal_syntax.foliation().draw(figsize=(8, 8)) -![svg](./docs/notebooks/readme_example_files/readme_example_33_0.svg) +![svg](./docs/notebooks/readme_example_files/readme_example_40_0.svg) @@ -354,7 +740,35 @@ plt.ylabel('Average cosine similarity') plt.title('Fusion-based Teleportation similarity vs Contraction Chi') ``` -![svg](./docs/notebooks/readme_example_files/readme_example_38_2.svg) + + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. + warnings.warn( + + + + + + Text(0.5, 1.0, 'Fusion-based Teleportation similarity vs Contraction Chi') + + + + + +![svg](./docs/notebooks/readme_example_files/readme_example_45_2.svg) @@ -435,7 +849,23 @@ plt.ylabel('Fidelity') plt.title('Fusion-based Teleportation: Photon Survival Probability vs Fidelity') ``` -![svg](./docs/notebooks/readme_example_files/readme_example_42_2.svg) + + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1719: ComplexWarning: Casting complex values to real discards the imaginary part + return math.isfinite(val) + /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1355: ComplexWarning: Casting complex values to real discards the imaginary part + return np.asarray(x, float) + + + + + + Text(0.5, 1.0, 'Fusion-based Teleportation: Photon Survival Probability vs Fidelity') + + + + + +![svg](./docs/notebooks/readme_example_files/readme_example_49_2.svg) @@ -482,7 +912,7 @@ Equation(protocol >> measure, bell_state >> measure).draw(figsize=(8, 8)) -![svg](./docs/notebooks/readme_example_files/readme_example_47_0.svg) +![svg](./docs/notebooks/readme_example_files/readme_example_54_0.svg) @@ -543,7 +973,7 @@ plt.show() -![svg](./docs/notebooks/readme_example_files/readme_example_52_0.svg) +![svg](./docs/notebooks/readme_example_files/readme_example_59_0.svg) @@ -570,7 +1000,7 @@ pattern.draw_graph() -![svg](./docs/notebooks/readme_example_files/readme_example_55_1.svg) +![svg](./docs/notebooks/readme_example_files/readme_example_62_1.svg) @@ -640,7 +1070,7 @@ pcvl.pdisplay(p, recursive=True) -![svg](./docs/notebooks/readme_example_files/readme_example_61_0.svg) +![svg](./docs/notebooks/readme_example_files/readme_example_68_0.svg) From 6fcdf227cb26cfed4b6d156523c3f6bd50be802b Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Mon, 6 Oct 2025 13:45:47 +0100 Subject: [PATCH 50/59] pyzx graph in readme --- README.md | 337 +----------------- .../readme_example_files/pyzx_identity.png | Bin 0 -> 2352 bytes 2 files changed, 2 insertions(+), 335 deletions(-) create mode 100644 docs/notebooks/readme_example_files/pyzx_identity.png diff --git a/README.md b/README.md index d0aac3ad..135f5e79 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Optyx is an open-source Python library for designing, simulating, and optimizing networked, hybrid qubit–photon architectures. It offers a compositional, ZX/ZW-based string-diagram front end (built within the DisCoPy ecosystem) that lets you specify experiments mixing qubit registers with discrete-variable photonic modes, lossy channels, heralded measurements, and classical/quantum feedback. Optyx compiles these diagrams to optimized tensor networks and executes them with state-of-the-art contraction backends (Quimb + Cotengra), delivering substantial speedups on low-depth circuits. The result is an end-to-end workflow—from high-level syntax to numerics—well-suited for rapid prototyping of qubit-photon experiments. -## Basic Optyx syntax: the Hong-Ou-Mandel effect./docs/notebooks/ +## Basic Optyx syntax: the Hong-Ou-Mandel effect We will present the basics of Optyx with a simple example from linear optics. @@ -250,340 +250,7 @@ pyzx_graph.normalize() pyzx.draw(pyzx_graph) ``` - -
- +![png](./docs/notebooks/readme_example_files/pyzx_identity.png) The diagram is a double identity diagram. diff --git a/docs/notebooks/readme_example_files/pyzx_identity.png b/docs/notebooks/readme_example_files/pyzx_identity.png new file mode 100644 index 0000000000000000000000000000000000000000..341e95862e0b69aca86b5916b535aa066c5203d8 GIT binary patch literal 2352 zcmcgud03KL9;PfaM>DH2bGdNGESCgQEOEgUy#|(=;?+bW#>ib%D3?%Ya?4b_sZ=UT zjUsBHW4N1A*V4kmYl&XUeZf&nDiB{)rWkQ8c&QPfkL9m zQ6vjWa2$ygO$jAar7CN#7M82F>Kf7A43e~J$=SE}R4Z-jMj~<&wrt9e& zzF%2seK${iVb^R-qF2ZC{C-?*XR@NcUoIRU8yJ;JYqy;FtF3F{LGCj5h0juv-`00* zhVx{4d{SfO8*O8uZmPe(|8FZVTBDOG?$XWa&b!}*-?~Yo-{sAcrML3}hIxHL78fHh zxL~Bwxw3cttE1!4M(Ui_=6uq9U{$}Z6yNdhb01%&P8}oBZ4yYtT}}@IxW_PptGtHI z-m%e9Uvg?aioccE=Sb8FNNIfxt52?BEjYR=0vt>!2#R+vLk7PI@oMnL>1Ku_^a_rS zD`ykSv25>8JBy2p2MRf!RN3>l%|mTgNp6Sx34?=!MHOX+p579hHyE&=N4MI|GiWsW z!|15>mVKGWqd;h{8NFQQ;P(CIhgx8Rr%_KI=5h4t*RR`Sin|ZIjGdM5BsBQjQ)TaR z-X}NsQ&)?kYH()XX!W1dFa>Kcd7sR|*X+-G?Ci=b-^AWGp__+n9|^8eih^pOcRNii zgnjhp{%n08Ol=-}#@^xk$TwuM$;_1E{}09anC_J@GVJ8rhHG|gcs$hBpeCCIQ z#v0|iZ5em?S~H%Pf2wJvoo9@nN})sF3WedZu>;}~SVV9z+Ro1IJa{-1fqNukb~2|f znLeBNlzZpx)!Fr~=9ZRx+DIvRrQNZ>*C1u<(#mG;O|T!6tK1m2IG^&Ru8uYn`TA}v zYr5^&@#Dd<4KTHxdAYd=hdSE0->K4Til;)MZicf{`J8n!b1t!Al~5B1LhVIt84fD>odMiVs8$PzR1yp}~tA0tG5i|YEsqw$Y{ z>+W`m4Mb{Ic$riOLd^?bS65V^Yj9W~8yXr4u2?p7Wd4W=t_Th&A%x#3W3L+L<^n2PT*`5NhK4eRu1|@Wk$Td;9OgRv|DEYCSd^exB997|K&gN36C!{ zF$HHbi;x}%zzeiz&-44it%wIpE$zk_JU=pw`{cSA3gu`@amldiL9O#+W|x%lr74qG zaw_=*KgJm7$hPVM>*(kpP$%o~<0Ij#eTMhI&_xBO#X6o0)gkD>j6>+v+L;A1HXS(D zz7^Z)bed+2w!^8B_(l2Ml=Z}dfpsmHHYLL`-dh%y1m+q~uSt#~OMTA^+oXFD-uD+s63Iw!emx_agHO;$%VIl3Qtma=Dy3 zSb8gfKw!1oc2GA97j2aaP%5e5cc*Px8ucuz!Vjs?)s Date: Mon, 6 Oct 2025 14:01:14 +0100 Subject: [PATCH 51/59] Clean up user warning messages in README Removed multiple user warnings related to HyperOptimizer and matplotlib from README. --- README.md | 42 ------------------------------------------ 1 file changed, 42 deletions(-) diff --git a/README.md b/README.md index 135f5e79..f82a2690 100644 --- a/README.md +++ b/README.md @@ -408,33 +408,6 @@ plt.title('Fusion-based Teleportation similarity vs Contraction Chi') ``` - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. - warnings.warn( - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. - warnings.warn( - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. - warnings.warn( - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. - warnings.warn( - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. - warnings.warn( - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. - warnings.warn( - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. - warnings.warn( - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence. - warnings.warn( - - - - - - Text(0.5, 1.0, 'Fusion-based Teleportation similarity vs Contraction Chi') - - - - - ![svg](./docs/notebooks/readme_example_files/readme_example_45_2.svg) @@ -517,21 +490,6 @@ plt.title('Fusion-based Teleportation: Photon Survival Probability vs Fidelity') ``` - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1719: ComplexWarning: Casting complex values to real discards the imaginary part - return math.isfinite(val) - /home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1355: ComplexWarning: Casting complex values to real discards the imaginary part - return np.asarray(x, float) - - - - - - Text(0.5, 1.0, 'Fusion-based Teleportation: Photon Survival Probability vs Fidelity') - - - - - ![svg](./docs/notebooks/readme_example_files/readme_example_49_2.svg) From 2838a9fbf1550370a6fcd6c8e676d6033a6f24ba Mon Sep 17 00:00:00 2001 From: Mateusz Kupper Date: Mon, 6 Oct 2025 17:16:42 +0100 Subject: [PATCH 52/59] Remove duplicate content in README.md Removed duplicate paragraph about teleportation with fusion measurements. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f82a2690..6c3809bf 100644 --- a/README.md +++ b/README.md @@ -257,7 +257,7 @@ The diagram is a double identity diagram. ## Approximate contraction and photon loss: fusion teleportation -Teleportation with **fusion measurements** uses a Bell pair of dual-rail qubits as the channel: Alice fuses the input with her half using a Type-II fusion, reads the classical outcomes, and Bob applies the corresponding correction. In the **success** branch, the overall map is the **identity** on the teleported qubit up to a known Pauli byproduct, which Bob removes with a conditioned \(X\) correction. In the **failure** branch, the input is effectively measured and the opposite state is prepared at the output. For the standard Type-II scheme this yields identity with probability \(1/2\), and failure otherwise; the paper’s diagrams show both branches explicitly and how the correction restores the state. +Teleportation with **fusion measurements** uses a Bell pair of dual-rail qubits as the channel: Alice fuses the input with her half using a Type-II fusion, reads the classical outcomes, and Bob applies the corresponding correction. In the **success** branch, the overall map is the **identity** on the teleported qubit up to a known Pauli byproduct, which Bob removes with a conditioned \(X\) correction. In the **failure** branch, the input is effectively measured and the opposite state is prepared at the output. For the standard Type-II scheme this yields identity with probability \(1/2\), and failure otherwise; the diagrams show both branches explicitly and how the correction restores the state. Ursin, R., Jennewein, T., Aspelmeyer, M. et al. Quantum teleportation across the Danube. Nature 430, 849 (2004). https://doi.org/10.1038/430849a : From 2d9686b476b1b7498d391c31943015fcfec75c59 Mon Sep 17 00:00:00 2001 From: giodefelice Date: Mon, 6 Oct 2025 19:47:38 +0100 Subject: [PATCH 53/59] edit README, add CtrlX and CtrlZ to classical --- README.md | 539 ++++++++------------------------------------- optyx/classical.py | 16 ++ 2 files changed, 107 insertions(+), 448 deletions(-) diff --git a/README.md b/README.md index 6c3809bf..e89b0db2 100644 --- a/README.md +++ b/README.md @@ -1,151 +1,59 @@ # Optyx: A ZX-based Python library for networked quantum architectures -Optyx is an open-source Python library for designing, simulating, and optimizing networked, hybrid qubit–photon architectures. It offers a compositional, ZX/ZW-based string-diagram front end (built within the DisCoPy ecosystem) that lets you specify experiments mixing qubit registers with discrete-variable photonic modes, lossy channels, heralded measurements, and classical/quantum feedback. Optyx compiles these diagrams to optimized tensor networks and executes them with state-of-the-art contraction backends (Quimb + Cotengra), delivering substantial speedups on low-depth circuits. The result is an end-to-end workflow—from high-level syntax to numerics—well-suited for rapid prototyping of qubit-photon experiments. +Optyx is an open-source Python library for designing, simulating, and optimizing networked, hybrid qubit–photon architectures. It offers a compositional, ZX/ZW-based, string-diagram front end (built within the [DisCoPy](https://github.com/discopy/discopy) ecosystem) that lets you specify experiments mixing qubit registers with discrete-variable photonic modes, lossy channels, heralded measurements, and classical/quantum feedback. Optyx compiles these diagrams to optimized tensor networks and executes them with state-of-the-art contraction backends ([Quimb](https://github.com/jcmgray/quimb) and [Cotengra](https://github.com/jcmgray/cotengra)), delivering substantial speedups on hybrid circuits. The result is an end-to-end workflow—from high-level syntax to numerics—well-suited for rapid prototyping of qubit-photon experiments. -## Basic Optyx syntax: the Hong-Ou-Mandel effect +## Basic syntax: the CNOT gate -We will present the basics of Optyx with a simple example from linear optics. +Circuits in Optyx are **diagrams** made of **wires** and **boxes**. Wires represent different types of data such as quantum `qubit` and `qmode` or classical `bit` and `mode`. Boxes are basic processes with input and output wires that can be composed, in sequence or in parallel, to form diagrams. -The Hong–Ou–Mandel (HOM) effect is a two-photon interference phenomenon where indistinguishable photons entering a 50:50 beamsplitter “bunch” and exit together through the same output register. When their temporal, spectral, polarization, and spatial modes overlap perfectly, destructive interference suppresses the outcome with one photon in each output. This effect is a standard benchmark for photon indistinguishability in photonic experiments. - -### Experiment definition - -Circuits in Optyx are diagrams made of typed wires (qubits, photonic modes, classical bits) and generators (gates, sources, optics, measurements). You build them by connecting outputs to inputs (sequence) and placing blocks side-by-side (parallel); types must match at every connection. Generators carry parameters and labels; measurements produce classical wires you can route into later blocks. A circuit is just the set of generators plus the wiring between their ports. - -Let us build a diagram to study the HOM effect. +### Monoidal syntax +In monoidal syntax, `>>` denotes sequential composition and `@` denotes parallel composition (also known as tensor product). +For example, you can build the CNOT gate from the **Z** and **X** generators of the **ZX caluclus** (don't forget the scalar!). ```python -from optyx.photonic import BBS +from optyx import qubit +from optyx.qubits import Z, X, Scalar -# diagram generators: -# beam-splitter -beam_splitter = BBS(0) -beam_splitter.draw() +cnot = Z(1, 2) @ qubit >> qubit @ X(2, 1) @ Scalar(2 ** 0.5) +cnot.draw() ``` +### Function syntax - -![svg](./docs/notebooks/readme_example_files/readme_example_5_0.svg) - - - +Alternatively, you can treat each generator as a **function** acting on **labelled wires** and **call the generators** +directly on the labels. This makes complex diagrams easier to read and write, and mirrors the style used in [Guppy](https://github.com/CQCL/guppylang). ```python -from optyx.photonic import Create - -# diagram composition with monoidal syntax -# create two single-photon states and send them to a beam-splitter -hong_ou_mandel = ( - Create(1) @ Create(1) >> - beam_splitter +@Channel.from_callable( + dom=qubit @ qubit, cod=qubit @ qubit ) - -hong_ou_mandel.draw() -``` - - - -![svg](./docs/notebooks/readme_example_files/readme_example_6_0.svg) - - - -The result of this experiment should be a zero probability of having single photons in two output modes: - - ![HOM](./docs/notebooks/hom.png "Hong-Ou-Mandel Effect") - -### Diagram evaluation - -Call `diagram.eval()` to evaluate a diagram (Quimb backend by default). It returns an evaluated object; use `.tensor.array` to extract the numeric tensor/array, or `.prob_dist()` to get an outcome distribution. You can chain it inline, e.g., `(...).eval().tensor.array`. - - -```python -# an amplitude (raw result of tensor contraction) -from optyx.classical import Select -( - hong_ou_mandel >> Select(1, 1) -).eval().tensor.array -``` - - - - - array(-0.+0.j) - - - - -```python -hong_ou_mandel.eval().prob_dist() +def cnot(a, b): + c, d = Z(1, 2)(a) + e = X(2, 1)(d, b) + Scalar(2 ** 0.5)() + return c, e ``` +## Qubit example: teleportation protocol - - - {(0, 2): 0.5, (1, 1): 4.9303806576313227e-32, (2, 0): 0.5} - - - -## Function syntax and backends: qubit teleportation - -Quantum teleportation transfers an unknown qubit state from sender (Alice) to receiver (Bob) using shared entanglement and two classical bits. Alice performs a joint Bell-state measurement on the unknown qubit and her half of an entangled pair, which projects Bob’s distant qubit into a state related to the original. She sends the two-bit outcome to Bob, who applies a corresponding Pauli correction (I, X, Z, or XZ) to recover the exact state. No information travels faster than light and the original is destroyed by measurement, so the state is relocated—not copied. +Quantum teleportation transfers an unknown qubit state from sender (Alice) to receiver (Bob) using shared entanglement and feedforward of two classical bits. Alice performs a joint Bell-state measurement on the unknown qubit and her half of an entangled pair, and sends the two-bit outcome to Bob, who applies a corresponding Pauli correction (I, X, Z, or XZ) to recover the exact state. https://en.wikipedia.org/wiki/Quantum_teleportation#/media/File:Quantum_teleportation_circuit.svg : Teleportation Protocol - -```python -from optyx import qubit, bit -from optyx.qubits import Scalar - -from optyx import Channel -from optyx.qubits import Z, X, H, Measure, Scalar, qubit, bit -from optyx.classical import BitControlledGate -from optyx.core import zx, diagram -``` - ### Define the protocol - -Instead of wiring generators together with sequential (`>>`) and parallel (`@`) composition (which we call the monoidal syntax), you can treat each generator as a **function on its domain wires**. You **label the wires** and then **call generators with those labels**, which lets you feed specific wires directly into the right box without inserting explicit `Swap`s to reorder them. This makes complex diagrams easier to read and write, and mirrors the style used in **Guppy**; it’s an alternative surface syntax that’s equivalent to the usual `>>`/`@` composition. - - +Write the protocol using function syntax: ```python -# function syntax -# CNOT from ZX generators +from optyx import bit +from optyx.qubits import Measure +from optyx.classical import CtrlX, CtrlZ -@Channel.from_callable( - dom=qubit @ qubit, cod=qubit @ qubit -) -def cnot(a, b): - c, d = Z(1, 2)(a) - Scalar(2 ** 0.5)() - return c, X(2, 1)(d, b) -``` - - -```python bell = Scalar(0.5 ** 0.5) @ Z(0, 2) -controlled_X = Channel( - "Controlled-X", - zx.X(2, 1) @ diagram.Scalar(2 ** 0.5), - dom = bit @ qubit, - cod = qubit -) - -controlled_Z = Channel( - "Controlled-Z", - ( - zx.H @ diagram.bit >> - zx.Z(2, 1) @ diagram.Scalar(2 ** 0.5) - ), - dom = bit @ qubit, - cod = qubit -) - @Channel.from_callable( dom=qubit, cod=qubit ) @@ -154,33 +62,30 @@ def teleportation(c): cc, aa = cnot(c, a) c_ = Measure(1)(H()(cc)) a_ = Measure(1)(aa) - bb = controlled_X(a_, b) - return controlled_Z(c_, bb) + bb = CtrlX(a_, b) + return CtrlZ(c_, bb) ``` +Or using monoidal syntax: ```python -# function syntax avoids explicit swaps and identity wires -# this is the equivalent monoidal syntax: - teleportation_monoidal_syntax = ( qubit @ bell >> cnot @ qubit >> H() @ qubit ** 2 >> Measure(1) @ Measure(1) @ qubit >> - bit @ controlled_X >> - controlled_Z + bit @ CtrlX >> + CtrlZ ) ``` -### Verify the protocol +### Simulate using backends ```python import numpy as np from optyx.qubits import Id -# both implementations are equivalent np.allclose( teleportation.eval().tensor.array, teleportation_monoidal_syntax.eval().tensor.array, @@ -188,20 +93,9 @@ np.allclose( ) ``` - - - - True - - - Optyx evaluates diagrams via pluggable backends. By default it compiles a diagram to a tensor network, optimizes a contraction path with **cotengra**, and contracts it with **quimb** (CPU/GPU; dense/sparse). For linear-optical circuits, Optyx also exposes a **Perceval** backend using permanent-based algorithms, and a tensor-network-based **DisCoPy** backend; you can choose among these depending on the task. - - ```python -# backends (Perceval, Discopy, Quimb) - from optyx.core.backends import ( DiscopyBackend, QuimbBackend @@ -214,12 +108,6 @@ np.allclose( ``` - - - True - - - ### Verify with PyZX We can obtain the underlying CPTP map by doubling (CP-construction) an Optyx diagram: @@ -235,16 +123,12 @@ teleportation_monoidal_syntax.double().draw(figsize=(8, 8)) -This way we can use PyZX and its optimisation/simplifications functionalities: +This way we can use [PyZX](https://github.com/zxcalc/pyzx) and its optimisation/simplifications functionalities: ```python import pyzx pyzx_graph = teleportation_monoidal_syntax.double().to_pyzx() -``` - - -```python pyzx.full_reduce(pyzx_graph, quiet=True) pyzx_graph.normalize() pyzx.draw(pyzx_graph) @@ -252,261 +136,89 @@ pyzx.draw(pyzx_graph) ![png](./docs/notebooks/readme_example_files/pyzx_identity.png) +The diagram (a doubled identity) is the identity CPTP map as expected. -The diagram is a double identity diagram. -## Approximate contraction and photon loss: fusion teleportation +## Photonic example: the Hong-Ou-Mandel effect -Teleportation with **fusion measurements** uses a Bell pair of dual-rail qubits as the channel: Alice fuses the input with her half using a Type-II fusion, reads the classical outcomes, and Bob applies the corresponding correction. In the **success** branch, the overall map is the **identity** on the teleported qubit up to a known Pauli byproduct, which Bob removes with a conditioned \(X\) correction. In the **failure** branch, the input is effectively measured and the opposite state is prepared at the output. For the standard Type-II scheme this yields identity with probability \(1/2\), and failure otherwise; the diagrams show both branches explicitly and how the correction restores the state. - - -Ursin, R., Jennewein, T., Aspelmeyer, M. et al. Quantum teleportation across the Danube. Nature 430, 849 (2004). https://doi.org/10.1038/430849a : - -Fusion teleportation across the Danube - -Graphically, the fusion measurement we would like to use, takes the following form: - -Fusion measurement - - -where $\underline{a}, \underline{b}, \underline{c}, \underline{d}$ are the measurement outcomes as the measured photon numbers. - -$\underline{s} = \underline{a} \oplus \underline{b}$ - -$\underline{k} = \underline{s} (\underline{b} + \underline{d}) + \neg \underline s (1 - \frac{\underline{a} + \underline{b}}{2})$ - -### Define the protocol - - -```python -from optyx.photonic import DualRail - -dual_rail_encoded_bell = ( - bell >> - DualRail(1) @ DualRail(1) -) -``` - - -```python -from optyx.classical import PostselectBit, BitControlledGate -from optyx.photonic import Phase -from optyx.photonic import HadamardBS, qmode - -# postselect on fusion success -fusion_failure_processing = PostselectBit(1) - -# apply the box if the control bit is 1, otherwise apply an identity channel -correction = BitControlledGate( - HadamardBS() >> - (Phase(0.5) @ qmode) >> - HadamardBS() -) -``` +he Hong–Ou–Mandel (HOM) effect is a two-photon interference phenomenon where indistinguishable photons entering a 50:50 beamsplitter “bunch” and exit together through the same output register. This effect is a standard benchmark for photon indistinguishability in photonic experiments. We show via simulation how both distinguishability and photon loss affect the effect. +### Noiseless setting ```python -from optyx.photonic import FusionTypeII - -@Channel.from_callable( - dom=qubit, cod=qmode @ qmode -) -def fusion_teleportation(a): - dual_rail_encoded_input = DualRail(1)(a) - b, c, d, e = dual_rail_encoded_bell() - s, k = FusionTypeII()(*dual_rail_encoded_input, b, c) - fusion_failure_processing(s) - dr_output_1, dr_output_2 = correction(k, d, e) - return dr_output_1, dr_output_2 -``` - +from optyx.photonic import BS, Create -```python -from optyx.photonic import FusionTypeII +beam_splitter = BS +beam_splitter.draw() -fusion_teleportation_monoidal_syntax = ( - DualRail(1) @ dual_rail_encoded_bell >> - FusionTypeII() @ qmode**2 >> - fusion_failure_processing @ correction +HOM = ( + Create(1) @ Create(1) >> + beam_splitter ) -fusion_teleportation_monoidal_syntax.foliation().draw(figsize=(8, 8)) - +HOM.eval().prob_dist() ``` -![svg](./docs/notebooks/readme_example_files/readme_example_40_0.svg) + {(0, 2): 0.5, (1, 1): 0, (2, 0): 0.5} -### Verify the protocol +### Photon loss +We model photon loss in optyx using the `PhotonLoss` generator. We can check that the HOM circuit gives a non-zero probability of detecting one photon, in the presence of loss. ```python -import numpy as np -from optyx.photonic import Id - -array_teleportation = fusion_teleportation_monoidal_syntax.eval().tensor.array -array_dr = (DualRail(1) @ Scalar(0.5**0.5)).double().to_tensor().eval().array - -np.allclose(array_teleportation[:, :, :2, :2, :2, :2], array_dr) +from optyx.photonic import Id, PhotonLoss, NumberResolvingMeasurement +from optyx.classical import AddN +lossy_HOM = Create(1, 1) >> PhotonLoss(0.8) @ Id(1) >> BS +lossy_HOM = lossy_HOM >> NumberResolvingMeasurement(2) >> AddN(2) +assert np.isclose(lossy_HOM.eval().prob_dist()[(1,)], 0.2) ``` +### Distinguishability - - True - - - -### Approximate contraction with Quimb and Cotengra - -Approximate contraction in Optyx uses cotengra to plan a low-cost contraction with memory-aware slicing, then executes it in quimb with optional compression of intermediates. Instead of multiplying tensors exactly, large merges are factorized and truncated (e.g., SVD) so only the dominant singular components are kept; you trade speed and memory for a controlled approximation error. Tightening the truncation tolerance (or increasing the allowed bond size) yields higher accuracy at higher cost, while more aggressive truncation/slicing gives faster, lower-memory contractions with small, quantifiable loss in fidelity. - - -```python -def _flat(x): - return np.asarray(x, dtype=complex).ravel() - -def cosine_similarity(SU, SV): - a, b = _flat(SU), _flat(SV) - num = abs(np.vdot(a, b)) - den = np.linalg.norm(a) * np.linalg.norm(b) - if den == 0: - return 0.0 - return float(num / den) -``` - - -```python -from cotengra import HyperCompressedOptimizer - -# cosine similarity between the result of exact contaction and approximate contraction for different chis -errors = [] -for chi in range(1, 6): - optimiser = HyperCompressedOptimizer( - chi=chi - ) - error_for_chi = [] - for _ in range(10): - error_for_chi.append( - cosine_similarity( - fusion_teleportation.eval(QuimbBackend(optimiser)).tensor.array, - array_teleportation - ) - ) - errors.append(np.median(error_for_chi)) - -import matplotlib.pyplot as plt -plt.plot(range(1, 6), errors, marker='o') -plt.grid() -plt.xlabel('Chi') -plt.ylabel('Average cosine similarity') -plt.title('Fusion-based Teleportation similarity vs Contraction Chi') - -``` - -![svg](./docs/notebooks/readme_example_files/readme_example_45_2.svg) - - - -### Photon loss and channel fidelity - -Photon loss is when a photon that should arrive simply doesn’t. In Optyx, you model this by placing a dedicated loss generator exactly where the loss occurs; its single parameter is the photon survival probability. Photon loss is the primary failure mode for photonic qubits. In photonic computing it breaks multi-photon interference and reduces the success of fusion/measurement steps. That’s why if we want to study architectures, thresholds, and mitigation (repeaters, multiplexing, loss-tolerant encodings), we need to be able to model photon loss accurately. - - -```python -from optyx.photonic import FusionTypeII, PhotonLoss - -# photo loss is one of the main error sources in photonic quantum computing -def fusion_teleportation_with_photon_loss(p): - @Channel.from_callable( - dom=qubit, cod=qmode**2 - ) - def fusion_teleportation(a): - dr_input_1, dr_input_2 = DualRail(1)(a) - b, c, d, e = dual_rail_encoded_bell() - # apply photon loss to all modes here: - #----------------------------------- - dr_input_1_loss, dr_input_2_loss, b_loss, c_loss, d_loss, e_loss = ( - PhotonLoss(p)(dr_input_1), PhotonLoss(p)(dr_input_2), - PhotonLoss(p)(b), PhotonLoss(p)(c), - PhotonLoss(p)(d), PhotonLoss(p)(e) - ) - #----------------------------------- - s, k = FusionTypeII()(dr_input_1_loss, dr_input_2_loss, b_loss, c_loss) - fusion_failure_processing(s) - output_rail_1, output_rail = correction(k, d_loss, e_loss) - return output_rail_1, output_rail - return fusion_teleportation -``` - - -```python -from optyx.core.channel import Spider, Diagram - -def get_perm(n): - return sorted(sorted(list(range(n))), key=lambda i: i % 2) - -def channel_fidelity(diagram_1, diagram_2): - bell_1 = Channel.tensor(*[Spider(0, 2, ty) for ty in diagram_1.dom]) - permutation_1 = Diagram.permutation(get_perm(len(bell_1.cod)), bell_1.cod) - - bell_2 = Channel.tensor(*[Spider(0, 2, ty) for ty in diagram_2.dom]) - permutation_2 = Diagram.permutation(get_perm(len(bell_2.cod)), bell_2.cod) - - choi_1 = bell_1 >> permutation_1 >> (diagram_1 @ diagram_1.dom) - choi_2 = bell_2 >> permutation_2 >> (diagram_2 @ diagram_2.dom) - - return (choi_1 >> choi_2.dagger()).eval().tensor.array - -``` - +We model distinshability in optyx by assigning **internal states** to photons in the circuit. +The overlap between internal states defines the pairwise distinguishability of the corresponding photons. ```python import numpy as np -import matplotlib.pyplot as plt +from optyx.photonic import BS -ps = np.linspace(0.0, 1.0, 20) +internal_state_1 = [1, 0] +internal_state_2 = [np.sqrt(0.9), np.sqrt(0.1)] -# compute fidelity for different photon loss probabilities -F_avg_vals = [] -succ_probs = [] -for p in ps: - S_impl = fusion_teleportation_with_photon_loss(p) - S_tgt = fusion_teleportation_monoidal_syntax - s = channel_fidelity(S_impl, S_tgt) +create = Create(1, 1, internal_states=( + internal_state_1, internal_state_2)) - succ_probs.append(s) - -plt.figure() -plt.plot(ps, succ_probs, marker='o') -plt.grid(True) -plt.xlabel('Photon Survival Probability (p)') -plt.ylabel('Fidelity') -plt.title('Fusion-based Teleportation: Photon Survival Probability vs Fidelity') +distinguishable_HOM = create >> BS >> NumberResolvingMeasurement(2) +result = distinguishable_HOM.inflate( + len(internal_state_1)).eval().prob_dist() +theoretical_result = 0.5 - 0.5 * np.abs( + np.array(internal_state_1).dot( + np.array(internal_state_2).conjugate()))**2 +assert np.isclose(result[(1, 1)], theoretical_result, 3) ``` -![svg](./docs/notebooks/readme_example_files/readme_example_49_2.svg) - - + +## Hybrid example: distributed entanglement generation -## Photon distinguishability: distributed entanglement generation - -Distributed entanglement generation links two distant quantum nodes (A and B) by creating a shared entangled pair. Each node emits a photon that travels to a shared site, where the photons interfere and a joint (Bell-state) detection flags success — instantly projecting A and B into an entangled state. Because attempts often fail due to loss, the process is repeated-until-success with timing. This is the core primitive behind quantum networks and repeaters, enabling long-distance QKD, teleportation, and multi-node protocols. +Distributed entanglement generation links two distant quantum nodes (A and B) by creating a shared entangled pair. Each node emits a photon that travels to a shared site, where the photons interfere and a joint Bell measurement flags success — instantly projecting A and B into an entangled state. Because attempts often fail due to loss, the process is repeated-until-success with timing. This is the core primitive behind quantum networks and repeaters, enabling long-distance QKD, teleportation, and multi-node protocols. Main, D., Drmota, P., Nadlinger, D.P. et al. Distributed quantum computing across an optical network link. Nature 638, 383–388 (2025). https://doi.org/10.1038/s41586-024-08404-x~ : ![Distributed entanglement](./docs/notebooks/distributed_entanglement.png "An example of distributed entanglement generation") +### Define the protocol -### Fusion and photon distinguishability - -#### Define the protocol +Bell measurements on photonic qubits can be performed probabilistically using a circuit known as Type II fusion. +Since the photons are emitted from distinct processors, they will be partially distinguishable. +This is modeled in optyx by assigning internal states to the `DualRail` boxes that encode a qubit into two photonic modes. ```python @@ -517,13 +229,12 @@ from discopy.drawing import Equation bell_state = Z(0, 2) @ Scalar(0.5 ** 0.5) -# generators introducing new qubits accepting internal states internal_state_1 = [1, 0] internal_state_2 = [0, 1] dual_rail_encoding = lambda state: DualRail(1, internal_states=[state]) encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(internal_state_2) -# postselect on fusion success and no errors +# postselect on fusion success and no Pauli byproducts post_select = PostselectBit(1) @ PostselectBit(0) protocol = ( @@ -535,54 +246,40 @@ measure = Measure(2) Equation(protocol >> measure, bell_state >> measure).draw(figsize=(8, 8)) ``` - - ![svg](./docs/notebooks/readme_example_files/readme_example_54_0.svg) +#### Test the protocol for different internal states -#### Define a set of internal states with varying degrees of distinguishability - -We test how partial photon distinguishability affects a heralded entanglement link. The experiment uses the overlap between two internal two-mode states (`rotated_unit_vectors`), encodes them into dual-rail photons (`dual_rail_encoding`), and performs a Type-II fusion with postselection (`FusionTypeII() >> post_select`). We then project onto the target Bell state (`... >> bell_state.dagger()`) to read off the heralded-state quality, and use a discard step (`... >> Discard(2)`) to extract the success probability. Plotting these versus the state overlap reveals how distinguishability simultaneously degrades fidelity and lowers the entanglement generation rate. - - +We test how partial photon distinguishability affects the heralded entanglement link. We compute the **process fidelity** of the protocol(overlap between the noisy and ideal states). ```python import math +from optyx.qubits import Discard -# internal states - 2 dimensional - move further and further apart def rotated_unit_vectors(n: int = 10): for i in range(n): theta = i * (math.pi / 2) / (n - 1) yield (math.cos(theta), math.sin(theta)) unit_vectors = list(rotated_unit_vectors(15)) -``` - -#### Run the experiments - - -```python -from optyx.qubits import Discard inner_product_states = [] inner_product_bell_states = [] -result_bell = bell_state.eval().tensor.array.flatten() -result_bell = result_bell / np.linalg.norm(result_bell) - for vector in unit_vectors: encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(vector) experiment = bell_state @ bell_state >> Id(1) @ (encoding_layer >> FusionTypeII() >> post_select) @ Id(1) - f = (experiment >> bell_state.dagger()).inflate(2).eval().tensor.array + process_fidelity = (experiment >> bell_state.dagger()).inflate(2).eval().tensor.array normalisation = (experiment >> Discard(2)).inflate(2).eval().tensor.array inner_product_states.append(np.inner(vector, internal_state_1)) - inner_product_bell_states.append(f/normalisation) + inner_product_bell_states.append(process_fidelity/normalisation) ``` +The simulation data reveals how distinguishability affects the fidelity of the entanglement generation protocol. ```python import matplotlib.pyplot as plt @@ -596,17 +293,14 @@ plt.grid(True) plt.show() ``` - - ![svg](./docs/notebooks/readme_example_files/readme_example_59_0.svg) +## Interfaces with external libraries -## Interfacing with external libraries - -### Graphix +### Graphix interface -Open graphs supported only for now (graph + measurements; desire to implement deterministically - no corrections) +Import an `OpenGraph` from [graphix](https://github.com/TeamGraphix/graphix). ```python @@ -617,44 +311,27 @@ circuit.cnot(0, 1) pattern = circuit.transpile().pattern -pattern.draw_graph() -``` - - The pattern is not consistent with flow or gflow structure. - - - - -![svg](./docs/notebooks/readme_example_files/readme_example_62_1.svg) - - - - -```python simulator = graphix.simulator.PatternSimulator(pattern, backend="statevector") graphix_result = simulator.run().psi.conj() ``` ```python -from optyx import qubits +from optyx.qubits import Circuit, Ket -optyx_zx = qubits.Circuit(pattern) +optyx_zx = Circuit(pattern) optyx_res = ( qubits.Ket("+")**2 >> optyx_zx ).eval().amplitudes() -``` - -```python for keys in optyx_res.keys(): assert np.isclose(optyx_res[keys], graphix_result[keys], atol=1e-6) ``` ### Perceval circuits and processors -#### Define the protocol in Perceval +Interface with both processors and circuits in [Perceval](https://github.com/Quandela/Perceval). ```python @@ -694,25 +371,16 @@ pcvl.pdisplay(p, recursive=True) - ![svg](./docs/notebooks/readme_example_files/readme_example_68_0.svg) -```python -from optyx.qubits import Ket - -state = Ket("+") >> Z(1, 1, 0.3) -state_array = state.eval().tensor.array -state_array = state_array / np.linalg.norm(state_array) -``` - -#### Evaluate the protocol in Perceval - +Evaluate the protocol in Perceval. ```python + to_transmit = (complex(state_array[0])*pcvl.BasicState([1, 0]) + complex(state_array[1])*pcvl.BasicState([0, 1])) @@ -725,26 +393,15 @@ p.min_detected_photons_filter(2) input_state *= pcvl.BasicState([0, 0]) p.with_input(input_state) -``` - -```python result_perceval = p.probs() ``` -#### Convert to Optyx and simulate +Convert to optyx and check that the results agree. ```python -from optyx import Channel - optyx_diagram = Channel.from_perceval(p) -``` - - -```python -from optyx.qubits import Scalar, Ket -from optyx.photonic import DualRail bell_state = Z(0, 2) @ Scalar(0.5**0.5) transmit = Ket("+") >> Z(1, 1, 0.3) @@ -756,15 +413,9 @@ protocol = ( DualRail(3) >> Channel.from_perceval(p) ) -``` - -```python result_optyx = protocol.eval().prob_dist() -``` - -```python def check_dict_agreement(d1, d2, rtol=1e-5, atol=1e-8): for key in d1.keys() - d2.keys(): assert np.isclose(d1[key], 0, rtol=rtol, atol=atol) @@ -772,17 +423,9 @@ def check_dict_agreement(d1, d2, rtol=1e-5, atol=1e-8): assert np.isclose(d2[key], 0, rtol=rtol, atol=atol) for key in d1.keys() & d2.keys(): assert np.isclose(d1[key], d2[key], rtol=rtol, atol=atol) -``` - -```python check_dict_agreement( {tuple(k): v for k, v in dict(result_perceval["results"]).items()}, result_optyx ) -``` - - -```python - -``` +``` \ No newline at end of file diff --git a/optyx/classical.py b/optyx/classical.py index b6e0c5eb..e113a83f 100644 --- a/optyx/classical.py +++ b/optyx/classical.py @@ -693,6 +693,22 @@ def __init__(self, *photons: int): Bit = lambda *bits: PostselectBit(*bits).dagger() # noqa: E731 +CtrlX = Channel( + "Controlled-X", + zx.X(2, 1) @ diagram.Scalar(2 ** 0.5), + dom = bit @ qubit, + cod = qubit +) + +CtrlZ = Channel( + "Controlled-Z", + ( + zx.H @ diagram.bit >> + zx.Z(2, 1) @ diagram.Scalar(2 ** 0.5) + ), + dom = bit @ qubit, + cod = qubit +) def Id(n): """ From 7be3c1dbaa04d72864e04a4b88a5e1547b2c3fbe Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Tue, 7 Oct 2025 16:38:29 +0100 Subject: [PATCH 54/59] flake8ing --- optyx/classical.py | 9 +++++---- optyx/core/channel.py | 4 +--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/optyx/classical.py b/optyx/classical.py index e113a83f..920f1021 100644 --- a/optyx/classical.py +++ b/optyx/classical.py @@ -696,8 +696,8 @@ def __init__(self, *photons: int): CtrlX = Channel( "Controlled-X", zx.X(2, 1) @ diagram.Scalar(2 ** 0.5), - dom = bit @ qubit, - cod = qubit + dom=bit @ qubit, + cod=qubit ) CtrlZ = Channel( @@ -706,10 +706,11 @@ def __init__(self, *photons: int): zx.H @ diagram.bit >> zx.Z(2, 1) @ diagram.Scalar(2 ** 0.5) ), - dom = bit @ qubit, - cod = qubit + dom=bit @ qubit, + cod=qubit ) + def Id(n): """ Classical identity wire. diff --git a/optyx/core/channel.py b/optyx/core/channel.py index 577d6e21..5e1d69ae 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -153,9 +153,7 @@ from discopy.cat import factory from pytket.extensions.pyzx import pyzx_to_tk from pyzx import extract_circuit -from optyx.core import zx, diagram -from optyx.utils.utils import explode_channel -from optyx.core.path import Matrix +from optyx.core import diagram class Ob(frobenius.Ob): From ea41d059b69e6a6cea31fe8e267c2349975b5e81 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Tue, 7 Oct 2025 16:49:13 +0100 Subject: [PATCH 55/59] removed tests -- decomp and to_path moved from zx to qubits --- optyx/core/zx.py | 74 ------------------------------------------------ 1 file changed, 74 deletions(-) diff --git a/optyx/core/zx.py b/optyx/core/zx.py index d73469b3..4834aeda 100644 --- a/optyx/core/zx.py +++ b/optyx/core/zx.py @@ -35,83 +35,9 @@ Examples of usage ------------------ -We can map ZX diagrams to :class:`path` diagrams using -dual-rail encoding. For example, we can create a GHZ state: - ->>> from discopy.drawing import Equation ->>> from optyx.core.diagram import dual_rail, embedding_tensor ->>> ghz = Z(0, 3) ->>> ghz_decom = decomp(ghz) ->>> ghz_path = zx_to_path(ghz_decom) ->>> Equation(ghz >> dual_rail(3), ghz_path, \\ -... symbol="$\\mapsto$").draw(figsize=(10, 10), \\ -... path="docs/_static/ghz_dr.svg") - -.. image:: /_static/ghz_dr.svg - :align: center - -We can also create a graph state as follows -(where we omit the labels): - ->>> graph = (Z(0, 2) >> Id(1) @ H >> Id(1) @ Z(1, 2) >> \\ -... Id(2) @ H >> Id(2) @ Z(1, 2)) ->>> graph_decom = decomp(graph) ->>> graph_path = zx_to_path(graph_decom) ->>> Equation(graph >> dual_rail(4), graph_path, \\ -... symbol="$\\mapsto$").draw(figsize=(10, 14), \\ -... path="docs/_static/graph_dr.svg", draw_type_labels=False, \\ -... draw_box_labels=False) - -.. image:: /_static/graph_dr.svg - :align: center - -We can check that both diagrams produce the same tensors (we need to -ensure the tensor dimensions match): - ->>> assert np.allclose(graph_path.to_tensor().eval().array, \\ -... ((graph >> dual_rail(4)).to_tensor() >> \\ -... (tensor.Id(Dim(*[2]*7)) @ embedding_tensor(1, 4))).eval().array) - -As shown in the example above, we need to decompose a ZX diagram -into more elementary spiders before mapping it to a path diagram. -More explicitely: - ->>> dgr = Z(2, 1, 0.25) >> X(1, 1, 0.35) ->>> print(decomp(dgr)) -Z(2, 1) >> Z(1, 1, 0.25) >> H >> Z(1, 1, 0.35) >> H ->>> print(zx2path(decomp(dgr))[:2]) -mode @ W[::-1] @ mode >> mode @ Select(1) @ mode ->>> assert zx2path(decomp(dgr)) == zx_to_path(dgr) - Evaluating ZX diagrams using PyZX or via the dual rail encoding is equivalent. ->>> ket = lambda *xs: Id(diagram.Bit(0)).tensor(\\ -... *[X(0, 1, 0.5 if x == 1 else 0) for x in xs]) ->>> cnot = Z(1, 2) @ Id(1) >> Id(1) @ X(2, 1) ->>> control = lambda x: ket(x) @ Id(1) >> cnot >> ket(x).dagger() @ Id(1) ->>> assert np.allclose(zx_to_path(control(0)).to_path().eval(1).array, \\ -... control(0).to_pyzx().to_tensor()) ->>> assert np.allclose(zx_to_path(control(1)).to_path().eval(1).array, \\ -... control(1).to_pyzx().to_tensor()) ->>> cz = lambda phi: cnot >> Z(1, 1, phi) @ H ->>> amplitude = ket(1, 1) >> cz(0.7) >> ket(1, 1).dagger() ->>> assert np.allclose(zx_to_path(amplitude).to_path().eval().array, \\ -... amplitude.to_pyzx().to_tensor()) - -Corner case where :code:`to_pyzx` and -:code:`zx_to_path` agree only up to global -phase. - ->>> diagram = X(0, 2) @ Z(0, 1, 0.25) @ scalar(1/2)\\ -... >> Id(1) @ Z(2, 1) >> X(2, 0, 0.35) ->>> print(decomp(diagram)[:3]) -X(0, 1) >> H >> Z(1, 2) ->>> print(zx_to_path(diagram)[:2]) -Create(1) >> mode @ Create((0,)) ->>> pyzx_ampl = diagram.to_pyzx().to_tensor() ->>> assert np.allclose(pyzx_ampl, zx_to_path(diagram).to_path().eval().array) - The array properties of Z and X spiders agree with PyZX. >>> z = Z(n_legs_in = 2, n_legs_out = 2, phase = 0.5) From 83a7cb4d5bc28df46f17b276d6ab276848b32c57 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Tue, 7 Oct 2025 17:11:21 +0100 Subject: [PATCH 56/59] Adding tests to qubits --- optyx/core/channel.py | 2 +- optyx/core/diagram.py | 7 ++++++- optyx/qubits.py | 31 +++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/optyx/core/channel.py b/optyx/core/channel.py index 5e1d69ae..7a8ff032 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -392,7 +392,7 @@ def to_dual_rail(self): cod=frobenius.Category(Ty, Diagram), )(self.decomp()) - def to_tket(self): + def to_tket(self): # pragma: no cover """ Convert to tket circuit. The circuit must be a pure circuit. """ diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index e1ea90ab..fbce5ccd 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -375,7 +375,12 @@ def to_tensor( return diagram @classmethod - def from_bosonic_operator(cls, n_modes, operators, scalar=1): + def from_bosonic_operator( + cls, + n_modes, + operators, + scalar=1 + ): # pragma: no cover """Create a :class:`zw` diagram from a bosonic operator.""" # pylint: disable=import-outside-toplevel from optyx.core import zw diff --git a/optyx/qubits.py b/optyx/qubits.py index 647ed2d3..137cc038 100644 --- a/optyx/qubits.py +++ b/optyx/qubits.py @@ -263,6 +263,37 @@ .. image:: /_static/graph_dr_qubit.svg :align: center +We can map ZX diagrams to dual-rail encoding. +For example, we can create a GHZ state: + +>>> from discopy.drawing import Equation +>>> from optyx.photonic import DualRail +>>> from optyx.core.diagram import embedding_tensor +>>> ghz = Z(0, 3) +>>> ghz_decom = ghz.decomp() +>>> ghz_path = ghz_decom.to_dual_rail() +>>> Equation(ghz >> DualRail(3), ghz_path, \\ +... symbol="$\\mapsto$").draw(figsize=(10, 10), \\ +... path="docs/_static/ghz_dr.svg") + +.. image:: /_static/ghz_dr.svg + :align: center + +We can also create a graph state as follows +(where we omit the labels): + +>>> graph = (Z(0, 2) >> Id(1) @ H() >> Id(1) @ Z(1, 2) >> \\ +... Id(2) @ H() >> Id(2) @ Z(1, 2)) +>>> graph_decom = graph.decomp() +>>> graph_path = graph_decom.to_dual_rail() +>>> Equation(graph >> DualRail(4), graph_path, \\ +... symbol="$\\mapsto$").draw(figsize=(10, 14), \\ +... path="docs/_static/graph_dr.svg", draw_type_labels=False, \\ +... draw_box_labels=False) + +.. image:: /_static/graph_dr.svg + :align: center + """ # noqa E501 from typing import Literal From 8adc08fa1fd385ae55078fd86384b7554f3619fb Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Tue, 7 Oct 2025 18:10:26 +0100 Subject: [PATCH 57/59] linting and adding tests --- optyx/core/channel.py | 2 +- optyx/core/diagram.py | 2 +- optyx/qubits.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/optyx/core/channel.py b/optyx/core/channel.py index 7a8ff032..0d3b2a1c 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -392,7 +392,7 @@ def to_dual_rail(self): cod=frobenius.Category(Ty, Diagram), )(self.decomp()) - def to_tket(self): # pragma: no cover + def to_tket(self): # pragma: no cover """ Convert to tket circuit. The circuit must be a pure circuit. """ diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index fbce5ccd..51f9627e 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -380,7 +380,7 @@ def from_bosonic_operator( n_modes, operators, scalar=1 - ): # pragma: no cover + ): # pragma: no cover """Create a :class:`zw` diagram from a bosonic operator.""" # pylint: disable=import-outside-toplevel from optyx.core import zw diff --git a/optyx/qubits.py b/optyx/qubits.py index 137cc038..1700f68e 100644 --- a/optyx/qubits.py +++ b/optyx/qubits.py @@ -282,7 +282,7 @@ We can also create a graph state as follows (where we omit the labels): ->>> graph = (Z(0, 2) >> Id(1) @ H() >> Id(1) @ Z(1, 2) >> \\ +>>> graph = (Z(0, 2) >> Id(1) @ H() >> Id(1) @ X(1, 2, 0.5) >> \\ ... Id(2) @ H() >> Id(2) @ Z(1, 2)) >>> graph_decom = graph.decomp() >>> graph_path = graph_decom.to_dual_rail() @@ -765,7 +765,7 @@ def _decomp(self): ) return box.decomp() - def _to_dual_rail(self): + def _to_dual_rail(self): # pragma: no cover """Convert to dual-rail encoding.""" from optyx import ( photonic, From c507136ac17ad46d86a2eb4f58f7f0a9c0fecda4 Mon Sep 17 00:00:00 2001 From: giodefelice Date: Tue, 7 Oct 2025 18:51:09 +0100 Subject: [PATCH 58/59] minor edit docs --- optyx/core/backends.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/optyx/core/backends.py b/optyx/core/backends.py index 5b8b2441..552933fb 100644 --- a/optyx/core/backends.py +++ b/optyx/core/backends.py @@ -420,7 +420,7 @@ def eval( def _process_term(self, term: Diagram) -> np.ndarray: """ - Process a term in a diagram with multiple terms. + Process a term in a sum of diagrams. Args: term (Diagram): The term to process. From 5c0a1afa5e74816363b4c9d618f8d90895e0e33a Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Wed, 8 Oct 2025 10:48:06 +0100 Subject: [PATCH 59/59] Removed compile_to_semm from docs --- docs/notebooks.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/notebooks.rst b/docs/notebooks.rst index a7b78f4a..2b6e74e8 100644 --- a/docs/notebooks.rst +++ b/docs/notebooks.rst @@ -11,5 +11,4 @@ Here we give examples of using ``optyx``: notebooks/optyx-compilation.ipynb notebooks/optyx-vqe-experiment.ipynb notebooks/bosonic-vqe.ipynb - notebooks/compile_to_semm.ipynb notebooks/photon_distinguishability.ipynb

sqtMlu! zOxw6ZdOr&GRh38%0Ea0k4}-{nHp06n znH;H!iHSyJd`{c^ko0hjL_b!*8U)#Y(|K1Fy*r3aseHx_$}X3jUq~=)YmkPjnHo>H zho-C{9=UQ=mn_8%u)o`A}V4YHNUXXG5VdbmXXavc*X$~*kESHbI#2ZUl*a| zBtwewj{y|voZ*}Mbj(+>kmuodO!M&I9yUdB#IO9B?FXBs0LO!wT_M6kFA8Edh8Y_C zGZf#I2E499aC5|>=fQ(Nsgoi%ZrtFg7fpmrgb2curC`d(d?(Fky&oN?nK zWrhSVK}nI)JftWo`Irclu+~%6vn~OaE2DnGXvi_FJrD$^^}1I%UGZ$U3mm+_E<0}| zPOjuxbSdYWsUzn_RwJ3KZ0vR{a$~UQ!OySmYiklm#E?kJBsJDS>NMxUfrkVzDG@Zh0Pqe$zsW%7n? z_7L9&A<>Q)oxL0>LKX(edqNL82?nr%mfOvBJhz`$(^z65n`qgmp0>DnMWAnI3CrH zJUoPlf1+H)fh3hzR8%NdAd-RDNNwM9UnVh&^|TB(u`R><&m`&;7lxiTRVj2_!a^v! zu0`*3Zn{~C>*F~jAUqu9yO+R)o(yT`j0i5$G8AhSB(?30mhjEZfeTQ>VLU1S znc_I6xzavIB96?DP*@8(e-5{2HJMwYK5*rnMyOLW0s<3-p$shCd|E5jb}}e4F@4m2 z264d57MRBNi9UIGjxVVFDzmEUEv3iAmZt(zNya(g+kybartb;8m|M|Em7`HQki;bP zF`;7HH}IM+`IC6fJgjIS67%p}l8yznG6g3HO#HHj#%jL=-&*~T$$)G95BKYwLQmyG zSS-|skG)(P@<|A?k5SAiJ zge`P-5Az=npo9w+Mq2=h_oGytLDb8(LkHqb?Xx2nctv!c`uLoIe!>eXO-qISP+CTB zkapGyc3J3t-p(F7Q-kjR3@n?`i>GTjr?JLSTxp&V@%+4ae{{{%T8Evcu>4E`9?X<^`7a^z;HvrV-Zz(CM z&0Dr80li&KRAi~1fTJsf$0Dg2%8e{Y+$2EyVmTa{d}tt7u`f}Wlo4?vZ3Jf-N@DY8 zk;8Ccvn-G#z2w7?NJ0*y*S2okc9pmej-K>-dk!8< zMq%jaGPccvCpZKaBqLy`=QT6hm3+=+<^(PX#Q=0|9vXZMa8xoPN5LE33zM`yRN_jk z-5H|jdhzg z;e<9pmGL*Hu(GleybbZR5I~;5PRJ1YLXS|gPa?lN;Tk^`flMRHGoDtCMJ71AtG&Ml zZpj{cdSg?h8&zS0DV{%n@84NdNZzOhNl=FTV@QibOLO3vLok&t8sDO*qH3C}-b>dl z?N+R4YHDg#ts-zBm+~7zBoj$^?$X83X*2415tV>Sd+?0eo1qGPjQ?;e8$z8(he$bw z8QHl9wJgWa5QPvG#~CY??{-izAHs@_sBiYrs>nRAtgIk|{|3fT64-XUx+AzR(bBM# z45>zuLiW<+)CA^e4^pzI_Q?Q@&d6k3eRJ&{hbI(c$H%_DZCE&nQj0iEoH%hp65v*S zMxe`2laU=kV-uuW;Hm^+?}=)*;|Gb@g>|R{d__XNSnJ9VRzk|T6IobT21vgr1RIX& z$MW(dG*1Y;F~ILPTq5(2{ZqPqMiZ!DH-l~I=@|2oE{ZA%e`36UjE$v}o}Hr3*Hr)P zDeeo8WbSAT8BYVQLyoIuo}RYS)5niLlL3G%Ms5S5E4dALEV!Vh@F982bKp&bRyEI@ z!xeyQFjXkHA_tK7%H!(p?hdwo1egz}=i9;~9BX-NZe4MF&}tFZ_(hP(Xy!z5&t0VL zn6WN3?b^FHmdS1IZ@`XhxvV2y&vPviXU*g64u1(Ws8Q^kLy%?hOo!l;OL6S%_A2`oKB`usu5jcK+#{maJ=R|(nO{p6}jy5%{3WsslZ4iU|T?Z6KcUfU!&rAqO8oLL_W-L0e*hCHO~)cZlLC9;}}mM zvqxpB@W%(6cK@T;b|VVV199_F7cZ)IFf)|V-?{P)|2^$D%GIf`L6|@Vmr_{7Tl1{p zMNxh#H^U5XvM#6wKMm|(1gbDWi92~UDG*FEJmM9UiGRNC2s3yJeMv+}_a9C!cK!XI zuFw#;+DcKi54lb$XcyW^`I8tjB0mQ9&)efrbR5Q@k(w+5%`Hwh%5YaAfk2=sT6>nT z$iFX4W3^%OR5_jFhP&Y`*bO946n8nwg5C7<%e%;ZM1#XObEyYqE+KlB4b6ar?}(|$ zoQPcpz!FRlSn9Y@EX*Vl-S)ST9VkFxrzJt*0>T9?AZhl~gI8-q`6TdNd)pZDxnJE% zmuJHEacP~9>UeYgzQb6z`K%MR5~+AnjYLcOW8G$b7ccziU-IW))5;TVH0t(*Cw#a# z;3-WfR5Rr_*ZwBwk6`y)1@hmud$)NM3Y`vWUb75$v7PGHLb6_P6haFX?Ie!h96ff7 zMG6u@8^rW9#If@Q&y&0PL@x@1B!p?pj-5MSA-73o*opsrmgSdlq44|n@7ag~l5Inb zO~|o!cpAhz*Z_t%!)-)#7_~DV1%PPE@Pn!u#oV-r#Q_oZYNoyvIRl0o6+k?)3uHOm zVbH_!BY}Mch=+Bc=a8U*%enCnyG8!FpIMRragOs=p)k42e|>$`5&!@DiO=p)+LuVo zbYvPlrIh{WzG>cS6ZLQbc3>CdqYD<7o6$*>foL2YN#gEbU-?_sty@yx0wjnbAK$z%P$CuZ-s_{CHHyV>A+T>Rg1oc3#)WHY^9CnGt; zLUVX6C~Vii{+=I!6D^+-z;*}0Q5vxdr(wGeB1SM1#ZgenbaQ8gpvzEVUE(V+O|3yTO7yQ13JGU%|!*O;AMrZ^Z#1|Mgx49QL)p(LU; zV&{`16jQ@l^@DyAhZI1-$Z0IZT`$9AX$A>vfdY+Q{*M%aX&HUY*kI|qlXW$|<{ z!7s3jC@y>NP%Y47Pb$2AfFljlQL9T8UEhAtnS}_e)<>Qrah%%7bDF4n4vuGyfpD9U zZOE}3P$Y+s(1f`TAlwOb5D#vjjD~~%noYor5Q~jO(TFz&XUoy!fv}cONwft-I1_jc z7?f1y0MGb)ct{l5A3Jue1-WaSMgc(9F2rdMX2IgRuvqKp;SK&!r1<@QI%W}Cmi4+4FAr_C!cI3$4WXoV#5mrs*C14PpVG2ewIqaHilRFks zO{W)@`NCgrk#V$b1CB*s&AzEXz;vUxo(~L?uF0OZRErSk$En&B6(otTI6T<2p95YF z&cp-;@{J`>)Nz&zXGfEPphpuZ_d(8d;L!PfV6@La4bf8R)~$RpQLmiGiY9%^eHcw$ zddN}-;!tNiGP_;U2g$n_u=7p7zP(EuVCQd#6Q8qS8VlSMRrQ-$WhC%PG|yM;Ij;jbEeaRz?|f1T&Hzvcy_N&SUSvgX~hd zYYK$(xOusu_|`HbadFQd9L7LN{B7}1Ku`=p2$BOoa1NS;D(ARV#Kgpa%4A>>;G{lD z*yNyuQ1^^?aZXDy|KI>GZQgxZ+!A3o|3^?(XhV0&cV$w$eQdy8i7@VDF4!IUSDIU4*Kb&dkQlEWYYnJW2a>aBgKa z4Dp6NTTX7i_vGl~*Y`4R2n0V@%b3+Ur63mkMK3+$(nqeD?j5I}+}N% z*WCKSqSF{{;UZ_SKFtqgOM1A9ncFG&ZY@jhP4(J z7C89y7q;9Lw9=zJlRe@JRV*h@ZU*URc_z$h;29XW2MuB!w{FRwG<5Xz*Wu72uFpI? zGBQ5iD>1jYsE2Im+`=?F)Q=~2Q4ooB&hnX`-8}tz6d|fY0Dy=T%OM*jnFgPS|PD znSU43!p4W^aT7$3A27 z=g5dRD#WQ{rqG*skdMzcr|!FS>C(nco8FDCd$NA#?;T`y0pKL1kW%5PEJS;4H5TTmC ztgKEcJ-(^ngJOdZ%FWJtb&(d9L^%ir0&pJSN9QkJPS4I#K7K;FpvZMG_fMNR@K#QZ z6}de*V^+4d7jE7>0ha)yGs#=Z8Xr7Hb5ajSWuDNysfV8XgmV&Zx2%qtnb|mB;zcg> zj$<_7=(-*14T|^d2Ae&Ljb>(Mrl5^W%7r|CE(!hiYw=H-6RfNfiHrJ1Mgdt_d}|If zGBQr!kmb+%x%%kQ37Ayd)*RN;)7#}KZc-K7f3qcNZ*lIvg!;AV zhyP{lf%fJ5_wMmKr$ak_mX^k~<|ROoB1Y8D0O`!9eJ&8uKGsp;NUC+ye8xIs6BE-l z=|Ibo%KjU35bz?Gxmxw9A(Eyy>NDX4$3`&X@q?DIcZ+gQGc(7iO#sDQKpa)J8!e+b zuxWKYr~(U3HkM&y9b&pH@8R!B8eFNJj(Q}#0t@5h$nXi$U;n&=fsqzw*9iRa!E<+t zk9ki?aduX8pYSmOfsmS-ngrZMYy_G@g6zYRJ)0lSfsVIl`1$QzzwLmsS;6S&=$ou8 z_FM+eDg?Ma8|&@`?<%KK4?=zupm_-no9{FkS9A5uzJ2@7+7Ip_DeV{+wEshpav!Cq zb0Zz{5TI|LV2=i~g5&)06*Teiad7JkRYH9_|JI zEZE@;Ic9mW+VMeD6qBN&qO|Zqjcl3|dM?e-2R!pS!DW3+wwO0UbjbPCa5M@V_8a8* z*obYMEJ*awqR3bH%#Khu96WfipzX_-FMDL9EcEpsph=mA1ercwHJQI8A#se4Z#T^~ zOUv}^`y1M>sP3CJQxc%1rG?A8!OPoQMws0Tc(xaSjph!j_ziTq&FShnCRaljwgE9T zOcdK|%DEH)UG^D-Y|C{7}CEIZyr*uGMWL=Yy zNrPfXVB)z!=&GNDM^V!|^!M9aKJfp6=EW@Ye+HMr9RwTz=QhuPRR{q?SjgEO{%ytksAZveONJTsiwY`?rXTY+=P z{Gq2gHI(mBl9It(rFB)4RX7uQvjevt_1lQI1L#+v;3}C!{e|6y_r0t|xUxlmh75n7 zSQ%=9Qw3h)q4Kozy$w9uM<`;67agoW)zy`Q%lJh`(z3I&f9dE5b_k}65_7)u9lX+n`IdA+1ac~CEXwFQ? z6g!xhe5a=DAVRFe6Mk;vz7pX&_j^riYwIcG*Q$#*AKSBe=ia>!0r{SXg+=3$hPySC zkFm0Dz)73AiM}oPtSb};bMJF`ugSH5+sSC5i$3)9lrlC-R7RrhlC133%&e^I1_loi zdbpXr%&|qNA|-|6!-o%td3biBAzuVcy@KSpcXw94zJb9JA)y0+EwL|*?6ZT;zuE!3 ze;(BIk&Sw8<)=??QA&QVEW7YqbkgCkt-qGZgB(1#MO#~2O;a-(`|?0>&#ZLl!1%?Z zejk3+)z-?HPf)Xs@1rnDKcFHjbR56&?D_Lgq9`g5q%DVX=pt!3_atTm=2| zi-_HLP}JvTM58w}wg$nILK(2!8T$CB$PUcbl3-@&RPj|Q}GjF)#8I?V^{yHfz0 z7}bZ4U1(ZwVAUb2ka5|@hBrJSLVe?TE`*T8uUy$7!&+j9%P3x;vT1U)x3}lJE}p^6 zueY?cjNCv)fXEuCX;V9Fz-K~!EJq=rZ^Qz+f91r3;^K4UjsUibZjJwekmq~sBp$dI zUI$KZ2D}bYPt%a5#dT&}p$<#y;;kWiNS-p`#xXUX&2{IvxM-nHy@&c0Q-y=2@6dzE zRK||Z&yDM871%sXeX&dL+BF(z^jNC*m$?ybMGd)+BB5zaf_h6x$@D*`|B9=LnLOPh!AD(=~V1I*l zE-53Ux0W+dJV|;4@~Sj@ybi*zPgIVid5O$v%@x)B zsGtfQocq?>dmpb5A=?)F-sArLwO~xiQ_`}pt~^Fpde_#rA8{3w*GoD&htR67pcH1C zv}{KH`#h#?PnEw)eSUp>!hB1h7C|gS^c?{JxUR_b`8B?t?F?b8a^Lf%Sj*D9u|Goo68-6-xOysmg>q&-A1SGATO62T%d5?Cc((d`617`@r(Qfq*iJtGyrhI$QePNkvg{ zm!-}o8XVgAl5c$sofjnWYU44NcIdoB`E-1R-lLYMxEh zeW4wm;-GRn@PZRxaOSrkKKu#%G`BR*2d?)B(|;Xlk6nHzVGchAKF#Fa5h4K%nyett zMTD9DKx)(f^To&2Tv#L^t{(v!{epwntE#FJ&me8G-D5k`8;dTX@N+KvP~+a@<$1h% zbwu>`+#Q5y$i;t8O$9!WH=b}+iq#TzU-5$6`5h!@S0S@;uQW=WS!ce2iTdrunQd@Y z-vj+AU}eA%*bfu}pGZPdawAj$57fFFKnwW}BQH8swmx-Qm|{cja(gGmaXTI;K{0kS z;zxJAytYmax9>)hC$J#r!E<1GM3>g341aKs2oHbma{^l)2%#J)mmRxz-$$FlizarX zSietE&-(iH>r2IwQn%$Nn1x=Xpf+yb?(x^*JBf*GplLo3w-SoO1K;)ZFd@S75O7HR z=uWt4cSz+gFMkci=DDb=P&x76A~@CQ)uIF-n{t>Z|gV($G%`^1%Hc})cwa_vB64L7Piz! ziAmtBz%>&S@=m5-LqmE<6{x+rwnkP?F33N=X1VHKT?2L-(kAb*mB0P?@c{MZ$eA6BqZI!7i$+UZo3I_6L1)af>?y}2JqrulVrpt?H`+;$ ze9(!;xna2eYNc-HAPZeHGV(y{J1io?fWBQ0+vWi}ixi_+B4tcbLKA_6M5`xTr_7fr$;^mykSNJ`9MsxIDbo4Q@GH^ieeRK03SekEv(7uh1(gKXs zyg0oDGyMpLL*uN%BeWH)vz-Xx-@%Lq1ndT={tXiGwzHD~)#)LAO!nu?#$RpH5sF<$ ze9O=Soeui0eTfy~-IIs?`Qz8GPt=&s#zsYx4%q*G$;s^MYHGhH;M8A6(ErEx@8?1A z(~A@1DJTKMJo7xAP&o^ryO}W)u0CpTKdF zC|GeA(BBhBO(&}%;VHpaul(}mc}O>vN>S^B%ps4nW!IuGlNnPuwpL{O9e2NUY&sG! zEgo8S6Q(*gQp~o0>(vxBKN>=>V&WPUGxhcLpOut|u6c$Nq5O8SqZ#~giY4i zhKy|H5b*E2mDPzpnb6W{>@^X3+)Ka;yvZvN+(cGMGmxC{O?*lU1J>YzNqQ8m=o>8T1ia z6|kzjg}R!C26@Awv`xXE>(=q8gD`MrGJu{)D&FEUg88K~Z)j*JG7lHKXcFo2V~&oF zp5s)M5ElKupFfqbl|MB!_~9X(26~EJSoyYNaGT>VGa>V{0q@THU1y-L{~7N&+C&o? z78U^MwX-J+HY467M30=Drz1eT`>xFoiAatWu(vDU`hH_$BS^0Y!qZa0!NGstf#h?7 zoBQ&43%nlSOL#KEQnG2@-rmhl?KmECt4%^eLJ8v%JEPF}h2qGKmxG4Gs(UXZ4Annz z0IH8%U0t0%HsujvHa1VxJ9+Tq*Jzbj(1T)QV#paiNmbPlG7(stvaMJpm94G8I8SqF ztf!Rq=xZnfaKo9_99B|NLJl!-k>QDqzCJVgBpTqbkrSs*JriJh;^PyCUkyM}g{5)V zaRi(6Q*Es`c;pc^u6e>!!MB>;cG{lE97K+LJD%l3=9mvfckb#4nSE}Kwd}k z@?~GxG|({Z?Dz{P6eUD*oD5i7cfyfVguX-$vQ8~bn?h;W!^kKHdq{s|2HhsGDoc|2 zHH`0Po}QcFoky(T{2Uyr!>{kX@Vwx=u5>;_;2Mac@{QE!YKS9rI06&}is5Grad>~RzF#y3wV@6uAS z_KuESGzZRFy?kGwVcnrf18R0OH1l+e*xutuj@(6_MTX`k0K^nf2^qf6C=(lL;HJoo zYCV1|<_kH5QezjJYAY)*ABQs}yJ=pCIPoH=Iaw!h@gk4*1o*msojWjqJZ>r)>Dk|r z3Rp$v?U@fbI5`LK%E4%|h%nah-I^fttF3+;7^pOz?1Nk+0TuK(v>F?0YroH$gq*|k z7sv95Cx}QZy{<$?+q@4Fi+btT{{Hd_ysge4(X|3b$nhiOMHJ-tDK9VY_vQaX+?z*Z z-S%Igw+4z-M1!PEWy+MwSTdBckU3;XrII;wRLBrzrpR~;NfBjMrnnQCN|{m_DTfIzR=g!!3 zAG`O>&CQXxjj)ypc{Mu3SfyNQL+ArIO%_idUVFwZH}2+VySS z^1`B`Ow|0(5nD280!`=dqQ5!i@)Z0r4fsN5_A z*Z6K42k*rrCuVbM0@8hbeS+|o%tEI@#>Zk4ezN~&Gt{S914Uu=)cIzE9?SiCH`uPY zZ`j~S4eTXDM=HJCEc!)6M6$t>$un>v%LLAnvi?v6Qadw;RB+JBO&X{Sqr{C3vUM(C z23N=+uEJ~UIeH&CI8g5m${zgx#5MGjMCg~i3O;;havzF2Yk z2|Aa%Q|?2LISZV zAN5Hp8ccbH){h_0IJ>xHpz+hthF#p5xNlIwxK8#fVA`7>saPZP*|TT1jFW%|)wUmS zTfKH|!(1)4d9>n|Yu81kr4vw-s9+(WrrwcbM`G5u`C}W#>oTd-&%^u>Z5(rOI0Op| zJ{}(2TE9!Q;ZX$YrUqlI^;oZziVArsTNVSxX@ij$&(83z1G{;;Xn~^(D?~!aPg}_= zC^Vs>n&?g#UFdgk;}}P9S0&pY`}Ipqf?1vHY6?aNIjHaF=I8I9mUSIfgv2cips9x2 z^|c`?orSiVixd&9GLRZd3-1>eCMf3u07j9beyZ%}Pag=zSL`^x`1+1cB-ndpCr_Ui z-f;*7mX&>M-e#puBcYUbt?~o#D#>*nX65I?DX7@0 znq^Kq&5LRm#{v|4R~(xg6&KgwA`*E#`&}Vspe<4eV2zD>Lx1EWo{8k*5yXycaj~~v zhk<0|%+c@|?~l}Vy<5V-a2RA}SMJrGLR+S>(a~#IGGfqdC`*Uxls8rzmr&6V-#U1?UxJWV(0B4qyasWGZ-02e?n*FEo$$qo+;$ z{zfQYfU+5U^?=E%O=G_mc z;{zdmM#(fo1_p+$VW;aJAZ((Xz5iGZ$#q9M_}xUnY*ZT4s#PN!y3wJK5Ut0srgvo} z>Q>1w00wH>)pv9{4W6?Ijo~YNu0Ja@y+Xtuy>9EYQ0vos;yF1vAIpfVh1QduKiGD4 zvS*>#*ASK{ajs8+Xg$Q;9AE?lvneB=sUMfz69*V!Eg7@3Q~grUB%()oqccPT8j2S# zUCq7i6}!)LwyeDT%iK8x8VII8`ry?J(b!f+)u(`F4w1q}IA)PW$%ZOfvS*X_h*7jN z0Hnrf8N~PD$n9HYWD>RI>!O)dC$C8r1<3-wc!J)=W6~J`q*JIG5U>0!#NO8u&mot} z^9S?bmf63RBE&R%!Z_nV7ONC$Gnr=sN9a*C9siDnEJIu!jxUI;UX~Db2i?5$(At+e z+t?UA`{zPSFf^=T^PJo#^=N_hQkVzn95fOXlD3WF1cSJ=?2iiAtj=K%emc4g@`_z18hZ>6b;iTe7bC0~{L zf7&C1iX>w_H+QYO?lDl8Z7QlN(TS^GLm`vCHASe6mt?=xd1C$yv!^Q($4JGqi(W6& zY#r~-Xv}6oHagDdQoo30K?X7%z5HHOuq+fZ>|8U-fxIejlb^N1%}gOiUU`K(7iKXK zPD;3-E4$I#+uNykc42;C!MF^eftGaNkvCAlYo&GQ>$rn}zSGWV&m6)QL!q}!;Q8&w z9oH~jxZ^}CZm~)07B;SwTLk_zQnIld3ci+uJ%ZyQ!#PaoI|;AwK?Ern8#vHs})P6ch9| zCVNF33J55b@Q%0^P_tkne}aiIDJkjwp82CRN7*1T^C^$6cohzExP7p z?onaQ(ex|VqN8i&UUYN_f0hs4z0zRkCqOsi5O4R-g6hUd4G+Z4*40VC?|H$}QD9`E zl=%Gzm`0B$sNc|7b^S8cpG{U(zbk~b1RO~Ptxj<)*A<^!`FU$OEe!!ep>hg5)ft>_WXN9OaG8D+uK z&781%i1IQ9gpr}4VZv^QoAiE(Yi(CgGBaeqU~uXP{XQ+Ejhr0-cxKAF?gO9;0I|!K zEwl74z(~wnj1f>{G`}jU041cSpyyIDGWt?`9glGk&_hL)xslO2@Sc_hT>u?KjT!(D zx1}jFBwW94jW$znw~zyRBlIZ^)*qkL)v5K}&*GcDEm#UHp~7PUt@dTKaCQ9$(W((7 z1_IBOsc#f+$hqg!JYRrd8E$NBe6wleh7CCe=Lai&AfvX;>ZiS149qyOF;FR?{HpOo~ zRnoRZTCoCNN1FhE@^0Nq4}g0=P+u{76xFcVTb^nucFJ=;%*BmGh3|7jSX-v3QisqR=xzX`tH{R?ZJo&tDuF)&)a4iL_ZqHsJoB$m71{TD-f;-H0Rr)Tp7X?c6>&r=!` z_)fQn18N~ukh#6{XMu*I3#O+$kSRj|pwS1$u240|YD&Kssd&@+&>9zBtnC*M=oC?@ z*k-x8x*i)qgx4?gLsn@+K~*|d`fJlmyMt@8_2TLiZJ^IQoVz9|p~m+o<_h1_hO@8@ zZ)?ozsc2|0qIr89fpXq9tGJ-RiuRNM`3N(59qhM0l2(P2sUEV7G<1w0i3Wf90k6SR zT0+SgDZR3BcSQ0627IV3;go0NJW_WqQywKzF{N_PXVy7uG$!!Ijg2l|hZ)QiqGWs6 z-z?C?KmtQ25Oc#Y(S0jeL{dIJ!91w0&}M4}QEh>rdkfL3l47=5kcn=gjNQ_&P_9& z!Xb2dTP4KBEp3UspRglPg73rlP^YXoM&zjU2BuQ0UY3_iUHNd`5(CxF;isp&@1IyT zzX!Ba>7`>5`~{2D!kisb0@KxH*G;6B7WKS?s!BNTFrvuu#ocHwxW&cq@fBvVlyC*` zx6y}hl3NQ9OtLkM{fSBdxZS{MwyyZ3Bu;R|_iPLl9(N`mb)!9d`qajT=d*^q>Ut1c zNLwF`KZf5{4U22Pb+3aeUFKgVkf$I0lHM*|Y?rwBBLMb;(AHq5H5ueNhR5Y{w1aHP z5@&w7Pc2$_+&^mLOM$t*-h%K87wC@Ii!y1)wV@|X9PF;CQOa7Jk^uP@veqh4tsz2 z&R>9kV!aN<+Cs7?eg3EP!IVAWfTNnUjFQeR)%h7A_@#w}Jfw_8I;qv~WW{3EBIU`y z3s3j@G&Dr0?z;N=$FQYO^KpyWs3U%^%I(8i!UrJ}(Oen3W?Y6JP;(!IkB_Dxj65^s zT?~LcTH||oaIj8-1qU_9rQ-ZA*&VF#o>H^>b+xoqX2;qp@9zii?2m=sJbE<6K$J%b{eYOOk%?-Yd!p2D zc=X{nQn>_1b?R=9|9*C+zhVQ4X@F=FcK4t-u{v{R#qQm^Jv=;8@e*De9I#!HAC;Ns zevvi>xsxzw?^7i{R>I>@2uFWqlbm5Ve5+X5b_Uq$8ojk!WJ_OBR#rCJSH2q@A069_ zCf>&Nmh1Z=AyA}h#9oVwGvu+qR$gA-`$ctU1w7$v@L9+>%b1w(!Z%NWM_GGZTWe5! zF!Z_p`7ZA7NF>eP_kkMUD=gGIr7E<$^VN5@8l|u}KRIO1=WT6P5u(tDf$=!yq!x92 z#%OCyL>U>^?fh&G)CA&I5FY+OW+3Cbl6<%;MCB%(9tX8D>Zp14bUC)4zU0cB@+H|y%^=9v!$MG1$xTo;;5$a5!3+>hQSZMsea2NX-a?$F{kjSK9S z2+VK{0lUsics*QRKVxdUSIhXd?V7*QPj|cf`uf7k`(T>Q)$SjQ+4^)CVs5sy0qyiP zI$pmq9vG0syB{bj*jpa!N1nE_dOX|;Ib>bxzDwP+c$w2zq~Fdy;AwvL3_R=IP8U7Z zt1Dy7j+jJcyEMOqAaN~CuYX)(V!R0;X|AiEDtyAf)G*!F8z{BI)NAC88&AEzQ`4Hh zbfw?NkPL{xeu-g2O5b$T1m>FX7+B4SAm8zU{JL>h16``GezCp&fga&qvLVEqN3XC>*rg0<6L{sH}_0Ng?R{z?%1(o2HpYGdExXa4OfG4xrg~9!^1o)xSIreyy0DwLr z-(-)wt0)@GmQNS;svm?1f6P{e85)VuKpoGS(a6^fNoJweT2Vo$KrwJfgdzP4UuR~X zLkR;BRXTA0Y>P@+$QiF9W2_t7Gfum^^?fd{NPo4hgFYmP+p$D1J-jZ0nU?KAWe`_< ziKzEJA4`wbk+9321H39kV-Wy?-(k1Qw@v|&_&i)>`rABs(-;3ji4>z|mTOUvdZQM+bPwd<7VN)YJTP+{f>>1u0hL%P#wossK388k^3sTP1@IC1_H z;519{l&E@zP%5uxWxa@2-(#% z;o4?#CQ)?|Be*rN2f`%uRlMbQ5U18#{L*=ynVI>hv$LpE+1>Au;}h+H4xg$ik4bM@ zc^NprK!D7pJT2|*tQbjujN0m2OiTcz`0`#e%Mfd9=mT*$Ap@}M;ZNEYoCJ8l#^Qlq z5u{fQ=9k)l{uVbH?l#-B@}+vQ)T~868eA13<;J-p;!;v|coyP-XWLs0Lu$i)^t#vU z>%|ncM4n!udoEuz=*a%@UAc~K>w7&nY}vr|py(!heES(;?B>+Fcdw#~h;RHAN=kO< zhAv_66D4PYv=a{o%Ac-ChfBjgU@KNgnh-wN9pf@DiO9todMV-d^7~|nr0ozI6MFbO z&?0QCtykknm$igfJV20Gp4-xnMiMcGja#(?Uh2gGhz+rQURqjejM-ilQ)m}py|XG| z=jpZoNW#~;{KV8!3C55@-kXH^zgYL;JTTStf#(x6J4Vj$t2upfJQ!Q zgB>svgHzG*g*p+cgCKmQVcL>&cACaa$7gTT2iDCRZV5jyDB^Kx<=GXE2Jc#)rf0W) z#w}`4-<{oWzINBe_yd5su?bPxZ~aP;&crn>Kr8jHXCAHeVh4bs3}qI;maMp+LT>?r zG^?FBemn@9cgJEIr`M^#d>9zM{Q|r}G{^-Yv#EOlnf;nze{Wj!vj;*e6_m5DK113O z%1+NJ;5aSkJ0~SK(Otj`^4UTpF;MsTS?Ik50f;OGN9O44Tmw4(H@p3{`}gm++c2oc z40GP+8S4Z6B$1&MnmsGuVIjsuydc?!&p4(-=c#qEWncnKD82kaRbc-yLQ4gk=9A6KOB_#{{>efcIXHgb%7}>-RNh2sPT8As zYxF0cV%YZRU~*vfUd8S}5PdK|_ihd9VVMNZj=apd1hkFVzu$VS4{~c#V9v_gOH!;vm9aaN#FzK4h#G zFMOSa5K{wZF=|EZuG|<~lN&at7$-^uMMPG-di9E$uyLrMu<#;YmE4PQ9!3In;w|11 z?}O;6u0aS(!~?U?1(TJqjLB+*Xtbk@9*-B^_K1sqnW4&R*7gQ!|LOAW7WF;T1_s% z*SAifz&ud!g$F#s1}J1~pMb4+oBZ(Jy*KtQhugU|n7&jN$5Qt}z)m!U_}SX0PnkCF z@lgaHA18J+0=hC@l%@c@4r{7;nLzm#y}Lz+TIKTHa%O5upyT$so!W^zIw5O%1A7TA zJ3kCMSbIwljV>s_AF#CPjI6hofRoaZC9gt2-KE(|&5vSu+zm z=40p1Jy7|f>vXeTc*T1wJGoZG4%&0gP1`+a8h3KUdS#w46+Qp1NeI8frJ8kyA)-O9$McJ3w` z1~rc#nBKbVd$iPJyS!g4p>;Cz zDB-F2Uv!Qve(MY@OG~#12xN%3T|4q+oH13G)p1_bwk9HOST4;DNO4Qmp=4PD>vzs} zq?d*W_~5~Vr<{h{0ULWcxw^jpboV}x?+^nwv~gs}1=tOIN{F1{5$YsVw3_7!KgP6 zf1fwxEOE0iwKz7$gNZ%ieOgLAd99EWy%r?s$622&H;#dq(yp z2nX&LoQBRF!t$81gV7NNXc$Ld-QOl>NVUK`kRf$OHL&L)`&SvJC5y<2`kh%JW>hD^ zU~LL)Y?HL=QTMI$h^RJx^8ya^xTVCJsNITVrh%;yc-ctx?W*}rvv#QGb{yxEWKSdxuaVl?P{)a zc_Or+N=r&xNg;AUWaNT(gbfiA%2g`_dIu+IAD{%KT6x`ekW_^&y>a747}{|`w?5#@ zIym+G&JlnBq(k(-XiV$9_HbYaM0qFHEWM!Uk3oY$RLYVa2lnr` zhKm}7k$y|zYk>(3F;C&O_=6U?!tI%l`?`(dJ_l@ceh#oC3zG;USGW{7fDj;jCcL(x z8s!CX6+-~6Jb8&ETFKBoXA)ile3WsQKC0M=b32HLqzvDgN(u!PzllI!{)9HiWe@Y z-@3JpX`UE#P{Z@;13x5}z!L~lYNccN)w^RNu^b=@Y`iZu)YYW|mUL$KPzeCTCw`Sy zxW}qJeW;oSDPqDUD?m6Kzl4}ndhJBb7y+a#g9v6NZ5auYjF$0p(ou}bG$h@Gy8jZY zJ7G7!iGHEb;r%F^M#4>~;YUlkK0(vWSm|TC;azaH%1B1&uq|kHHFfpKjTUOLh41s% z{(P8E&p?5;?`B4DA?*tSI}ZlK?5*0vYGMQrcbol0RMfEFp`?QH=aQC~k6X1veVTMx zFmzf1ZmZnJcwo2VX{E>>uKZM~Tn}b}H`7#18+Gg)YhRvDx5sSv(jx{yCiYN=bpf$S zJH1^(4m|z#lP##{vd^kklMdvbD_=9nRB%n{Y8~+d*zEQN-`9vSCud*^t7De3G@_UW z$2gX6z5v)Y6#Q(HxLll_@1eLmSAqIE$K@l8%*6YGpaE>RD%@@VI@8en4mQHs&0B?Y zBP*&h@+^UFq2GWGEauc6I2+ca4`Y5#W3YrGAf6xkm5WRS-Z) z*#^B1##6HSc)7Xhkf5KSLXR~q;LTU0)oG6y?lPzp0c*V!>wvN}JUzW(1}{h&^h;|- zOc?OZ9=}78?hV*}9-+t1avGat>xr6)t+HFZ0L6d5p0Ox!|9VivZ2j->=EQgHirYZ1 zt=VK_XBPs*ws7Tnpw@`P447{A99y!8j)0F)ncNqbK(FyuFrO(J`w`OF{>$a8J0W6x zTTxMFYRu(si5O0kGlG9B4&`Z-&BCK6gHXocy~Xm~34wLA>I!x+57HWiFrpy|E!JR6 znrfzT7NZUHj`9vE5Mz^xO2|ovJ;xZAEP{5WY3IqDav!GJuRbYQfDW-%US6`pEy-ah zKqvx^vZENh)-pjUOJ;d7GsV1l^XBk?g*W-R*CFu6YzFNHfWy)#-vL0hn32AMBt)U0 z?-qOMt@ZH&6I))12&dOO?DzE$-l_cj0(DAAnb1`%_(6Ec4sMW#k*~NdjSW7PS2uhn zCnp4Q*}e64+1tBk5`VVBg*GE-O(v0W&K_myrv+?Ek3tgYdfppHp6J5=?4F#(Kq>|? zLSXcwwthQGx^Nt~80guVc>THtv%!tTM8PlL*Pds9fP(+G*oRUGj>3OUV1p9kgY}m! zidIr3phcSI#87bi7N+=rwE$78+1LWmkE#i9OT|J5yOgoUmT2=ntrF~CXN}QCsMgY0g&2}#AUzTNUwes}ftPF2EL1JJS&UWVh&(;R(DG2sN3 z=ySs{v(8^tPP)Zrp&4P_aMQ05H%B+(F+0r^?tN3p&qz|S_h9wH9SB`*ijMHawq>|Ea21DdH@lFB?HzCm``-)*uMFm*lJ z=T`|yVP#LldoBw&^Yx;zzMY}!*^*oI4>JUbENtk`B7{7pqQWpl`X7ByAd<*JGEku4~?spU=(5B;93ss2Al7jAv_0Mx^*W&EG{Ip${hoktd{z&Q=w;83q4{KW`G_onai>PNMnme|_RfU6nB~jX zNn3SU^eaX zQbkp@;HUm=!*EnG$7t0~@8}_^A_wOT4Fkv{qePgR<@CM@2JQXu@P5Evw{SHWY3b^g zp-4HtQ3PNcEl9@gGC|sv?@zo6g8diHE@qu3LUr&CLQRm|-$MJ4tG^QWO7vtmIWZ?w zSWv)?o?22|{7o`ahF*8jnZB}EcWp2dsE$G~iSp>Rnr8~6m+HOBeM7>`7Zeq-t13R& z+uJumeID1lGvO$-(b`FUYhw*g~m**VlV$ z3&70T7H)RY$;q20e-RKFmSF+J>gHZAGc&UtS{znq{J*E|#wI2OlU`n4L=uQ%k+l%A z0Y&T;$uC|DzkL&{54YU{c7|2HjY^w`nxtYHvx#YVa);3!dq|eMjwvm=pqN(C+^hx9 zkHwR(!Ak1^dL_oMc$5w0DPW%ZN?k5*!y*d7(trPZKkkSGj1UzbXV7c2rG3?YDKlTc zdXAx*YkKu65f5cc+kUnA(a}*Ie3Vq&K$HN31jMhaVA5*z_Byy>JrI!mb7W-1>&H}@ zz6t8oitmbDoA**m8mO46qZ4!{iS+&xXh%LuP;nK&mEl9jRpF zUFHpvDnp)YS=wM?W3u^La`JX33+Qwq+_gh#N{(-NK@VH#L+O4f(1;&-+;Ny3>P^mq zG=ep*Xr4@27=X}raEC|F$^_ef z7$3(0P+KN@?^)HJMCb2(7u=@8hiEvy^XbO72AxL1NFmS0^ z4P2&lmJDg$T{tYYEm_=Zk>&toth8s(VsBIlU~&z7qOI@5xqsxq z1}zg3FlX-=-M!iS*&aH&yRGIhQSX)I4F~E`DAR+>ITld>2&u8R*KFcvl3L~D#&r-U zXIpZL<=+KCG@R@W3UfEhfPhdce+B-reA&D7f|=QXnPwQWptjAH{#Q$fpHY>QhJeaSb&YV2m{C4 zFK-^ZUOVOn1`RiUKVod$n6wSPNhv`0Gyv*YN#cCAkl@Cio*QWS1f8@Yvxoe^YyR7v z-kIwkQ}7z<=H_rWG_8loD$s6kh5b{LR;~RP3_*)IRf&vp;`zQRe-1n|@#`D(3?CC| zr&H=N22e2Y;{J(4{{9_@1muaL5He0zh-pAM1J%M63YwSX%m<%URG?1H0+IC` zC`0B=v4aEDrUy~M9+PH+BNLxKX#*;VN_>cChbL|QauQ}r6Apv@PeE0mO~FX?E9u1) zRR0?J3dfM&HJ-VLU%8TvqMRJTLCk<|45T{)<&cz+;6@~RjdN0(T?zd1t^sMiRC4F5 zyRrPVinNGq#j#IN_j9RX8QS6hU=G}HI}^nT6(jeNSV{mF1U{}uQ<)7b6mp3C^1wvA zWHN^V1Cgig#LOK*J5xv>S3uS+C@VXFrW(KUOG>2w%$F>s)xekJIrLQ82#>CaEtuuf zqp5A%pI3+4Ocn>cll6pQn5#%dc2I`BfB#+u%G`>_+0v6h(^D6IP5P+{#n;ID&c%R8 z>!!?tFPXuR@HjviguynTBkVMxyd;C64w!~5_k=7`H43MGERTK4t)P&MbhhnfaMtbH znox>F%9IK=qcKwlNRlOw0-Qiq&0hi;9*&D1HNiM-B)qt{A2!4r97WV*9O|v`j6QL4 zC&t;cvjrLZ`}>79ibDcVJ@}1r4aUR(nM4XgEP5G>Q5~x!&g(o<2&?2R?Hdg(=sw%g za1T{^6aS=yRy5P>rDrMEa`K`Y(0v`_SPDZEJJ3WL)x0W8qy2$`3rn3tObY-@$(O$X zeO1g{ICc~jRdwlPX2r<2_f2b-^PU^LiY`GrLHq)S!IZMHvRFrM8{Ez+_!*}!6O5_Q zH1LK|cw1&00DGo_2u&oQ%i+8-CN?c4jBKRuK{2X?$IMG1$0w2Z{B^A3@?H-%$lrN{p*k-GV-xOe2ADjk*bmwA5K3jfb`z$(Pz zO(WbKTUHJD6EBh#OwgEcM#UQ43zDBfnef110$>i;Ar?lqD=wctek7J*T88kdAsHPm z68z^6KnmPcUmy64nj-J1gvmpGoKCs?fE*%>v!i1wMllLLe}WRI5kCX1vJiJqXD5z5 zNowrqfDtd>Iuro_hcZyfMIxh-Hw3SHMWl{fcyOkGqA(!Tj>$9rq&29pweSaQ59aq? zEhvycYz@ZASxxP$){Fb&?x_)ppyEkZ#hx64m`!8I+^p(tSpjB^Fz=NKLWu}q?0^%K z85Kb5kxC}xJ_GvO<7+%nNs##;K^_;*Y!Z z;y|4?DCPx3M6ST03-ja37&tlz+gi5Gn_Ke*L!8T9MpmAlL`gP=1rmc^4ZR4CuTjKK z&4PYg7kL!G-tp&9iln1`B3T;e2Z?)*pVDMru>$cM`M7q;w~$(-K2--+0*`S`8WwG5|}rG$Nh6a&-0W zDD|6Oza~;&ekW~|qh$R9P82Ba-;Hu}!yulwGS+5nE;%}sQ$|)+4-!e^Cbet4=4 z={5Aql^CH6zWL(9i!0l{-~TNpExjJh27x~Shtjdt&F|d3`v4#UtVVhi$t$?z*JBV{ z*kSJ$JAesRXsk$wGY?f6Je0OT1qf1r7*N0@f{ubw4p=b_QoA5A#mfcyF<(+%j^llm z#|GHZXk*6@;_iuY3pOZWgn_-I6>hrehb< ze}pA6RlV?Q6=vlzGwu&|g(yQ%!Qmo}hnyoD@ZjG-#fE_zUQB?4L2H0`wEzn75ZgQy zbEJcZuNe~p5jq=kD>!*W8O$HNwRJHfg%hGUfHjH~_y!cQZ366s0_!bSH7M-=d{|z+ zN(1pm+z<5TcVIqt5G9s~R#qXvn{)s}XR0M65L)2HlTyP!Zw&<`0bEz${Mx{kda)SW zgf+)f0N_Mk3MUIx{XtOili!s5elw;X*f~+#p!eJY=n91^aTvge7EEfEqx~l~5zsH3 zQ7^~SyS~ew#&mQ^cC`~|h-4{R6pbb*Wb5#BiG~Jd9Sped z=#8?)*~CVHm}IvJz40 zUU9K1()4o-_Ck-r16ChR=7}`j3l|k8z}i0Q@mnmgYzH}-fY=+58sGn-<0cevN|;dd zzo_7bqcko;jdf2!dnhtGdNEdL>3pENGGy;4Tdpm$%L+yr%PH@%8Y+{0XU>R#+`a(n z)dnFKf7?JkE&*ac0(ODS1W2OkpX>@D>m&?#H5YZRr>S39d zhOG&GW0&!H&0NkB>2=kcd$Za6mM-WR+B`E^ObzlO*rSit<}>_mcR_n1@AU z#Oq$I1y&^cAhrmB3P2SPqBVq73Asx0>HrTCV;B?@aQ{$-s*PwP@Bi}qKCuak-wWt- zo>tz{5dh|~%@JKal&IX`$r>6OuwDq-NnGK`lLT5_TfFe3-}iv3Q?Vaqp?xVE%d*gP zHs;_^mYpw7Ua7RY+85kroc?*~7gOtxcO^KEi0HQQz34uoFZJ!>&RzE`7wd*zbfvps zer|Gd)v7NxedflijXNhtk`zvy7-^|&{W#HiVi?NL_5$6O&uu8S49ceHEjC}BcwNkd z=<^tu^p@x*;=O{#;1OuY@kOgCL;{6pNR(q3fI5IyHS=96*5}*7+RN=uadircz-A>-5lPF+0+l4jJ9;uzMa9K|(16ZpJw!X9BpQFa zIShe+SVmY_Q#Nkps#Q;*DKLmo*VfX~r_qi{5}M+{g9p-%ZzzC8^v5Be)e&^CvAN_> zHM{?orzl)7mJ$0iX-LyCNQr>E0)H+YF1+i}NHz@cW4VDk5&CihiKzZMr1yZDHRdNV z_lQvt!`W7fj?60V=q7RCC&}NFV>I}Qunn08z5B-CkdO<=$|y>RsGbC8pbxTL2KrBr z?5kd7}+w9gN5JSF%BTme9pfrL#YAs9f)EQGlY!KI-ty8>qh zPGnr@GDRpA{V5hG=wFwSr5`j3reTS?jMyMS+D;5#TbS04lojzk zJoM;8{vzBm;mNr1e!zF!D=659a+FNz1Gzr*t~4RZ?fk?!m$%KHrDbL5h?dleBpW5A zMNk?9VHS$`z7b29`}Z%Em&@Um2BD@(L%5gi!WipiVp2mPh~~^h-$p=>H7H{p-!(8J z)TiQy9Npb7KYX|w@y%%Tt1$o$Y;*499?2a$F5xATPs8K4lV>;@)03ZWYIKU6l|f)g z`~s%*FT+s;!lfnXs)`FSG^DtHe-O<_kd1LH$HTX9j~#gSV*Jl$*VxOZy!xCb)Y#nKwc>nuRkz&-S*JoC=pYCD4OfeAM25e&3^g` zFen+!0!xM))Ww`TS$`-{=T<_7t>KS^2ip{l_uOwBU_h*lw?N&~NGR!4CMoQ$J^IM7 zb>Lc7!`lq~(jyv;kvO~^t=>a+3XGvFA;0)Bu<-kq(;Uj!H%NL=+#gzg07rDG=zE>i z=xn=ei*9E9&Qok8+Ct0s{>HUtCp7&)>`-8{5Yt2`&&``7qeS~(so-pM-xBPirC6JA zzZv(TI_Pf1FQd3*qGTK0l-iQ77$nlPvhrDMDWKa7sHDK+#fwu>Z5>qAS2@m4+{y| z2lWw|aYIiyE~bV(&BLQm4w*Y#@~j*jj%IVwA1OYy6ilK(tOh=YO*uecN2`;CrA_Vx zRsJ2mI&hz)uY13ainh`@*JU!osJwx8h? z#Pei{{QX}3sW>n1V&~F|M;*5^Gu2u%S|?4W^(7Osd2wSjWCG$CzJfzaZ6NIpY`(8? zHT=X5?=5rFY$cyi+2icq6N6|8Y12D^>zH4oP>RmHV#Un<9OG5;K=m7wlYm{nu;I&G zg{7;A6drl~dMN53>Z6WU*rQUO1EJVDuCaXUcyRD&GVzE*|6+~Rf(o|HU7BQ1RQUHm zdXlV-7QMq=jXc*P6s@&=edh0^H8nNIX7Ay9Dw_)-lUAEVAh`2HO>Hx3NHQ8HEiFw} zUjhd04pz!H4LL(`zZR0e3y3(daJtGG9Or7aC1Ca3%8S9lYU^;~oFcYC3c~>vl^HJY zsW)`64Zngqacl?C#$lx9$N25LGwV0}d4@k`X9ux&h%5)IY@09fX~a9Nfy98=I-%J8 zx}HBa6W|f#CCd>f51@ki4D;p3&@W+fJX+MTl}4)pVtEhe!oh@+5esEKoDBfdFrXk( zXr&vnOo!cR{|2IVg*IKIzRwl+s_#R_f`E?&T)v!vjZMY{$gtMrJv{f|nd6|b;ly_d z$#_OjC>DY-C4`-0k{gJX6cjL{a{5A6D8NakhNLizl=xsp2&EFRn$SydJeb10W&k`R z>lQH7*G-a@7eYvu{`V{Wy9%Q1l`B^)?d|VO>Zmc075abr8oQ8IwRp?FKTZB~ZncCi zp6malw(=17e;#lfgL;lWS!7}s6#~<8ve#|EJ>TBTh3bJgPkt*O74H~-9dfbO3g zuXG?fa1f7Mwrrsw75so{zU%b~)RXm`War?~Z2fPwuwO#-AYFuPe0ZO0z zypSI1*#>A%SFc}B23&|aCiF&xWT)-u!FGhh^G@iq(m*`6kKoNbf`Bd<3!pe&YwO|D zljvJ9RCP(D5vWaY#5<_IeF$gf)Xa6xlq|JMffi%DS6b~ zyaEDpLXlQ2{Prf(uJCldXePSwCOYHKol=+n`!MzS03-zhyBx%eA>MYRX2tjkIeHVe zmh=ctm(lUqK!%I9{}CkP-0@Gl#+#a(>tN3b9d%~Zqjr=b^tg>$^!_aC)@}0@4G_@z zNut{xA8AsiB5|gp!W9R&0Uu8yzlZaPWq*a!{=F~$)dF}Xz+ChV_jf`Yqv`gPQ4lp!ie+{70W%ka_b*QT~Uh*sc($m9Y= z5m4Jdw@VGUATS!q^k-GFv~9%cmHyBr@F*y3LQhl=4Tja})3^2Zi^kjFP({>sPmp>B z(LiAd;HcHxy}I!|_@OpPl{$zQrcJxnHdr!|Vug<>43pnbv7ZXO-A*x0)_^`h6b!ZbknC|a?W8bU|sRGCs;}8<{GDgOzAOwZn zFGbgHT7A#Q&7{v*EW3blpAXyPTKCMaK!dI)0*3DZnG>3B-<7LR9Bq@p-3E;Zn!;(3OZgE_K!;+NdXq8RZrGe*bzyS~;IOmZO zBGiPvetQB|dxetnIXGC#>c5NR$1xnX-I(e>6d5CrLT0S8YSIv6T#s=)P6Vp(!P|GM zl%O5xqyevix%T--;A>}AbN{`n+W)R96cbytDWDcJZ0b$XPlwvEVCPxwNY{zl#`FoE z*G4??I)Di*TwD=&>BOc}$lMLn3oQ6M+d~{f$ffU4mm!OifOlIN>up6mR_C%m%!1GDmFJ3rxfG zV*!DZSR&8Dz0;k~WK*srwvAMqEd-^;f4 zJCAa7;H9p7^ELUDjC)Syo!&1P!^x`4FAo*j;Cq&bO#yf_YL z0#Q~lFD!`f-o9OXWEaAMIQFbh^kFn%k1+L5p}-k)KRSovxM#`w&65$k5f(dd8?B-^ zg1kL;{CMt_RwOQTuYa7kJK&bV;#?}Nm?>%7+kzORsv`D2|8 zoBX}vN(Iupkgw4@#8DWlF#y~w>I8b2QiU%Uqv|cke}UZsLET5@h^vzub17u3;kI1z z9{!kWv2KduZ$E)bKoO@X9keHI9Hg!UFIF5UbME7M0>UUOD??MT9%0w*rke$hWAgF? z0pk2%5|=YlC0L>V-{;BI*SIeSzRW)!g5V)pT{S1H40v zv0>|>n^!qgIyfY$AbAphWF+rp+yt&bn@g%V zOi{1{;vh~X1rfci8;gpHRDgpPJ@~r=RcjURb$I@X^*lm6cqD-7Yq2Lt4^Jj|fQUlk zSnodIdl^tO9R>DWq@tt1eOD5daEe18L6}f^I>GZ!-tRXjf>*YF4lBrYa(u?4wl=c* z$w3?hVLNex0pc5g_+$uy7@^$mz=$`P;<&QpCH{!+Az(0a|eo#RYOlI>Mdj z)(udi_`{hO@n>%{ z_*!5&z!CscU3T4VX+aM3B&Ns6nM9g$)Amnv9sTrQU&o&>{!hW2{++qJ3f64@`)XhO z?^gM{VS;D;|1GZn`5}e>BArH(nP_}JqQeIX*1!Mw>%Z)xp${)?)G3+7FXV#+$3Oor zv07=FFT+1o&g4Uo1MsckMA*Z*5?fK9XF8$zuEjZRp`_oyIV+g)3E|@9|MTlYG7WPp z{r_H9zaPpS(hGz455Qz#4QdwzE?{o^(M98t0z$Vu(_E|n=QrmZry~B(Z84ynH#`0b z3IEUc`S&N(R{gsV|K1DF|C>kk|J6sNyDMRk1j3jwtgJCPwsfAy|K{bfKyq|s`V z1LRAOEq56bJw zX_TWcM7BLJc^EEacio7JT2yM5ZwMSyGI0gUSwI&T|MH5V$1MJNJ#N^@b;zHNXmt_B zw#dqIIG1w5vJsuBDw+}rk10#|H|1)r+pr;o6hj!{KtKKB@Qi*E%+*&?^-TEOV5_)q z$QX+ZdcNg&yX_JcSpKhF@kwBS2`NR+?vp&2rn6#vMbX^fs_gGZ) zP{|N7?N4Kx(+Ns5_JLLDLmRRW!QfWaX86S9s`TLuj5i-X969#&4rmh;b?tz}b|WWc z>NTM2(HEqXt0OI*8B_b?#BD z20txsdl=B?G-xxCRYPBl{fUCXdzL`wg@?w634>LXldw}cKRdKe3a+CzvydPWM^NzF zwcrTv*>!9s9__#%#G3A@ufmf->Io!0Hu+4$I~?c_EUm24+HDR-pu4dI>Pz1IL)s4z zGlZK2+6vhAPys%O6ecb)kyQKqTSaW{qBpXN?Sf|k8>S`hJBBnXMm-YF6!{`K_Ja3@;Ll=HLvTq2Th^h^Q zQ{B~mdx1F3wrm>%TNMJ#=q==?CwogINEeSaQfZJ3XE#j7JO-G14}>*OXpDwN4vrAV zmLgv9{x6LriR$=N(=L0`^g_>|$pHg>2~Zu^Mx>y^Q9-`fmwX1ix@O%`pGXI990s%x z%@c)!s^=1%g?Dt!Jl24P1^D!|tUHL+q#cvy>4R#Ya9uvfZEP}LY-&LX4B=PWbRybE z3x`dpMK1!3nQd-tT!vYuQ?`Mtv3rf=x}|pP5Z-C726faslwBS_rnqr(&ztw}mq6!* zZyXp`5`eiKI$UL_#-D?NQaE7digQ4zOxpeW*Ux9b%5lKuEbQ5!oDsSZ-0$F!e-w%t zm_yup@yR0s_;IYSM>sh}_?*Q@R1JZG5@6xG>0p0i`Xr5SBucr6|R*a=bObq}V4rS8J zCdRQQ06E|_LVy*&0gUzBUE0AOm;*u4rQ~7S{S!7-s)l~h8(_M81wNs2hl-#i48rLY zK^=vGiTWVlhlsS4GGd z|9L!KmNDq3kSEC)Apy2f+(2C5bIzcAl8W0QF1{LTK1`Sz~q{saxyABmrkgOew&bqhnv-l~CDWu8-i5GU?n7*4Fp( zYzr6xlM64jLEffA=ubo@b1Q!(N0X~CGm|=h7q9j$WYniRPR{$1BaIcB=~yc7fWZqx z)X;o74G@gU?0}hB5;;bNCd-ZCzxC<-zF{~H=lnYeJU_@M>*cT^Pa4f${fLuBZ`nmh zMXBHwW{!cVsE1g|_4P$@haffbg?7F27yf5n zQ7+W?00Z2ry1syzUa#O)By|RO4a(QCpIg*nzXQiCV~*d@TDsCK{BWW+36MbSyVI1!QO_qZl+i~Au3qAA1H@8o-XIc_>Mm3;E?*(=t00=rcbJY zYGP@(Poag21T6W{8~DSVdwkYIJ{oxS>Y+%5-6P6?{<7SDU5|{s0FXA%wC~)&5_=w@nM{ykTT>`|e@-o~njOBe=%o!dXuAz#Wwmq5Vt5xX!SZVN zl*J?sBH})d3343O%xGFi5#~9jzJHGoLhuK_ll9_K!wq=fhd>!KK zuD|!4s%lx+RxX6IOb58Hacz=uUV=*sx_WgLnxUCZ2O|l4*O}oDjU&RiQRY_{Fff7! z)yAhz2@ypNs_$|6XE+dKH5ZpC^ZeXgI+B^}AqTu8p!pc8)|6HM2>u!ab7_z*a@=|a zikNUX5Uu=Sw;!s`?4ejGXFTy_A7e!lc9k@EaQvpD z07bAwj|{FSUjG|pBg7ExJREW4|Ry5seV` z1X+trkr7VSq4E6>6K9F2BM6-Jf8wq zlZ=W=g+hVCE$&+iBT3?9u|bMvq|dD<2&E+>WjziwZkf---0BnHz?oJ+#Q^OVDtsL5vLKK`A-j*o`SJNe+!Tb9LUDxdwHK% z)cw7)d+hxHIgoR0cn}@|AFBXOp4r4YcEe(F#9JBFTRoaLH&H)G(qK&{($_Hd{yiUj z3mCh;A)pzY-A#`1YjDPOt;4Wy&C8b$bv~`GbbvX(@b=x918;p;fyjl!pal)g=MeBU zs2^?sxX+1Agt?;Bd7RDR6|8q3J3-A!J5iEdTRXc{!W)k}CfMQ@ecP^@9`Pu}Ks zIjp2&(a)H$))Y7WC2-_H9%W13ojYGQ(Y$$K3pBUN4Q8~hg~X$tNc+_cp4&Yr4jiv#8 zevyuStbF(y%sfqj>$t*s+vZl95^Zz37LP>TkmZ=peYWhh@GDK>3@B^4Gz9Rjh@bogGn|0*1*xJc}V< za#mowBcdjw?}!WP6a9z-&_`AMo;zLq^*3Hs0X&$9BL=u`Vf`cEt)oWO zfkH4Atljn_FJfqD2!P}eo z)!43K|I17nQ-+KsX&_{*2q{A{q(LH7LP#`FDPvI)LL~~NQ7S`)RER<$iV&5MBosv? z{JxiGKkwe}`v?4<&whNKt=3xiy6@{cuk$>P<2+8CmJ;Elnc?|EMk2&q@qOjWIFT7& z&_RNSO|d;t)cZ%TI`5frZ^#MH9YRQTt)@yN)3G%9{V~0W$#5o=yu!;4vyx8Kn@yef z_)1l9ZmAWVq#e#Ru-_xob7I(z|9B7(O2Lp1`n! z6X@+CmJQAWP_~2wQ&g#AMkC73~*~5DPjbthD1z;S_bPST%0IG zqck&)C9QgsW%w*NcUr7Hl}H=3nbjISb=CJ88h+Ys2I4(3(9~PtfgBbsBwL!QhX_vz z^diRAzbH%9Zm=kaolkde^o&e^btX-c5?Bj4)BR0rjV)SVJaXvLtiHH_3eD7LKq*JO=~_|~-NIxl>Z6&x(8*zMBm|-0 zXt2<2w!C$r^O!hM2U(0T3Xc5Ge}b0FW^kj_7!> z{8WHM@z;P_ARCcLvxuHUB|?-eS+-`)qR5eQ7v~4X71`ZrFCoD;TR3z0;!9_5o1bQD zW)ti-FbPg_4OY0Kws!wjJoyB9Bg(pzsSR0RBh#RX>W5v#MMji@l6ldFa@^gFOHu^Hyz(B%w#Qb)X4NhInz7!nCGH~NnL>K&vTkm? zsmPp($U}tLf_Umc4FEubftxU4!UM)ti#YJ3|4saBk?Y09Jt%lY zJx>%eTRmrltX&35pPMZCfg$;3x_HnCWsGV6Er5M~;>+iu{Ar$EQtfF1 z6eetJgxCp6gr~T(YfDNNA9`N^h zKh7ZkHZcFQ@`P7gQXNo@s)ZWdNQTiemLQZcq;%tsg0ra}@0Lttsk4VELqC_1Q%gpJyXS6&C`r&H`YVx~#& zqz}O9)PD?ZCHeiUacPkE5)`}s9~8Aw@QWdaqz5e}?G;8)A(Fwi6<5Z-0Q8Agv`;w8 z$uM@^3tx)8?t<)K7L6dZ#oSWFb`+esq->_&7&v#1PDL>ebMAPhf&Xd&!2Tw~LkiC` zmdHt@2)#zH>MFzm!MDeLB=iaWEB#+B;akWn#n4KUz*Xg06SIDP(n(FKUCMyI0b859 zF`H!d@KB?e;#`mm;XEAV#N!sFH)l$N`R5SRp(Khoi2i$-!+GiQWfX(G0V65g*{9b) z14IJ@!)ab4{BayJw{|C*7;75+#?!BY%Z-A!xK5!47Pl3rP0{R+yWzvAncYdV5!`mc z?}iC}$(CMve}%~w7glrI)5jJAkHHqi1uTMsdE&iC|VEx(%Ju2-FB^#4T(}iou zwkNj^v1V^@_C=Vg38H7H#o5WPC-i)*{g&?}x)X@@U4?4nH@9IR<82Z>xhM5rrqk?8 zroVJbyaJRJ=cU z7|a;4_0MlgjRnW6f>1yQ@Mfuh3i4Y_Au@o&c6pt4|71fh$o3x zLe}JRvwf^B8%i&snxe~~Gfm=R;|dUkHp;&|*Q}YH`|JL z?|gydB8ih~U)w93#S}qMZe%@3Z?-Yk4}x3}JDda7fG53Z7D6@x=NqPXZ)JRRLAy6{ zxyQPwfNw_6QwuUE$wi?EO~ z>EX|GBfMQWoze`68pxh6r-3vSYN8#U99D5ZRHdd&nKHjGN7B8E&8Tytz93au{rcA4 z-iN9hofwy-;N6uJXoF2 z#EAVubqytE02ipwlFu6%xmcqo@vSGJH9&ln0j_lkcEH*Qd=nXZirIsQDWyvVP=hc{HqwZ-za6 zlpCTyluh29^udOBq^P5_$e~%RRNSW|0}($Tteucquv{~gv7zZ=)$&|l@c<~){CG~E z=`rrW>OcoDP_zJx=JG`6A+wJvNqkw536FaNyI~}zAo1lmO!zR1MvRe;WfQ>vw6(=( z(9~)+j4B}8a0t-kFUL-3IZqQ$#q<06hcMI|D1ibG9#n+(&0!(>uqh-1v%bHQMoLy6 z-gwb(6j5h1Nxqw#TYG?Q)m&hK4hr75Ao++#eTnfhm{O(_^Fm78O^lOl$=#LMvV+CH zB)8F*MAvA6^Ht#Qu$5lX_5-%(yI#ki(?HS{M+4OdE{^pRDKJe(uYEdCd%%%;zDyu< z=MRf}Ej)O}Z~Sn?ci+AqK$5RW{<@O*$VqO(0i51&CD0bIAR8>k^7xmM;tW+KC4H37 z^Cex8bI2l^l7VB;Yp*~9Uk;3mXv?|@9AW_A>RL8DB)`%Ig-JGH4;{i>A*i-%2K&-S z2O>(_o6rD{W0o>4Sl~(}m-o;D=L@2`htt^)@y$YfO~p-@mWWy}FY=`FSVc&<6)L84Kgwd-L^a1B@0u>ps zQVqZyOmmYLU7TZUh5O3_)v6C4hKj~2(EXwGl_^4q`*0%-L%EBYX3dU=;?&=}*=dFf z3bwfQVzG+BHN5d6%&P)}1s$IXsczhKx3u(^Lssy``3Lk%Ij(%bQ%!$!KCHIG_VM6K z#gANo4Ii}ngbvG&1605Af&eET*M9t%I6sCEZ^O(Ev0-0bD9|<0af_pp4jew+ajHoq zrsp$hPM<323NPH9`=)MMinFTmqAlvCaRZ5BgXoUd5UT3554WK49v?b>T!RIjoHpTI zQ`5Us`)~5lq<;15mf3})D&hQMIQO7cKOr*`NEEtqm~`c^w#*k{V!v+F3}i9BqI0uA zdqJXQw3Ey_a)wCymghS~5%&uPfSNFSEA8UdJ6eN41~^dtJ;XGy#biuG6D7{g6`_;1 zX60?gl`__%#E)d|dD?HdpPa(rBpRQ*F@lf`%*f32F;XtF5Uw?m$SuSYS$uVil|wUu zN8CP22k%9}~$#P+a(pqKC7 zp1(Vo_Zu?O{r)E7+}+tt~OuZ+?l@^#nXagS(l1OQUqMd z`*!K1VUZ}ac8JfA3`BByx_-35*NO08!bh_DBDHlYNAZ)RtG0Z8<>Rs!6At$cn0QZk zK6mC!W38eqIwTPaSyQ~y1x3lW%8%jpI%%|xO(-fWFQ!7eRF>@P9=%*`v#51>=u*x z;;~Ol4(3;iz!IIw!;@RIS-&;`m~&P>zO(f@8&c~idQ1=Ma0tC3YBqJAb?U{PB>rm; z@WF(o#F&u08XepWe15(S6JkACes_BuIILGZUh zz5b$&Sq(TC%A`Ca^1c!h&aSvDb~bSwg?& zS+Ohe5_Lb`_imuGUMV~f57uDKW$HouEr9Vuz~52LYesQH_lM*TXTq*s34wQ3&p1zn zFYdXF%~N^oOxEf7`cGGE7EUjA{f)4}kDG6^#*ql3_GcxPS&&Ya;e1?PQYM~faiu#B zJ#+`KEkO1HIe*@FQX#{iW4I3aMrj|n(ouT%f3M^bx%i(O=$9U*Q~gD!TgXohF~rh- z=qbzymXAO1Cq9w#$k1+&w()|#=Q{QoYb5DP(su7+7BOS%gCPxw))e|R&Ia(e4Q1-0 zwS&X3k0wCM3w(HCT8+5Vw8sbMetdRedeiapjF;!eKN%@vx5Ll&i<6|42MwCqR8UehldpG*9O8$cujzxpRv}$h+#j1 z2gTN8V8y;_;%7XlhLPCfWh^j(N{BzCOY@J5|=BPo&l-(P6v*yZH=eHba(`S`+z+$T|OV*t)MNcS;Sm{1ss4UoPr; z`_CgW?KS$mL3o_{J`0f`O5VAgJ972vpLSk)S2?i@8{NT55-UYQ7nEPK{3ly8+R0Hl zbIcvBP4h6!Aa9I3cbDupN;^MDeF#0a$5!GfcYMCPLzV8HLHEPDzk|t$hVCXBVY8EDFzG z{k-`0a!pmgCD?0)Z+>v6ROdjNz7=!2AFVlBcw!1&wCTlLo&z3keyMor_!ITOxVDjyPKExPJSBoGZ}H-5C_1nsftm{2nTkQoyi zt1qA?#4a`FX^E1@2|gX80$CJEk`Y^)-B6brUY#N*;Le8MpmH92-~3tuG70JQij-Wm zjUgT|%avAGPwh3-DqWT*E(VL$K>&HySRrkpvTY%uGJE`8QuTt@w1XUDR|2t_+xAAh zBWQim{)K5wT#q&Dw7MK>yA8f$T)EqxomsDbA=x;`Bq->sX~T|-E(i3b;AHLzV-5ZP z(GDzIvErNgSK>$o95c>3J|*MnffZPe<&*uy_i6t?d%~n3(Sa=|@}I&wO8;`Tx3AXM zy_`~QU7+=Ifw(2SfwXCX(714?B*I(*kSnBWXAT}vBcY(}$FHu>3cwge3!P*eoF;VF zF~UISlTZGB&DMqB9M!)-D5d&d9LupA zR8}=+xCFV8G?k8MrJ%~U%Ef+k>LZfx_55n5i536vQs;{&*eQ z{Or-jq3tA8jDwoyKVl3)%>=6rUIpp7FRQAC{F*Mj z5eSuucCOF*3w#eXyF?7|dE@@!*sGL!?m z0B9mjL?^y>P`=}I!@tT{!xFzMTmR@%M9*>Ux%=SWC-?7n2K!QZl+pz0l(a!BlsO91 z_V(IN`rn=$s2zU2z6{OoA>|V}?<2bR%EV2I^-cYJy3$uf)8seVP{=e zS4|aKMx@CzZlHVtpqza!%^f2Y5g;s}a45zHdnL_N0qH#}QyMFcJRDi$wkJdSp_}_M z^eO-@s7@~ksMS@o$k^AT7icDY2wNNGfW)QtN4Zm-nbvyB6zu5YmD&Ol1+R2RC@<8} zY@D3}xpvA4_f+?d+!xIzk}O&JNX(5D>ToL0!XtMbp`^(@jiWwZo#o`{SY|Y^GFT_{ z=+EpIFG!1aQ|!*Vart7;k~g|5riXXJ7xK@_Y%hCE82#t)$@A$t-NCWWZdW#t1QE2mP3Tf5lz-5;wg&))oI>pG8i z&M@unW%o=<-n_6n>?{{MKVI|<&`Ol(tT}yvX!Ql}9$A2I9wUb<4LcZ^u7`FJ)Pq>w ze||S!l`I+3mqL1nAay2A>?d$=WDDHA*w2QMNb&7=U*!}PPTs*5%qCfn+Co^~kXMNT zb)P97Qo|jboMJ+iNJf`SNJp);M}Q=8 z0i-!q?mOa7vfeg89SPovu&)oDh7zzv^!)hwOh~$LyJV;oy_6COqr5u*{JlT(XXiEV zJ^!@(-MQ<$*6m(SHt6lIxT9mEq+PJ(^j|5(W~u8EUaeh|nrOM8pV^w!RLcdA({mpB z``hFM?A#$Ot#W&w{ygKctv{6y_&vVddu@B=cfZn;7B9$kKJHv~CTv1|owaH5l72#g zK_i(MDJA?VXdo$8NrslK_`wLn(WfV;Vs?Zz7JzmgzI`}g8QJYwlY3+%Vti{Dz~(?@ zMF7@ockaYz7l#6Jjh1Savc`T`_*g_J*!ie!p8NdSGyAYcDq){0(KrCB^jKq%RcOyX zeWW2T0-iLE{YlF#9eNrWOU^FaZnVFX9a+%s+N_^*VjA}bu*Kf%~VG=fB!Gf6!XcV4Oy;2awbX~kDD?r9hCnV&w=*6efs~BbV zbzjhLjcqH+r>9SUeTDW!d!g}MSDqDs-OE}!sYFu?lmxJvsCZp)eg|RJy=ikU>&9bs z=95M!tfby4bP-mr3#WCfUUP|bfDW=pOKwGPoitkYl16DSvwjAR>5htXs>?KvKByWK zGkR*~^q2LPI)!#}B_F0veR`iWj2@%b5?H|WyFUQA=pEN{8&*30Vg?$FSaa&9 zIl>u!_^w&|3k6C9m8}>v%5CqVvDgU`NXMZ`Ytn|V>*p#B83Vq9z+se z^zKc@#*ar!J|+5dB(wvlxCM|cpcVA ze|{KMvBC*F8D=T-_^HAdSKYcBUu>)K8H0^+b52Ng3beE8|=zcOzGt8)jqQU#+?Zvg4}<9B1< zaO*W0M0P!=Opt0YI=ZAdTch2=r3uV&(CE>oZo{G2W93}`N!5HGL}~+#zjdDNkrZ?` zB}MjlRaKRkZJ?$u+%S_jlp$k~p)hnec^zDU1ju`aQenEJ(Ls*UQ}hY7PsYX~dZUW- z%dd_&oa+eZ1N+STw4e3r)5n(VG<);a<}bnmOkMUjSgb5+n84h|BjgAME-oq4?6)$e zJJkAocNrP)s-vBqqvMGpVy=mx+DQAQk(EO?pAy2h!l%=luArW*$!xL6j;2*V!k4I& zW9G-i#kEKM4uN=$07TWeTQu2@UjFR)YHBq-1Ci1f{=9LpZ30Qve2+=Py*jn~oxF0N z_TY(W?C8faW{+#;1|GEE7G>rVW^=9=JE?f+R zJ*tNYTkP#Tn;bCSOPvF z0Fs_Mvmb2*fIX&KOFP=uMxxQ%!nB-);G9T2Sut=Kk`Stg zRhO$0Z0w2<;P)e94g`9GkHPd08)M#O4C1&6{ZPh?EC8TJmI2X7H zl@I9Y!|JBgugb5-j2ZJdE@-nIk_<(pc9EAZ_2STabUJd*!ZlX2h0OZYe%*t|obR() zg;fa$-Pta$U%$57o7*KL{Hku)**kAFPyg!T;gO!FH{L;hG5M%;0W%rPe^@8vDdMO` zmVdbp6+nBE(!#j)I-Gn&Wy_E@T&eI`qR$}sM}Y7!qD0z_inW#7#G9huNz6(Qu&nsI z-Y}yqQmB2Ejo*S%W(zS*3Y$w&ydZltOR{;(fvH!!pEN_& z;p||qP8ZLgKUf`PH$zQ(4(Ft%ncBM=d6T0NWrHN1OV*rPeqZzD*UXb+D|MR6?iZRY z#S2#v|Ew4p3zO*mb`I)IW`SAzB-fB==UZ(tKAKiFop@P?t!)LXfPVuT2EA7RYU1qkBzo?Gea@u03 zp#Fs!V1*=^I})dDaNU<&Cb7^+Cx1A?8`ub)hwFYI1W`{2B`aGk}V>NV#z zZepRAZ=5*1 zB<+kiWijS#Kk+tw(f*Vo)@0=9yLP_#R(8?x#C7vW&z?WG#TweF7G|eUxo3SRi01&z zf-0!zS1)S)gw6q#yJ2G;j+$q7Bny5?r=Gy|8r$@;U5z15dtMUoVEh}PdCOm0O$O7* zBqX$#zXfY79~K%jxqGy(G7_C%2z#QPQ*{a1LQ|2Tqrza#@TKFPRCpUGLg3-n>R_&);E5#3V3@hVQ9y+$aUm0nu$pQ;C_7RD&>fL z&*qlbpa=Hg;`|bkyScXh9{NfVR1Llx+DOBenD~aT_CvRcdovSZCr4tM9k#(^t-Wrldv*Uc_B7U6LP`=i0}RxvfkF^Uub^RWM3a5c5nZm; z)Lh4ZP+e)oY#M@JG8N=I@_Kc%*Rr`Ti3Cy64Ms87=H=HBlQ<-`L)GzAK17?+A@^jL zN+G2ieSdDcK`Q!&Ih$W1_Y>0Yr*&>wR(DoF6VAItX#Ttsz*}Rd699VG;OUYycH0^ zx0ROO<5U^nsk&A%a0Yt4{BdPhGF|p~dKD@Ka{`MIf|@=l5FzxF3->rNxCgA>7W-(S z34x&ib!qEk(kerG3t5CHK81{tl<6TS9I~DYvTyF0@WeVxb;L=fXQx|OKV-$qm4k*1 zxi#=lRWHl1rmWmcSFQ|#-&Ii`@n~~v-Q?6knIBW*<3@RZ3_E;SX~OWiZI-$3vvUm# z3tL7@``t~+1wV`Nb{1+V&apuEa!xqnoG>H7nx&)24u#1gfs!klgtFjEqP$}9z=Xb7 zD`*%!?I=NMJq4*lZvGG@C0ZLTUsq^+sjnAw%=f0I)5AW5j&nSIx64l<>Z5}?z}EJI z!`GaiOWU`}D=RB=>bbx`NJJsvgSPsYABK(_$S66<0}#zn|3MVp5q+9L5td7Jv3NFP zuGE>2Bl;DNo8a$J2=aUlrQNlfABNGp=a~;?Kn91K(+vel@@_*__pLBm@@5{YM`yj9 z9l!RodE3Fx1CC;`%Hwui9$t88PAwdP!(c1B(%mQyginGXiTeUA%@1AT@y^)6qiYX2 zIbqIPsqx`3B9eW=?t(YvIqtmw#qP}cqoY>tGpg9U@NEb60AFFucUiR^Dl`cxbcJj6 zk5#6D$7@f4mc!2*UVc6FArNAPyQ%5n5ssrwlF2WG>^%PFcZ?oW)jmu_X=8q4iLkwd zr@GEbWSSI9*83g&!skhwHf=;-q>uUU4E9KNJ<~!6Xu+x{cI;>=bRgMY*3A9PEaIS;U`3(YI4tE@LAJpS}w2cl=>L_!+PCJiFUtK{EFpqGw-^jre6CXHHC;nEA-nK z(59yFv3Zomgl~M-dF0PY?rmXIE5ky1s;Covy%=Tws&Onm$c;EH4 zIF4}q-sw1Q45N&~i&u>@f5z$*)a(_HLcxs*&@by&B^}*cHdRM8Kq{wCr7`JpW}8+E{_CNu&{yWa%a|xoMqyjhGy_ z7nW_o_^22~;eJ3>io?n9aa|557EX+GT4d9DyVVA2^Khl~YUvP23Q8f7;jh}{PbnejMq1!V8 zhRW>Z*GI<@g6X=?pSPnJGj~p8 z(7`eqGqP&{m+dn?pamGS`s^9$U9u|;mfA-B*{quICSMHMIC`z?-=#JOeZEim6bJc5 zrjIrjr&xawCnS5Vh1U8gewy-32@&j)wz*x}u0 z96uC>pc(;mpaYV$d+8dnM|o-;{slO0w1O8reR!fH)9YHG5ftNC$pYlkj`Ku1GA-rQ zk2feNhnl_@11Ri$>Nr7tb~J+>3PUo(KV2o)_})HVQSWvyNe_C+e?LyM!M{7Gch-;D z32Q$Gv#obBnS=0umYwajyVc9DVLb%fzGT)o<~4#U1N z!DWP79dRsXFF4;_ugIAChKZivyVB{TIZ;wJn4(fMpi)raMLTErQ_SX0(3u}?tTlP2 ztp+PDv|QE|`L4<#F%ZmqNn^S>bNoV=#J~U4#*o5Ek;!TAO4TOH3n^Dg`DDAG4f;`L zKGW?HQOn3LLoI1=q+os!(y|X2DWSNNniO(;>GaYc!%IzK6{ji0`C1@i8Qrws^n7yk zW~+=@a9PHS7w;t|RVxXHr}kBM$lFK1?~Tv?UX&h;fL%0Xug<(%v$tWwCV%7x3#D>maDwm0W_(fuiicSRlhegHg#@;3-MW3%byUEk zSNk4E9>uj)q@FK7$_%{rpBdpMgx>NwDP-(YT4NhOK94olcKvzpK%RDrUfVY`k1b!j z)=1J`BK+Xz%-NTlzkAoN`Dp#TD`C>iVhB;OaFj9*fO*&rKVtl(117hYf9YXet+@72Uj5@<}PaHZl735B~cqA!e-rc*VM@35x z{hi|#eo^7!Axeg>cHtu--Vnn;?LEIxQ)&KaHIRI+1mX)L`#aH?;|M)OezUHM;gF9) z@cFytWcY*#7#fqeIxFq$9ugDd$xHRp@f}mUn+)-wca)G*1l7R8H^{CcFLr@fZ-Onu zB+lsV6%JqygZ)ASELDI1&K+Y~q;Hy$Ir^MPXbLzJ=Y|}}`zz>?VJz-vD1Kf z|K5_14DLv%e0=BLy=VZ1_ISN`!5N<(d#O(paccN#H>kkRGlYfs$zd+{mH-kW>M_Uu_ijp5^b6SVfDmQ@LLj`+N{ z1t*dKhw(^QybvE<027jhMxN8!Hn*wKu%-t~=h4xt}1C_wxdmc`!CM_P`cGa`sAul@VmO z`NJ3oJur%Cg6Lh4U8zNdPu!fAmom6U;2uF+vQ|GbL(93je0(>Fm<49p)>N6QSE4uE$uhz+E#ugU{th=o6yBh&UNtCle790t}M;U624F(OO0Dw*d=g= zK211IZK^r44=3DJnMvYYn_u~d^ZIhi(H@=Gh|#!)7gwH|7NCL=*9@rM8E8ICj+iUS z7<1ikzLa0tl)Sivgrs`t76U$|3qD-TmKx;MR2|zu1E(>_yj_|XhvDdbmGD?%0A6S_ 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 literal 0 HcmV?d00001 diff --git a/docs/notebooks/teleport.svg b/docs/notebooks/teleport.svg new file mode 100644 index 00000000..7480ab69 --- /dev/null +++ b/docs/notebooks/teleport.svg @@ -0,0 +1,998 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/optyx/classical.py b/optyx/classical.py index 0faa558e..382ab4c7 100644 --- a/optyx/classical.py +++ b/optyx/classical.py @@ -192,7 +192,7 @@ def __init__( ) super().__init__( - f"BitControlledGate({control_gate}, {default_gate})", + f"BitControlledGate", kraus, bit @ tp**len(control_gate_single.dom), tp**len(control_gate_single.cod) From 4de42bb599e160fd9c9c1f8625b15a77e2d2ef47 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Fri, 19 Sep 2025 11:23:35 +0100 Subject: [PATCH 14/59] readme as graphix workshop notebook --- docs/notebooks/graphix_workshop.ipynb | 26962 +++++++----------------- 1 file changed, 7975 insertions(+), 18987 deletions(-) diff --git a/docs/notebooks/graphix_workshop.ipynb b/docs/notebooks/graphix_workshop.ipynb index 912bdcde..b8c99a85 100644 --- a/docs/notebooks/graphix_workshop.ipynb +++ b/docs/notebooks/graphix_workshop.ipynb @@ -8,59 +8,25 @@ "# Optyx: A ZX-based Python library for networked quantum architectures" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "9ab492f0", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "22456298", - "metadata": {}, - "source": [ - "## Building blocks" - ] - }, - { - "cell_type": "markdown", - "id": "b362a4dc", - "metadata": {}, - "source": [ - " ![generators](./generators.png \"Optyx Generators\")" - ] - }, { "cell_type": "markdown", - "id": "36f0ed2d", + "id": "b1adf8d9", "metadata": {}, "source": [ - "### Photonic generators and syntax" + "## Hong-Ou-Mandel effect" ] }, { "cell_type": "markdown", - "id": "a62bf012", - "metadata": {}, - "source": [ - " ![photonic_generators](./photonic_generators.png \"Photonic Generators\")" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "66790776", + "id": "6f3dab5d", "metadata": {}, - "outputs": [], "source": [ - "from optyx.photonic import BBS" + "### Experiment definition" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 42, "id": "13dbbb3a", "metadata": {}, "outputs": [ @@ -75,7 +41,7 @@ " \n", " \n", " \n", - " 2025-09-16T19:38:12.041220\n", + " 2025-09-19T10:18:42.709571\n", " image/svg+xml\n", " \n", " \n", @@ -104,27 +70,27 @@ "L 151.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p1423168275)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pc4955cc6d1)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc4955cc6d1)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc4955cc6d1)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc4955cc6d1)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc4955cc6d1)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pc4955cc6d1)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -430,7 +396,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -445,38 +411,17 @@ } ], "source": [ + "from optyx.photonic import BBS\n", + "\n", "beam_splitter = BBS(0)\n", "beam_splitter.draw()" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "5623660f", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.photonic import Create" - ] - }, - { - "cell_type": "code", - "execution_count": 4, + "execution_count": 43, "id": "79ab4b08", "metadata": {}, - "outputs": [], - "source": [ - "hong_ou_mandel = (\n", - " Create(1) @ Create(1) >>\n", - " beam_splitter\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "cc4724df", - "metadata": {}, "outputs": [ { "data": { @@ -489,7 +434,7 @@ " \n", " \n", " \n", - " 2025-09-16T19:38:12.158722\n", + " 2025-09-19T10:18:43.207236\n", " image/svg+xml\n", " \n", " \n", @@ -518,27 +463,27 @@ "L 151.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p9153d3b25a)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p8c63707856)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8c63707856)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8c63707856)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8c63707856)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8c63707856)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8c63707856)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8c63707856)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8c63707856)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -1011,7 +956,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1026,6 +971,13 @@ } ], "source": [ + "from optyx.photonic import Create\n", + "\n", + "hong_ou_mandel = (\n", + " Create(1) @ Create(1) >>\n", + " beam_splitter\n", + ")\n", + "\n", "hong_ou_mandel.draw()" ] }, @@ -1037,9 +989,41 @@ " ![HOM](./hom.png \"Hong-Ou-Mandel Effect\")" ] }, + { + "cell_type": "markdown", + "id": "94bfc225", + "metadata": {}, + "source": [ + "### Diagram evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "f1478f68", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(-0.+0.j)" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from optyx.classical import Select\n", + "(\n", + " hong_ou_mandel >> Select(1, 1)\n", + ").eval().tensor.array" + ] + }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 45, "id": "801f0884", "metadata": {}, "outputs": [ @@ -1049,79 +1033,279 @@ "{(0, 2): 0.5, (1, 1): 4.9303806576313227e-32, (2, 0): 0.5}" ] }, - "execution_count": 6, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# evaluation => the semantics of the diagram\n", "hong_ou_mandel.eval().prob_dist()" ] }, + { + "cell_type": "markdown", + "id": "b1f34bd2", + "metadata": {}, + "source": [ + "## Qubit teleportation - function syntax and backends" + ] + }, { "cell_type": "code", - "execution_count": 7, - "id": "f1478f68", + "execution_count": 8, + "id": "47e64a7d", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx import qubit, bit\n", + "from optyx.qubits import Scalar\n", + "\n", + "from optyx import Channel\n", + "from optyx.qubits import Z, X, H, Measure, Scalar, qubit, bit\n", + "from optyx.classical import BitControlledGate" + ] + }, + { + "cell_type": "markdown", + "id": "748d7e3d", + "metadata": {}, + "source": [ + "### Define the protocol" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8fa3a149", + "metadata": {}, + "outputs": [], + "source": [ + "@Channel.from_callable(\n", + " dom=qubit @ qubit, cod=qubit @ qubit\n", + ")\n", + "def cnot(a, b):\n", + " c, d = Z(1, 2)(a)\n", + " Scalar(2 ** 0.5)()\n", + " return X(2, 1)(c, b), d" + ] + }, + { + "cell_type": "markdown", + "id": "668cadf7", + "metadata": {}, + "source": [ + "\"Teleportation\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "8c0301af", + "metadata": {}, + "outputs": [], + "source": [ + "bell = Scalar(0.5 ** 0.5) @ Z(0, 2)\n", + "\n", + "@Channel.from_callable(\n", + " dom=qubit, cod=qubit\n", + ")\n", + "def teleportation(c):\n", + " a, b = bell()\n", + " aa, cc = cnot(a, c)\n", + " c_ = Measure(1)(H()(cc))\n", + " a_ = Measure(1)(aa)\n", + " bb = BitControlledGate(X(1, 1, 0.5))(a_, b)\n", + " return BitControlledGate(Z(1, 1, 0.5))(c_, bb)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "174c4713", + "metadata": {}, + "outputs": [], + "source": [ + "teleportation_monoidal_syntax = (\n", + " qubit @ bell >>\n", + " cnot @ qubit >>\n", + " H() @ qubit ** 2 >>\n", + " Measure(1) @ Measure(1) @ qubit >>\n", + " bit @ BitControlledGate(X(1, 1, 0.5)) >>\n", + " BitControlledGate(Z(1, 1, 0.5))\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "7fcce92a", + "metadata": {}, + "source": [ + "### Verify the protocol" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "bb29783a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array(-0.+0.j)" + "True" ] }, - "execution_count": 7, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "from optyx.classical import Select\n", - "(hong_ou_mandel >> Select(1, 1)).eval().tensor.array" + "import numpy as np\n", + "from optyx.qubits import Id\n", + "\n", + "np.allclose(\n", + " teleportation.eval().tensor.array,\n", + " Id(1).double().to_tensor().eval().array,\n", + " teleportation_monoidal_syntax.eval().tensor.array\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "25af2db6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from optyx.core.backends import (\n", + " DiscopyBackend,\n", + " QuimbBackend\n", + ")\n", + "\n", + "np.allclose(\n", + " teleportation.eval(DiscopyBackend()).tensor.array,\n", + " teleportation.eval(QuimbBackend()).tensor.array\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "36241fe2", + "metadata": {}, + "source": [ + "## Fusion teleportation" + ] + }, + { + "cell_type": "markdown", + "id": "5721aeab", + "metadata": {}, + "source": [ + "Graphically, the fusion measurement we would like to use, takes the following form:\n", + "\n", + "![Fusion II](./fusion_ii.png \"Fusion measurement implementing a Bell measurement in dual rail encoding\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "1ab1655b", + "metadata": {}, + "source": [ + "where $\\underline{a}, \\underline{b}, \\underline{c}, \\underline{d}$ are the measurement outcomes as the measured photon numbers. " ] }, { "cell_type": "markdown", - "id": "aa602937", + "id": "ea1f931a", "metadata": {}, "source": [ - "### Qubit and classical generators" + "$\\underline{s} = \\underline{a} \\oplus \\underline{b}$\n", + "\n", + "$\\underline{k} = \\underline{s} (\\underline{b} + \\underline{d}) + \\neg \\underline s (1 - \\frac{\\underline{a} + \\underline{b}}{2})$" ] }, { "cell_type": "markdown", - "id": "d1116b59", + "id": "515133cf", "metadata": {}, "source": [ - " ![qubit_generators](./qubit_generators.png \"Qubit Generators\")" + "### Define the protocol" ] }, { "cell_type": "code", - "execution_count": 8, - "id": "8d45cf0f", + "execution_count": 14, + "id": "a1764edb", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.classical import PostselectBit, BitControlledGate\n", + "from optyx.photonic import Phase\n", + "from optyx.photonic import HadamardBS, qmode\n", + "\n", + "# postselect on fusion success\n", + "fusion_failure_processing = PostselectBit(1)\n", + "\n", + "# apply the box if the control bit is 1, otherwise apply an identity channel\n", + "correction = BitControlledGate(\n", + " HadamardBS() >>\n", + " (Phase(0.5) @ qmode) >>\n", + " HadamardBS()\n", + ") @ Scalar(2 ** 0.5)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "c557c4b8", "metadata": {}, "outputs": [], "source": [ - "# ZX-calculus\n", - "from optyx.qubits import Ket, Z, X, H" + "from optyx.photonic import DualRail\n", + "\n", + "dual_rail_encoded_bell = (\n", + " bell >>\n", + " DualRail(1) @ DualRail(1)\n", + ")" ] }, { "cell_type": "code", - "execution_count": 9, - "id": "c4999dab", + "execution_count": 16, + "id": "7bb5e46f", "metadata": {}, "outputs": [], "source": [ - "diagram = Ket(1) >> X(1, 1, 0.5) >> H() >> Z(1, 1, 0.5)" + "from optyx.photonic import FusionTypeII\n", + "\n", + "@Channel.from_callable(\n", + " dom=qubit, cod=qubit\n", + ")\n", + "def fusion_teleportation(a):\n", + " dual_rail_encoded_input = DualRail(1)(a)\n", + " b, c, d, e = dual_rail_encoded_bell()\n", + " s, k = FusionTypeII()(*dual_rail_encoded_input, b, c)\n", + " fusion_failure_processing(s)\n", + " output_rail_1, output_rail = correction(k, d, e)\n", + " return DualRail(1).dagger()(output_rail_1, output_rail)" ] }, { "cell_type": "code", - "execution_count": 10, - "id": "83c7f83a", + "execution_count": 17, + "id": "4b5ee771", "metadata": {}, "outputs": [ { @@ -1130,12 +1314,12 @@ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-16T19:38:12.951413\n", + " 2025-09-19T10:14:02.215469\n", " image/svg+xml\n", " \n", " \n", @@ -1150,102 +1334,395 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#pc684b033d8)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1383,9 +1974,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1393,605 +1984,348 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "diagram.draw(figsize=(2, 3))" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "f7f0cf81", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(0,): (0.7071067811865476+0j),\n", - " (1,): (-0.7071067811865476+2.5978681687064796e-16j)}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "diagram.eval().amplitudes()" - ] - }, - { - "cell_type": "markdown", - "id": "06cf6718", - "metadata": {}, - "source": [ - " ![classical_generators](./classical_generators.png \"Classical Generators\")" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "7c1af845", - "metadata": {}, - "outputs": [], - "source": [ - "# measurement\n", - "from optyx.qubits import Measure" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "e43b8f77", - "metadata": {}, - "outputs": [], - "source": [ - "measured_diagram = diagram >> Measure(1)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "4e217d96", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-16T19:38:13.051217\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", - " \n", - " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "measured_diagram.draw(figsize=(2, 3))" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "be987eb1", - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "Cannot get amplitudes from density matrix or probability distribution.", - "output_type": "error", - "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mTypeError\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[15]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mmeasured_diagram\u001b[49m\u001b[43m.\u001b[49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mamplitudes\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/optyx/optyx/core/backends.py:144\u001b[39m, in \u001b[36mEvalResult.amplitudes\u001b[39m\u001b[34m(self, normalise)\u001b[39m\n\u001b[32m 137\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 138\u001b[39m \u001b[33;03mGet the amplitudes from the result tensor.\u001b[39;00m\n\u001b[32m 139\u001b[39m \u001b[33;03mReturns:\u001b[39;00m\n\u001b[32m 140\u001b[39m \u001b[33;03m dict: A dictionary mapping occupation\u001b[39;00m\n\u001b[32m 141\u001b[39m \u001b[33;03mconfigurations to amplitudes.\u001b[39;00m\n\u001b[32m 142\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 143\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.state_type != StateType.AMP:\n\u001b[32m--> \u001b[39m\u001b[32m144\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[32m 145\u001b[39m (\u001b[33m\"\u001b[39m\u001b[33mCannot get amplitudes from density \u001b[39m\u001b[33m\"\u001b[39m +\n\u001b[32m 146\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mmatrix or probability distribution.\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 147\u001b[39m )\n\u001b[32m 148\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m.tensor.dom) != \u001b[32m0\u001b[39m:\n\u001b[32m 149\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 150\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mResult tensor must represent a state with inputs.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 151\u001b[39m )\n", - "\u001b[31mTypeError\u001b[39m: Cannot get amplitudes from density matrix or probability distribution." - ] - } - ], - "source": [ - "measured_diagram.eval().amplitudes()" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "f02f6b44", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(0,): (0.5+0j), (1,): (0.5+0j)}" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "measured_diagram.eval().prob_dist()" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "14fff50d", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.classical import AndBit\n", - "\n", - "circuit = (\n", - " measured_diagram @ measured_diagram >>\n", - " AndBit()\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "6d735aae", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-16T19:38:24.176532\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", + " \n", - " \n", - " \n", - " \n", + " \n", - " \n", - " \n", - " \n", + "\" transform=\"scale(0.015625)\"/>\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + "\" transform=\"scale(0.015625)\"/>\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "\n" ], "text/plain": [ - "
" + "
" ] }, "metadata": {}, @@ -3111,99 +3217,113 @@ } ], "source": [ - "circuit.foliation().draw(figsize=(4, 4))" + "from optyx.photonic import FusionTypeII\n", + "\n", + "fusion_teleportation_monoidal_syntax = (\n", + " DualRail(1) @ dual_rail_encoded_bell >>\n", + " FusionTypeII() @ qmode**2 >>\n", + " fusion_failure_processing @ correction >>\n", + " DualRail(1).dagger()\n", + ")\n", + "\n", + "array_teleportation = fusion_teleportation.eval().tensor.array\n", + "\n", + "fusion_teleportation_monoidal_syntax.foliation().draw(figsize=(8, 8))\n" + ] + }, + { + "cell_type": "markdown", + "id": "5017fe5a", + "metadata": {}, + "source": [ + "### Verify the protocol" ] }, { "cell_type": "code", - "execution_count": 19, - "id": "d77483b2", + "execution_count": 18, + "id": "c19354d7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{(0,): (0.7500000000000001-2.0526832973508108e-48j),\n", - " (1,): (0.25+2.0526832973508108e-48j)}" + "True" ] }, - "execution_count": 19, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "circuit.eval().prob_dist()" - ] - }, - { - "cell_type": "markdown", - "id": "b1f34bd2", - "metadata": {}, - "source": [ - "### Qubit teleportation - function syntax and backends" + "import numpy as np\n", + "from optyx.photonic import Id\n", + "\n", + "array_id = Id(1).double().to_tensor().eval().array\n", + "np.allclose(array_teleportation, array_id)" ] }, { "cell_type": "markdown", - "id": "668cadf7", - "metadata": {}, - "source": [ - "
\"Teleportation\n" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "47e64a7d", + "id": "6e6b4039", "metadata": {}, - "outputs": [], "source": [ - "from optyx.classical import (\n", - " BitControlledGate\n", - ")\n", - "from optyx import qubit, bit" + "### Approximate contraction with Quimb and Cotengra" ] }, { "cell_type": "code", - "execution_count": 21, - "id": "2049d62b", + "execution_count": null, + "id": "51acb733", "metadata": {}, "outputs": [], "source": [ - "teleportation = (\n", - " Z(1, 2) @ Z(0, 2) >>\n", - " qubit @ X(2, 1) @ qubit >>\n", - " H() @ qubit @ qubit >>\n", - " Measure(1) @ Measure(1) @ qubit >>\n", - " bit @ BitControlledGate(\n", - " X(1, 1, 0.5)\n", - " ) >>\n", - " BitControlledGate(\n", - " Z(1, 1, 0.5)\n", - " )\n", - ")" + "# process fidelity\n", + "\n", + "def _flat(x):\n", + " return np.asarray(x, dtype=complex).ravel()\n", + "\n", + "# cosine similarity of pure unitary channels as superoperators\n", + "def process_fidelity(SU, SV):\n", + " a, b = _flat(SU), _flat(SV)\n", + " num = abs(np.vdot(a, b))\n", + " den = np.linalg.norm(a) * np.linalg.norm(b)\n", + " return float(num / den)\n", + "\n", + "def average_fidelity(SU, SV, d):\n", + " Fp = process_fidelity(SU, SV)\n", + " return float((d * Fp + 1) / (d + 1))" ] }, { "cell_type": "code", - "execution_count": 22, - "id": "cae3c5a8", + "execution_count": 110, + "id": "fb497580", "metadata": {}, "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Fusion-based Teleportation Fidelity vs Contraction Chi')" + ] + }, + "execution_count": 110, + "metadata": {}, + "output_type": "execute_result" + }, { "data": { "image/svg+xml": [ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-16T19:38:27.093021\n", + " 2025-09-19T11:03:03.818054\n", " image/svg+xml\n", " \n", " \n", @@ -3218,374 +3338,405 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + "\" style=\"fill: #ffffff\"/>\n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", + " \n", - " \n", - " \n", - " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + "\" transform=\"scale(0.015625)\"/>\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", - " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "\n" ], "text/plain": [ - "
" + "
" ] }, "metadata": {}, @@ -4224,50 +4584,92 @@ } ], "source": [ - "teleportation.foliation().draw()" + "from cotengra import HyperCompressedOptimizer\n", + "\n", + "errors = []\n", + "for chi in range(1, 6):\n", + " optimiser = HyperCompressedOptimizer(\n", + " chi=chi\n", + " )\n", + " error_for_chi = []\n", + " for _ in range(10):\n", + " error_for_chi.append(\n", + " average_fidelity(\n", + " fusion_teleportation.eval(QuimbBackend(optimiser)).tensor.array,\n", + " array_teleportation,\n", + " d=2\n", + " )\n", + " )\n", + " errors.append(np.median(error_for_chi))\n", + "\n", + "import matplotlib.pyplot as plt\n", + "plt.plot(range(1, 6), errors, marker='o')\n", + "plt.grid()\n", + "plt.xlabel('Chi')\n", + "plt.ylabel('Average Gate Fidelity')\n", + "plt.title('Fusion-based Teleportation Fidelity vs Contraction Chi')\n" + ] + }, + { + "cell_type": "markdown", + "id": "351608f0", + "metadata": {}, + "source": [ + "### Photon loss and channel fidelity" ] }, { "cell_type": "code", - "execution_count": 23, - "id": "393f7c4a", + "execution_count": 21, + "id": "ac439493", "metadata": {}, - "outputs": [ - { - "ename": "ValueError", - "evalue": "Result tensor must represent a state with inputs.", - "output_type": "error", - "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mValueError\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[23]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mteleportation\u001b[49m\u001b[43m.\u001b[49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mprob_dist\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/optyx/optyx/optyx/core/backends.py:169\u001b[39m, in \u001b[36mEvalResult.prob_dist\u001b[39m\u001b[34m(self, round_digits)\u001b[39m\n\u001b[32m 161\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 162\u001b[39m \u001b[33;03mGet the probability distribution from the result tensor.\u001b[39;00m\n\u001b[32m 163\u001b[39m \n\u001b[32m (...)\u001b[39m\u001b[32m 166\u001b[39m \u001b[33;03m configurations to probabilities.\u001b[39;00m\n\u001b[32m 167\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 168\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m.tensor.dom) != \u001b[32m0\u001b[39m:\n\u001b[32m--> \u001b[39m\u001b[32m169\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 170\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mResult tensor must represent a state with inputs.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 171\u001b[39m )\n\u001b[32m 172\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.state_type \u001b[38;5;129;01mis\u001b[39;00m StateType.AMP:\n\u001b[32m 173\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._prob_dist_pure(round_digits)\n", - "\u001b[31mValueError\u001b[39m: Result tensor must represent a state with inputs." - ] - } - ], + "outputs": [], "source": [ - "teleportation.eval().prob_dist()" + "from optyx.photonic import FusionTypeII, PhotonLoss\n", + "\n", + "def fusion_teleportation_with_photon_loss(p):\n", + " @Channel.from_callable(\n", + " dom=qubit, cod=qubit\n", + " )\n", + " def fusion_teleportation(a):\n", + " dr_input_1, dr_input_2 = DualRail(1)(a)\n", + " b, c, d, e = dual_rail_encoded_bell()\n", + " dr_input_2_loss, c_loss, e_loss = PhotonLoss(p)(dr_input_2), PhotonLoss(p)(c), PhotonLoss(p)(e)\n", + " s, k = FusionTypeII()(dr_input_1, dr_input_2_loss, b, c_loss)\n", + " fusion_failure_processing(s)\n", + " output_rail_1, output_rail = correction(k, d, e_loss)\n", + " return DualRail(1).dagger()(output_rail_1, output_rail)\n", + " return fusion_teleportation" ] }, { "cell_type": "code", - "execution_count": 24, - "id": "c8dc0076", + "execution_count": null, + "id": "ea619cd4", "metadata": {}, "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Fusion-based Teleportation Fidelity vs Photon Survival Probability (p)')" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + }, { "data": { "image/svg+xml": [ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-16T19:38:28.499960\n", + " 2025-09-19T10:16:21.874591\n", " image/svg+xml\n", " \n", " \n", @@ -4282,13125 +4684,359 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + "\" style=\"fill: #ffffff\"/>\n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from optyx.qubits import Id\n", - "\n", - "Id(1).draw()" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "bb29783a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import numpy as np\n", - "\n", - "np.allclose(\n", - " teleportation.eval().tensor.array,\n", - " Id(1).double().to_tensor().eval().array\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "8c0301af", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx import Diagram\n", - "\n", - "@Diagram.from_callable(\n", - " dom=qubit, cod=qubit\n", - ")\n", - "def teleportation(a):\n", - " b = (\n", - " Z(1, 2) @ Z(0, 2)\n", - " )(a)\n", - "\n", - " d = X(2, 1)(b[1], b[2])\n", - "\n", - " e = (\n", - " Measure(1) @ Measure(1)\n", - " )(H()(b[0]), d)\n", - "\n", - " f = BitControlledGate(\n", - " X(1, 1, 0.5)\n", - " )(e[1], b[3])\n", - "\n", - " return BitControlledGate(\n", - " Z(1, 1, 0.5)\n", - " )(e[0], f)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "7925be20", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-16T19:38:30.063428\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "teleportation.foliation().draw()" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "499fe3f9", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.core.backends import (\n", - " DiscopyBackend,\n", - " QuimbBackend\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "936fd7d2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[[ 1.+0.j, -0.+0.j],\n", - " [-0.+0.j, 0.+0.j]],\n", - "\n", - " [[ 0.+0.j, 1.+0.j],\n", - " [ 0.-0.j, 0.+0.j]]],\n", - "\n", - "\n", - " [[[ 0.+0.j, 0.+0.j],\n", - " [ 1.-0.j, -0.+0.j]],\n", - "\n", - " [[ 0.+0.j, 0.+0.j],\n", - " [ 0.+0.j, 1.+0.j]]]])" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "teleportation.eval(DiscopyBackend()).tensor.array" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "a1feb431", - "metadata": {}, - "outputs": [], - "source": [ - "from cotengra import HyperCompressedOptimizer\n", - "optimiser = HyperCompressedOptimizer(\n", - " chi=1\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "5139ef70", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", - " warnings.warn(\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", - " warnings.warn(\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", - " warnings.warn(\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", - " warnings.warn(\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", - " warnings.warn(\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", - " warnings.warn(\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", - " warnings.warn(\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", - " warnings.warn(\n" - ] - }, - { - "data": { - "text/plain": [ - "array([[[[0.06248093+0.j, 0.06248093-0.j],\n", - " [0.06248093+0.j, 0.06248093+0.j]],\n", - "\n", - " [[0.06248093+0.j, 0.06248093-0.j],\n", - " [0.06248093+0.j, 0.06248093+0.j]]],\n", - "\n", - "\n", - " [[[0.06248093+0.j, 0.06248093-0.j],\n", - " [0.06248093+0.j, 0.06248093+0.j]],\n", - "\n", - " [[0.06248093+0.j, 0.06248093-0.j],\n", - " [0.06248093+0.j, 0.06248093+0.j]]]])" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "teleportation.eval(QuimbBackend(optimiser)).tensor.array" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "6113a332", - "metadata": {}, - "outputs": [], - "source": [ - "optimiser = HyperCompressedOptimizer(\n", - " chi=2\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "f24413ca", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[[1.-0.j, 0.-0.j],\n", - " [0.+0.j, 0.-0.j]],\n", - "\n", - " [[0.+0.j, 1.+0.j],\n", - " [0.+0.j, 0.+0.j]]],\n", - "\n", - "\n", - " [[[0.-0.j, 0.-0.j],\n", - " [1.-0.j, 0.-0.j]],\n", - "\n", - " [[0.+0.j, 0.+0.j],\n", - " [0.-0.j, 1.-0.j]]]])" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "teleportation.eval(QuimbBackend(optimiser)).tensor.array" - ] - }, - { - "cell_type": "markdown", - "id": "a727d58e", - "metadata": {}, - "source": [ - "## Interfacing with external libraries" - ] - }, - { - "cell_type": "markdown", - "id": "5086ad32", - "metadata": {}, - "source": [ - "### Graphix graphs" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "eaaced50", - "metadata": {}, - "outputs": [], - "source": [ - "import graphix\n", - "from optyx import qubits\n", - "\n", - "circuit = graphix.Circuit(2)\n", - "circuit.rz(0, 0.5)\n", - "circuit.rz(1, 0.5)\n", - "circuit.cnot(0, 1)\n", - "circuit.s(0)\n", - "circuit.cnot(1, 0)\n", - "\n", - "pattern = circuit.transpile().pattern\n", - "\n", - "# open graph zx diagram\n", - "optyx_zx = qubits.Circuit(pattern)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "d921eb1a", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The pattern is not consistent with flow or gflow structure.\n" - ] - }, - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-16T19:38:39.141344\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pattern.draw_graph()" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "3a8c5542", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-16T19:38:39.891436\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "optyx_zx.foliation().draw(figsize=(8, 8))" - ] - }, - { - "cell_type": "markdown", - "id": "4870dd44", - "metadata": {}, - "source": [ - "### Perceval circuits and processors" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "3f1613ed", - "metadata": {}, - "outputs": [], - "source": [ - "import perceval as pcvl\n", - "from optyx import Channel" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "1f07af00", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p = pcvl.Processor(\"SLOS\", 6)\n", - "p.add(0, pcvl.catalog[\"postprocessed cnot\"].build_processor())\n", - "\n", - "p.add(0, pcvl.BS.H())\n", - "p.add(0, pcvl.Detector.pnr())\n", - "p.add(1, pcvl.Detector.pnr())\n", - "p.add(2, pcvl.Detector.pnr())\n", - "p.add(3, pcvl.Detector.pnr())\n", - "\n", - "ff_X = pcvl.FFCircuitProvider(\n", - " 2, 0, pcvl.Circuit(2)\n", - ")\n", - "ff_X.add_configuration(\n", - " [0, 1], pcvl.PERM([1, 0])\n", - ")\n", - "p.add(2, ff_X)\n", - "\n", - "phi = pcvl.P(\"phi\")\n", - "ff_Z = pcvl.FFConfigurator(\n", - " 2, 3,\n", - " pcvl.PS(phi),\n", - " {\"phi\": 0}\n", - ").add_configuration(\n", - " [0, 1],\n", - " {\"phi\": np.pi}\n", - ")\n", - "p.add(0, ff_Z)" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "3b4867c9", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "POSTPROCESSED CNOT\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "H\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Θ=1.910633\n", - "\n", - "\n", - "H\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Θ=1.910633\n", - "\n", - "\n", - "H\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Θ=1.910633\n", - "\n", - "\n", - "H\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "H\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "H\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PNR\n", - "\n", - "\n", - "\n", - "PNR\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "FFC\n", - "\n", - "\n", - "\n", - "U(FFC)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PNR\n", - "\n", - "\n", - "\n", - "PNR\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "FFC\n", - "\n", - "\n", - "Φ=phi\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "[herald0]\n", - "0\n", - "\n", - "[herald1]\n", - "0\n", - "\n", - "[ctrl]\n", - "\n", - "[data]\n", - "\n", - "[ctrl]\n", - "\n", - "[data]\n", - "\n", - "[herald0]\n", - "0\n", - "\n", - "[herald1]\n", - "0\n", - "0\n", - "1\n", - "2\n", - "3\n", - "4\n", - "5\n", - "0\n", - "1\n", - "2\n", - "3\n", - "4\n", - "5\n", - "" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pcvl.pdisplay(p, recursive=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "22342f65", - "metadata": {}, - "outputs": [], - "source": [ - "# convert to Optyx\n", - "optyx_diagram = Channel.from_perceval(p)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "8b7699cf", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-16T19:39:04.579249\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "optyx_diagram.foliation().draw(figsize=(8, 25))" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "af82f2ef", - "metadata": {}, - "outputs": [], - "source": [ - "to_transmit = ((0.7071067811865476+0j)*pcvl.BasicState([1, 0]) +\n", - " (-0.21850801222441052+0.6724985119639574j)*pcvl.BasicState([0, 1]))\n", - "to_transmit.normalize()\n", - "\n", - "sg = pcvl.StateGenerator(pcvl.Encoding.DUAL_RAIL)\n", - "bell_state = sg.bell_state(\"phi+\")\n", - "\n", - "input_state = to_transmit * bell_state\n", - "p.min_detected_photons_filter(2)\n", - "\n", - "input_state *= pcvl.BasicState([0, 0])\n", - "\n", - "p.with_input(input_state)" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "id": "4cc23c53", - "metadata": {}, - "outputs": [], - "source": [ - "result_perceval = p.probs()" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "d9bc5f3b", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.qubits import Scalar\n", - "from optyx.photonic import DualRail\n", - "\n", - "bell_state = Z(0, 2) @ Scalar(0.5**0.5)\n", - "transmit = Ket(\"+\") >> Z(1, 1, 0.3)\n", - "\n", - "protocol = (\n", - " transmit @ bell_state >>\n", - " DualRail(3) >>\n", - " Channel.from_perceval(p)\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "ad7fe8c0", - "metadata": {}, - "outputs": [], - "source": [ - "result_optyx = protocol.eval().prob_dist()" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "e787f65b", - "metadata": {}, - "outputs": [], - "source": [ - "def check_dict_agreement(d1, d2, rtol=1e-5, atol=1e-8):\n", - " for key in d1.keys() - d2.keys():\n", - " assert np.isclose(d1[key], 0, rtol=rtol, atol=atol)\n", - " for key in d2.keys() - d1.keys():\n", - " assert np.isclose(d2[key], 0, rtol=rtol, atol=atol)\n", - " for key in d1.keys() & d2.keys():\n", - " assert np.isclose(d1[key], d2[key], rtol=rtol, atol=atol)" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "id": "e433baf1", - "metadata": {}, - "outputs": [], - "source": [ - "check_dict_agreement(\n", - " {tuple(k): v for k, v in dict(result_perceval[\"results\"]).items()},\n", - " result_optyx\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "36241fe2", - "metadata": {}, - "source": [ - "## Fusion teleportation" - ] - }, - { - "cell_type": "markdown", - "id": "5721aeab", - "metadata": {}, - "source": [ - "Graphically, the fusion measurement we would like to use, takes the following form:\n", - "\n", - "![Fusion II](./fusion_ii.png \"Fusion measurement implementing a Bell measurement in dual rail encoding\")\n" - ] - }, - { - "cell_type": "markdown", - "id": "1ab1655b", - "metadata": {}, - "source": [ - "where $\\underline{a}, \\underline{b}, \\underline{c}, \\underline{d}$ are the measurement outcomes as the measured photon numbers. " - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "id": "5b0a58bb", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx import qmode\n", - "\n", - "from optyx.photonic import (\n", - " DualRail,\n", - " Swap,\n", - " HadamardBS\n", - ")\n", - "\n", - "fusion = (\n", - " HadamardBS() @ HadamardBS() >>\n", - " qmode @ Swap(1, 1) @ qmode >>\n", - " qmode @ HadamardBS() @ qmode >>\n", - " Swap(1, 1) @ qmode @ qmode >>\n", - " qmode @ Swap(1, 1) @ qmode >>\n", - " qmode @ qmode @ HadamardBS()\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "f7998428", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-16T19:39:45.505830\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fusion.draw()" - ] - }, - { - "cell_type": "markdown", - "id": "ea1f931a", - "metadata": {}, - "source": [ - "As we are dealing with dual-rail encoding, we will restrict ourselves to the outcome results where the total measured number of photons is 4. We have that $\\underline{s} = \\underline{a} \\oplus \\underline{b}$ is the Boolean value of success (whether an entangling operation succeeded) and $\\underline{k} = \\underline{s} (\\underline{b} + \\underline{d}) + \\neg \\underline s (1 - \\frac{\\underline{a} + \\underline{b}}{2})$ is the Pauli error.\n", - "This means that the error is $\\underline{b} + \\underline{d}$ in case of success and $1 - \\frac{\\underline{a} + \\underline{b}}{2}$ in case of failure.\n", - "\n", - "We interpret this diagram as a CP-map which means that the sums represent classical mixing and not quantum superposition. We obtain different protocols conditioned on the value of $\\underline{s}$ and $\\underline{k}$.\n", - "\n", - "In our analysis we will ignore the case when the fusion fails." - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "0ce269cb", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.classical import (\n", - " ClassicalFunction\n", - ")\n", - "\n", - "from optyx import mode, bit\n", - "\n", - "def fusion_function(x):\n", - " \"\"\"\n", - " A classical function that returns two bits based on an input x,\n", - " based on the classical logical for the Fusion type II circuit.\n", - " \"\"\"\n", - " a = x[0]\n", - " b = x[1]\n", - " c = x[2]\n", - " d = x[3]\n", - " s = (a % 2) ^ (b % 2)\n", - " k = int(s*(b + d) + (1-s)*(1 - (a + b)/2))%2\n", - " return [s, k]\n", - "\n", - "classical_function = ClassicalFunction(\n", - " fusion_function,\n", - " mode**4,\n", - " bit**2\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "id": "a1764edb", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.classical import PostselectBit\n", - "\n", - "fusion_failure_processing = PostselectBit(1)" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "id": "08e9fc37", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.photonic import Phase\n", - "from optyx.classical import BitControlledGate\n", - "\n", - "# apply the box if the control bit is 1, otherwise apply an identity channel\n", - "correction = BitControlledGate(\n", - " HadamardBS() >>\n", - " (Phase(0.5) @ qmode) >>\n", - " HadamardBS()\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "id": "76f472af", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-16T19:39:48.378097\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "correction.draw()" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "id": "c557c4b8", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.qubits import Z\n", - "from optyx.photonic import Scalar\n", - "\n", - "channel_bell = (\n", - " Z(0, 2) @ Scalar(0.5**0.5) >> DualRail(1) @ DualRail(1)\n", - ")\n", - "\n", - "dual_rail_input = DualRail(1)" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "id": "4b5ee771", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.photonic import NumberResolvingMeasurement\n", - "\n", - "teleportation = (\n", - " dual_rail_input @ channel_bell >>\n", - " fusion @ qmode**2 >>\n", - " NumberResolvingMeasurement(4) @ qmode**2 >>\n", - " classical_function @ qmode**2 >>\n", - " fusion_failure_processing @ correction >>\n", - " DualRail(1).dagger()\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "id": "12531eea", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-16T19:40:04.737240\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "teleportation.foliation().draw(figsize=(8, 8))" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "id": "c8c49c91", - "metadata": {}, - "outputs": [], - "source": [ - "array_teleportation = teleportation.eval().tensor.array" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "id": "5017fe5a", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.photonic import Id\n", - "\n", - "array_id = (\n", - " Id(1) @ Scalar(0.5**0.5)\n", - ").double().to_tensor().eval().array" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "id": "c19354d7", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import numpy as np\n", - "\n", - "np.allclose(array_teleportation, array_id)" - ] - }, - { - "cell_type": "markdown", - "id": "07c143a0", - "metadata": {}, - "source": [ - "### Fusion with distinguishable photons" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "id": "74e3f64e", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2025-09-16T19:40:13.218081\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.10.5, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "\n" ], "text/plain": [ - "
" + "
" ] }, "metadata": {}, @@ -17993,8 +5952,47 @@ } ], "source": [ - "fusion_channel = fusion >> NumberResolvingMeasurement(4) >> classical_function\n", - "fusion_channel.draw(figsize=(6, 6))" + "\n", + "ps = np.linspace(0, 1, 20)\n", + "errors_with_loss = []\n", + "for p in ps:\n", + " errors_with_loss.append(\n", + " average_fidelity(\n", + " fusion_teleportation_with_photon_loss(p).eval().tensor.array,\n", + " array_teleportation,\n", + " d=2\n", + " )\n", + " )\n", + "\n", + "plt.plot(ps, errors_with_loss, marker='o')\n", + "plt.grid()\n", + "plt.xlabel('Photon Survival Probability (p)')\n", + "plt.ylabel('Average Gate Fidelity')\n", + "plt.title('Fusion-based Teleportation Fidelity vs Photon Survival Probability (p)')" + ] + }, + { + "cell_type": "markdown", + "id": "07c143a0", + "metadata": {}, + "source": [ + "## Distributed entanglement generation" + ] + }, + { + "cell_type": "markdown", + "id": "e20c30a8", + "metadata": {}, + "source": [ + "### Fusion and photon distinguishability" + ] + }, + { + "cell_type": "markdown", + "id": "18ab5a86", + "metadata": {}, + "source": [ + "#### Define the protocol" ] }, { @@ -18014,14 +6012,13 @@ "source": [ "internal_state_1 = [1, 0]\n", "internal_state_2 = [0, 1]\n", - "internal_state_2 = internal_state_2 / np.linalg.norm(internal_state_2)\n", "\n", "print(internal_state_1, internal_state_2)" ] }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 24, "id": "bdb9611d", "metadata": {}, "outputs": [ @@ -18031,12 +6028,12 @@ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-16T19:40:29.920521\n", + " 2025-09-19T10:16:22.025814\n", " image/svg+xml\n", " \n", " \n", @@ -18051,8 +6048,8 @@ " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#pbbc99b4496)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + "\" clip-path=\"url(#pbbc99b4496)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -18672,9 +6812,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -18682,521 +6822,952 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", - " \n", + " \n", + " \n", + " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from optyx.qubits import Z, Scalar, Id, Measure\n", + "from optyx.photonic import DualRail\n", + "from optyx.classical import PostselectBit\n", + "from discopy.drawing import Equation\n", + "\n", + "bell_state = Z(0, 2) @ Scalar(0.5 ** 0.5)\n", + "dual_rail_encoding = lambda state: DualRail(1, internal_states=[state])\n", + "encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(internal_state_2)\n", + "\n", + "post_select = PostselectBit(1) @ PostselectBit(0)\n", + "\n", + "protocol = (\n", + " bell_state @ bell_state >>\n", + " Id(1) @ (encoding_layer >> FusionTypeII() >> post_select) @ Id(1)\n", + ")\n", + "measure = Measure(2)\n", + "\n", + "Equation(protocol >> measure, bell_state >> measure).draw(figsize=(8, 8))" + ] + }, + { + "cell_type": "markdown", + "id": "eb9f34b3", + "metadata": {}, + "source": [ + "#### Define a set of internal states with varying degrees of distinguishability" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "9e5c4078", + "metadata": {}, + "outputs": [], + "source": [ + "import math\n", + "\n", + "def rotated_unit_vectors(n: int = 10):\n", + " for i in range(n):\n", + " theta = i * (math.pi / 2) / (n - 1)\n", + " yield (math.cos(theta), math.sin(theta))\n", + "\n", + "unit_vectors = list(rotated_unit_vectors(15))" + ] + }, + { + "cell_type": "markdown", + "id": "945ace07", + "metadata": {}, + "source": [ + "#### Run the experiments" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "30b96ad0", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.qubits import Discard\n", + "\n", + "inner_product_states = []\n", + "inner_product_bell_states = []\n", + "\n", + "result_bell = bell_state.eval().tensor.array.flatten()\n", + "result_bell = result_bell / np.linalg.norm(result_bell)\n", + "\n", + "for vector in unit_vectors:\n", + " encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(vector)\n", + " experiment = bell_state @ bell_state >> Id(1) @ (encoding_layer >> FusionTypeII()\n", + " >> post_select) @ Id(1)\n", + "\n", + " f = (experiment >> bell_state.dagger()).inflate(2).eval().tensor.array\n", + " normalisation = (experiment >> Discard(2)).inflate(2).eval().tensor.array\n", + "\n", + " inner_product_states.append(np.inner(vector, internal_state_1))\n", + " inner_product_bell_states.append(f/normalisation)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "1c50f388", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1719: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " return math.isfinite(val)\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1355: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " return np.asarray(x, float)\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2025-09-19T10:17:16.103446\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.5, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from optyx.qubits import Z, Scalar, Id, Measure\n", - "from optyx.photonic import DualRail\n", - "from optyx.classical import PostselectBit\n", - "from discopy.drawing import Equation\n", - "\n", - "bell_state = Z(0, 2) @ Scalar(0.5 ** 0.5)\n", - "dual_rail_encoding = lambda state: DualRail(1, internal_states=[state])\n", - "encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(internal_state_2)\n", - "post_select = PostselectBit(1) @ PostselectBit(0)\n", - "experiment = bell_state @ bell_state >> Id(1) @ (encoding_layer >> fusion_channel >> post_select) @ Id(1)\n", - "measure = Measure(2)\n", - "Equation(experiment >> measure, bell_state >> measure).draw(figsize=(8, 8))" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "id": "2fbb6c45", - "metadata": {}, - "outputs": [], - "source": [ - "from optyx.qubits import Discard" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "id": "14a649ed", - "metadata": {}, - "outputs": [], - "source": [ - "fidelity = (experiment >> bell_state.dagger())" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "id": "aa3042f9", - "metadata": {}, - "outputs": [], - "source": [ - "normalisation = (experiment >> Discard(2)).inflate(2).eval().tensor.array" - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "id": "c83b686e", - "metadata": {}, - "outputs": [ - { - "data": { + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n" + ], "text/plain": [ - "(0.5000000000000001-3.061616997868383e-17j)" + "
" ] }, - "execution_count": 78, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "f = fidelity.inflate(2).eval().tensor.array\n", - "f/normalisation" - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "id": "9e5c4078", - "metadata": {}, - "outputs": [], - "source": [ - "import math\n", - "\n", - "def rotated_unit_vectors(n: int = 10):\n", - " for i in range(n):\n", - " theta = i * (math.pi / 2) / (n - 1)\n", - " yield (math.cos(theta), math.sin(theta))" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "id": "83a32908", - "metadata": {}, - "outputs": [], - "source": [ - "unit_vectors = list(rotated_unit_vectors(30))" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "id": "30b96ad0", - "metadata": {}, - "outputs": [], - "source": [ - "inner_product_states = []\n", - "inner_product_bell_states = []\n", - "\n", - "result_bell = bell_state.eval().tensor.array.flatten()\n", - "result_bell = result_bell / np.linalg.norm(result_bell)\n", - "\n", - "for vector in unit_vectors:\n", - " encoding_layer = dual_rail_encoding(internal_state_1) @ dual_rail_encoding(vector)\n", - " experiment = bell_state @ bell_state >> Id(1) @ (encoding_layer >> fusion_channel\n", - " >> post_select) @ Id(1)\n", - "\n", - " f = (experiment >> bell_state.dagger()).inflate(2).eval().tensor.array\n", - " normalisation = (experiment >> Discard(2)).inflate(2).eval().tensor.array\n", + "import matplotlib.pyplot as plt\n", "\n", - " inner_product_states.append(np.inner(vector, internal_state_1))\n", - " inner_product_bell_states.append(f/normalisation)" + "plt.figure(figsize=(6, 4))\n", + "plt.plot(inner_product_states, inner_product_bell_states, marker='o')\n", + "plt.xlabel('')\n", + "plt.ylabel(' (fidelity)')\n", + "plt.title('Fidelity of the resulting state with the perfect Bell state')\n", + "plt.grid(True)\n", + "plt.show()" ] }, { "cell_type": "code", - "execution_count": 82, - "id": "1c50f388", + "execution_count": 28, + "id": "06b9a545", "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1719: ComplexWarning: Casting complex values to real discards the imaginary part\n", - " return math.isfinite(val)\n", - "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/matplotlib/cbook.py:1355: ComplexWarning: Casting complex values to real discards the imaginary part\n", - " return np.asarray(x, float)\n" - ] - }, { "data": { "image/svg+xml": [ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-16T19:44:02.386954\n", + " 2025-09-19T10:17:16.172772\n", " image/svg+xml\n", " \n", " \n", @@ -20035,41 +9070,41 @@ " \n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -21029,39 +10035,15 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "\n" @@ -21367,28 +10325,69 @@ "plt.xlabel('')\n", "plt.ylabel(' (fidelity)')\n", "plt.title('Fidelity of the resulting state with the perfect Bell state')\n", + "plt.xlim(0.9, 1)\n", + "plt.ylim(0.9, 1)\n", "plt.grid(True)\n", "plt.show()" ] }, + { + "cell_type": "markdown", + "id": "7aa6a1d2", + "metadata": {}, + "source": [ + "## Interfacing with external libraries" + ] + }, + { + "cell_type": "markdown", + "id": "e4b64d36", + "metadata": {}, + "source": [ + "### Graphix" + ] + }, { "cell_type": "code", - "execution_count": 83, - "id": "06b9a545", + "execution_count": 65, + "id": "79f358ae", + "metadata": {}, + "outputs": [], + "source": [ + "import graphix\n", + "from optyx import qubits\n", + "\n", + "circuit = graphix.Circuit(2)\n", + "circuit.cnot(0, 1)\n", + "\n", + "pattern = circuit.transpile().pattern" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "4888034c", "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The pattern is not consistent with flow or gflow structure.\n" + ] + }, { "data": { "image/svg+xml": [ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-16T19:44:02.522864\n", + " 2025-09-19T10:50:29.636857\n", " image/svg+xml\n", " \n", " \n", @@ -21403,44 +10402,285 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + "z\n", + "\" transform=\"scale(0.015625)\"/>\n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + "L 794 531 \n", + "z\n", + "\" transform=\"scale(0.015625)\"/>\n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "\n" ], "text/plain": [ - "
" + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pattern.draw_graph()" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "bff50dee", + "metadata": {}, + "outputs": [], + "source": [ + "simulator = graphix.simulator.PatternSimulator(pattern, backend=\"statevector\")\n", + "graphix_result = simulator.run().psi.conj()" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "bf2d9106", + "metadata": {}, + "outputs": [], + "source": [ + "optyx_zx = qubits.Circuit(pattern)\n", + "\n", + "optyx_res = (\n", + " qubits.Ket(\"+\")**2 >> optyx_zx\n", + ").eval().amplitudes()" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "908e477d", + "metadata": {}, + "outputs": [], + "source": [ + "for keys in optyx_res.keys():\n", + " assert np.isclose(optyx_res[keys], graphix_result[keys], atol=1e-6)" + ] + }, + { + "cell_type": "markdown", + "id": "598ab8dc", + "metadata": {}, + "source": [ + "### Perceval circuits and processors" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "07f5f7ba", + "metadata": {}, + "outputs": [], + "source": [ + "import perceval as pcvl" + ] + }, + { + "cell_type": "markdown", + "id": "7d106d80", + "metadata": {}, + "source": [ + "#### Define the protocol in Perceval" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "988c9618", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "POSTPROCESSED CNOT\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Θ=1.910633\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Θ=1.910633\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Θ=1.910633\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "H\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PNR\n", + "\n", + "\n", + "\n", + "PNR\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "FFC\n", + "\n", + "\n", + "\n", + "U(FFC)\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PNR\n", + "\n", + "\n", + "\n", + "PNR\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "FFC\n", + "\n", + "\n", + "Φ=phi\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "[herald0]\n", + "0\n", + "\n", + "[herald1]\n", + "0\n", + "\n", + "[ctrl]\n", + "\n", + "[data]\n", + "\n", + "[ctrl]\n", + "\n", + "[data]\n", + "\n", + "[herald0]\n", + "0\n", + "\n", + "[herald1]\n", + "0\n", + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "" + ], + "text/plain": [ + "" ] }, + "execution_count": 71, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ - "import matplotlib.pyplot as plt\n", + "p = pcvl.Processor(\"SLOS\", 6)\n", + "p.add(0, pcvl.catalog[\"postprocessed cnot\"].build_processor())\n", "\n", - "plt.figure(figsize=(6, 4))\n", - "plt.plot(inner_product_states, inner_product_bell_states, marker='o')\n", - "plt.xlabel('')\n", - "plt.ylabel(' (fidelity)')\n", - "plt.title('Fidelity of the resulting state with the perfect Bell state')\n", - "plt.xlim(0.9, 1)\n", - "plt.ylim(0.9, 1)\n", - "plt.grid(True)\n", - "plt.show()" + "p.add(0, pcvl.BS.H())\n", + "p.add(0, pcvl.Detector.pnr())\n", + "p.add(1, pcvl.Detector.pnr())\n", + "p.add(2, pcvl.Detector.pnr())\n", + "p.add(3, pcvl.Detector.pnr())\n", + "\n", + "ff_X = pcvl.FFCircuitProvider(\n", + " 2, 0, pcvl.Circuit(2)\n", + ")\n", + "ff_X.add_configuration(\n", + " [0, 1], pcvl.PERM([1, 0])\n", + ")\n", + "p.add(2, ff_X)\n", + "\n", + "phi = pcvl.P(\"phi\")\n", + "ff_Z = pcvl.FFConfigurator(\n", + " 2, 3,\n", + " pcvl.PS(phi),\n", + " {\"phi\": 0}\n", + ").add_configuration(\n", + " [0, 1],\n", + " {\"phi\": np.pi}\n", + ")\n", + "p.add(0, ff_Z)\n", + "\n", + "pcvl.pdisplay(p, recursive=True)" ] }, { "cell_type": "code", - "execution_count": null, - "id": "2f2a52e7", + "execution_count": 96, + "id": "96d5bf6b", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "from optyx.qubits import Ket\n", + "\n", + "state = Ket(\"+\") >> Z(1, 1, 0.3)\n", + "state_array = state.eval().tensor.array\n", + "state_array = state_array / np.linalg.norm(state_array)" + ] + }, + { + "cell_type": "markdown", + "id": "f64e6adb", + "metadata": {}, + "source": [ + "#### Evaluate the protocol in Perceval" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "bce649df", + "metadata": {}, + "outputs": [], + "source": [ + "to_transmit = (complex(state_array[0])*pcvl.BasicState([1, 0]) +\n", + " complex(state_array[1])*pcvl.BasicState([0, 1]))\n", + "\n", + "sg = pcvl.StateGenerator(pcvl.Encoding.DUAL_RAIL)\n", + "bell_state = sg.bell_state(\"phi+\")\n", + "\n", + "input_state = to_transmit * bell_state\n", + "p.min_detected_photons_filter(2)\n", + "\n", + "input_state *= pcvl.BasicState([0, 0])\n", + "\n", + "p.with_input(input_state)" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "f0c1fbf3", + "metadata": {}, + "outputs": [], + "source": [ + "result_perceval = p.probs()" + ] + }, + { + "cell_type": "markdown", + "id": "ab098b6e", + "metadata": {}, + "source": [ + "#### Convert to Optyx and simulate" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "463bcb6f", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx import Channel\n", + "\n", + "optyx_diagram = Channel.from_perceval(p)" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "3f3fca2d", + "metadata": {}, + "outputs": [], + "source": [ + "from optyx.qubits import Scalar, Ket\n", + "from optyx.photonic import DualRail\n", + "\n", + "bell_state = Z(0, 2) @ Scalar(0.5**0.5)\n", + "transmit = Ket(\"+\") >> Z(1, 1, 0.3)\n", + "\n", + "input_state = transmit @ bell_state\n", + "\n", + "protocol = (\n", + " input_state >>\n", + " DualRail(3) >>\n", + " Channel.from_perceval(p)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "54633b7a", + "metadata": {}, + "outputs": [], + "source": [ + "result_optyx = protocol.eval().prob_dist()" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "id": "e019251e", + "metadata": {}, + "outputs": [], + "source": [ + "def check_dict_agreement(d1, d2, rtol=1e-5, atol=1e-8):\n", + " for key in d1.keys() - d2.keys():\n", + " assert np.isclose(d1[key], 0, rtol=rtol, atol=atol)\n", + " for key in d2.keys() - d1.keys():\n", + " assert np.isclose(d2[key], 0, rtol=rtol, atol=atol)\n", + " for key in d1.keys() & d2.keys():\n", + " assert np.isclose(d1[key], d2[key], rtol=rtol, atol=atol)" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "id": "ca6102c5", + "metadata": {}, + "outputs": [], + "source": [ + "check_dict_agreement(\n", + " {tuple(k): v for k, v in dict(result_perceval[\"results\"]).items()},\n", + " result_optyx\n", + ")" + ] }, { "cell_type": "code", "execution_count": null, - "id": "d316d264", + "id": "419dd1dd", "metadata": {}, "outputs": [], "source": [] From 40c666168781bedde55193fb51f22e1a83858224 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Fri, 19 Sep 2025 11:35:29 +0100 Subject: [PATCH 15/59] function syntax and cup/caps for hypergraphs --- optyx/core/channel.py | 60 ++++++++++++++++++++++++++++++------------- optyx/utils/utils.py | 12 +++------ 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/optyx/core/channel.py b/optyx/core/channel.py index e839231e..eed7812d 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -118,7 +118,7 @@ from optyx.utils.utils import explode_channel -class Ob(symmetric.Ob): +class Ob(frobenius.Ob): """Basic object: bit, mode, qubit or qmode""" _classical = { @@ -156,7 +156,7 @@ def double(self): @factory -class Ty(symmetric.Ty): +class Ty(frobenius.Ty): """Classical and quantum types.""" ob_factory = Ob @@ -213,10 +213,10 @@ def inflate(self, d): assert isinstance(d, int), "Dimension must be an integer" assert d > 0, "Dimension must be positive" - dom = symmetric.Category(Ty, Diagram) - cod = symmetric.Category(Ty, Diagram) + dom = frobenius.Category(Ty, Diagram) + cod = frobenius.Category(Ty, Diagram) - return symmetric.Functor( + return frobenius.Functor( lambda x: x.inflate(d), lambda f: f.inflate(d), dom, @@ -227,9 +227,9 @@ def double(self): """Returns the diagram.Diagram obtained by doubling every quantum dimension and building the completely positive map.""" - dom = symmetric.Category(Ty, Diagram) - cod = symmetric.Category(diagram.Ty, diagram.Diagram) - return symmetric.Functor( + dom = frobenius.Category(Ty, Diagram) + cod = frobenius.Category(diagram.Ty, diagram.Diagram) + return frobenius.Functor( lambda x: x.double(), lambda f: f.double(), dom, cod )(self) @@ -289,19 +289,19 @@ def to_path(self, dtype: type = complex): assert self.is_pure, "Diagram must be pure to convert to path." - return symmetric.Functor( + return frobenius.Functor( ob=len, ar=lambda f: f.get_kraus().to_path(dtype), - cod=symmetric.Category(int, path.Matrix[dtype]), + cod=frobenius.Category(int, path.Matrix[dtype]), )(self) def _decomp(self): # pylint: disable=protected-access - return symmetric.Functor( + return frobenius.Functor( ob=lambda x: qubit**len(x), ar=lambda arr: arr._decomp(), - cod=symmetric.Category(Ty, Diagram), + cod=frobenius.Category(Ty, Diagram), )(self) def to_dual_rail(self): @@ -309,10 +309,10 @@ def to_dual_rail(self): assert self.is_pure, "Diagram must be pure to convert to dual rail." - return symmetric.Functor( + return frobenius.Functor( ob=lambda x: qmode**(2*len(x)), ar=lambda arr: arr.to_dual_rail(), - cod=symmetric.Category(Ty, Diagram), + cod=frobenius.Category(Ty, Diagram), )(self._decomp()) def to_tket(self): @@ -474,7 +474,7 @@ def eval(self, backend=None, **kwargs): return backend.eval(self, **kwargs) -class Channel(symmetric.Box, Diagram): +class Channel(frobenius.Box, Diagram): """ Channel initialised by its Kraus map. """ @@ -628,7 +628,7 @@ def eval(self, n_photons=0, permanent=None, dtype=complex): ) -class CQMap(symmetric.Box, Diagram): +class CQMap(frobenius.Box, Diagram): """ Channel initialised by its Density matrix. """ @@ -675,7 +675,7 @@ def __pow__(self, n): return self @ self ** (n - 1) -class Swap(symmetric.Swap, Channel): +class Swap(frobenius.Swap, Channel): def dagger(self): return self @@ -835,11 +835,35 @@ def __call__(self, other): return frobenius.Functor.__call__(self, other) +class Cup(frobenius.Cup, Channel): + """ + A frobenius cup is a compact cup in a frobenius diagram. + + Parameters: + left (Ty) : The atomic type. + right (Ty) : Its adjoint. + """ + __ambiguous_inheritance__ = (frobenius.Cup, ) + + +class Cap(frobenius.Cap, Channel): + """ + A frobenius cap is a compact cap in a frobenius diagram. + + Parameters: + left (Ty) : The atomic type. + right (Ty) : Its adjoint. + """ + __ambiguous_inheritance__ = (frobenius.Cap, ) + + class Hypergraph(hypergraph.Hypergraph): # pragma: no cover category, functor = Category, Functor - +Hypergraph.ty_factory = Ty Diagram.spider_factory = Spider +Diagram.cup_factory = Cup +Diagram.cap_factory = Cap Diagram.hypergraph_factory = Hypergraph Diagram.braid_factory = Swap Diagram.sum_factory = Sum diff --git a/optyx/utils/utils.py b/optyx/utils/utils.py index bf3f04a8..31c9e300 100644 --- a/optyx/utils/utils.py +++ b/optyx/utils/utils.py @@ -519,25 +519,24 @@ def get_max_dim_for_box( from optyx.core.diagram import Swap, DualRail from optyx.core.zw import Create, Endo - # Boxes with no inputs (or a pure Swap) don't constrain the bound here. if len(box.dom) == 0 or isinstance(box, (Swap, Endo)): return 1e20 dim_for_box = 0 - # Light-cone at the current layer inputs + # light-cone at the current layer inputs wires_in_light_cone: List[bool] = ( [False] * left_offset + [True] * len(box.dom) + [False] * right_offset ) - # Walk previous layers from nearest to farthest + # walk previous layers from nearest to farthest for previous_left_offset, previous_box in prev_layers[::-1]: total = len(wires_in_light_cone) cod_len = len(previous_box.cod) - # Clamp the left offset so the (left, cod_len) span fits this frame. - # This guarantees previous_right_offset >= 0 and len(mask) == total. + # Clamp the left offset so the (left, cod_len) span fits this frame + # this guarantees previous_right_offset>= 0 and len(mask) == total max_left = max(0, total - cod_len) adj_left = previous_left_offset if adj_left < 0: @@ -547,7 +546,6 @@ def get_max_dim_for_box( previous_right_offset = calculate_right_offset(total, adj_left, cod_len) - # If connected, count created photons that lie on LC wires. if is_previous_box_connected_to_current_box( wires_in_light_cone, adj_left, @@ -567,9 +565,7 @@ def get_max_dim_for_box( if isinstance(previous_box, DualRail): dim_for_box += 1 - # Pull the LC back through this box (use the same clamped offsets) if isinstance(previous_box, Swap): - # Swaps always connect all their wires wires_in_light_cone = ( wires_in_light_cone[:adj_left] + [wires_in_light_cone[adj_left + 1]] From 1b6c5f74f4fa18cfac9634ce1fdb14f7386c40c6 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Sat, 20 Sep 2025 14:25:00 +0100 Subject: [PATCH 16/59] workshop_notebook --- docs/notebooks/graphix_workshop.ipynb | 2275 ++++++++++++------------- optyx/core/diagram.py | 7 +- optyx/utils/utils.py | 6 + 3 files changed, 1065 insertions(+), 1223 deletions(-) diff --git a/docs/notebooks/graphix_workshop.ipynb b/docs/notebooks/graphix_workshop.ipynb index b8c99a85..aea2c944 100644 --- a/docs/notebooks/graphix_workshop.ipynb +++ b/docs/notebooks/graphix_workshop.ipynb @@ -26,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 1, "id": "13dbbb3a", "metadata": {}, "outputs": [ @@ -41,7 +41,7 @@ " \n", " \n", " \n", - " 2025-09-19T10:18:42.709571\n", + " 2025-09-20T14:16:32.451481\n", " image/svg+xml\n", " \n", " \n", @@ -70,27 +70,27 @@ "L 151.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pc4955cc6d1)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pa284aa0791)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa284aa0791)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa284aa0791)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa284aa0791)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa284aa0791)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa284aa0791)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -396,7 +396,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -414,12 +414,13 @@ "from optyx.photonic import BBS\n", "\n", "beam_splitter = BBS(0)\n", + "\n", "beam_splitter.draw()" ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 2, "id": "79ab4b08", "metadata": {}, "outputs": [ @@ -434,7 +435,7 @@ " \n", " \n", " \n", - " 2025-09-19T10:18:43.207236\n", + " 2025-09-20T14:16:32.484953\n", " image/svg+xml\n", " \n", " \n", @@ -463,27 +464,27 @@ "L 151.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p8c63707856)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p7c1f3775ff)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7c1f3775ff)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7c1f3775ff)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7c1f3775ff)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7c1f3775ff)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7c1f3775ff)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7c1f3775ff)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p7c1f3775ff)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -956,7 +957,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -999,7 +1000,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 3, "id": "f1478f68", "metadata": {}, "outputs": [ @@ -1009,7 +1010,7 @@ "array(-0.+0.j)" ] }, - "execution_count": 44, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -1023,7 +1024,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 4, "id": "801f0884", "metadata": {}, "outputs": [ @@ -1033,7 +1034,7 @@ "{(0, 2): 0.5, (1, 1): 4.9303806576313227e-32, (2, 0): 0.5}" ] }, - "execution_count": 45, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -1052,7 +1053,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "id": "47e64a7d", "metadata": {}, "outputs": [], @@ -1075,7 +1076,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, "id": "8fa3a149", "metadata": {}, "outputs": [], @@ -1099,7 +1100,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "id": "8c0301af", "metadata": {}, "outputs": [], @@ -1120,7 +1121,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "id": "174c4713", "metadata": {}, "outputs": [], @@ -1145,7 +1146,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 9, "id": "bb29783a", "metadata": {}, "outputs": [ @@ -1155,7 +1156,7 @@ "True" ] }, - "execution_count": 12, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -1173,7 +1174,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 10, "id": "25af2db6", "metadata": {}, "outputs": [ @@ -1183,7 +1184,7 @@ "True" ] }, - "execution_count": 13, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -1246,7 +1247,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 11, "id": "a1764edb", "metadata": {}, "outputs": [], @@ -1263,12 +1264,12 @@ " HadamardBS() >>\n", " (Phase(0.5) @ qmode) >>\n", " HadamardBS()\n", - ") @ Scalar(2 ** 0.5)" + ")" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 12, "id": "c557c4b8", "metadata": {}, "outputs": [], @@ -1283,7 +1284,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 13, "id": "7bb5e46f", "metadata": {}, "outputs": [], @@ -1291,20 +1292,20 @@ "from optyx.photonic import FusionTypeII\n", "\n", "@Channel.from_callable(\n", - " dom=qubit, cod=qubit\n", + " dom=qubit, cod=qmode @ qmode\n", ")\n", "def fusion_teleportation(a):\n", " dual_rail_encoded_input = DualRail(1)(a)\n", " b, c, d, e = dual_rail_encoded_bell()\n", " s, k = FusionTypeII()(*dual_rail_encoded_input, b, c)\n", " fusion_failure_processing(s)\n", - " output_rail_1, output_rail = correction(k, d, e)\n", - " return DualRail(1).dagger()(output_rail_1, output_rail)" + " dr_output_1, dr_output_2 = correction(k, d, e)\n", + " return dr_output_1, dr_output_2" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "4b5ee771", "metadata": {}, "outputs": [ @@ -1319,7 +1320,7 @@ " \n", " \n", " \n", - " 2025-09-19T10:14:02.215469\n", + " 2025-09-20T14:16:34.796782\n", " image/svg+xml\n", " \n", " \n", @@ -1348,381 +1349,360 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pc684b033d8)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p4bcf70933b)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "Q 79.2 23.2 79.2 23.2 \n", + "\" clip-path=\"url(#p4bcf70933b)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p4bcf70933b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p4bcf70933b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p4bcf70933b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p4bcf70933b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p4bcf70933b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p4bcf70933b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p4bcf70933b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p4bcf70933b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", + "\" clip-path=\"url(#p4bcf70933b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + "\" clip-path=\"url(#p4bcf70933b)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1966,7 +1946,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1976,7 +1956,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1986,7 +1966,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1996,7 +1976,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2006,7 +1986,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2016,7 +1996,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2026,7 +2006,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2036,7 +2016,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2046,7 +2026,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2056,7 +2036,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2066,7 +2046,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2075,7 +2055,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2084,7 +2064,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2093,7 +2073,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2102,7 +2082,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2110,7 +2090,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2118,7 +2098,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2126,7 +2106,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2134,7 +2114,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2142,7 +2122,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2150,7 +2130,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2160,7 +2140,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2170,7 +2150,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2178,7 +2158,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2186,7 +2166,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2196,7 +2176,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2206,7 +2186,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2215,18 +2195,8 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2638,9 +2608,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2654,9 +2624,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2927,9 +2897,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2949,190 +2919,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3166,10 +2956,10 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3177,10 +2967,10 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3188,10 +2978,10 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3202,7 +2992,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3222,11 +3012,10 @@ "fusion_teleportation_monoidal_syntax = (\n", " DualRail(1) @ dual_rail_encoded_bell >>\n", " FusionTypeII() @ qmode**2 >>\n", - " fusion_failure_processing @ correction >>\n", - " DualRail(1).dagger()\n", + " fusion_failure_processing @ correction\n", ")\n", "\n", - "array_teleportation = fusion_teleportation.eval().tensor.array\n", + "array_teleportation = fusion_teleportation_monoidal_syntax.eval().tensor.array\n", "\n", "fusion_teleportation_monoidal_syntax.foliation().draw(figsize=(8, 8))\n" ] @@ -3241,7 +3030,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 15, "id": "c19354d7", "metadata": {}, "outputs": [ @@ -3251,7 +3040,7 @@ "True" ] }, - "execution_count": 18, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -3260,8 +3049,8 @@ "import numpy as np\n", "from optyx.photonic import Id\n", "\n", - "array_id = Id(1).double().to_tensor().eval().array\n", - "np.allclose(array_teleportation, array_id)" + "array_dr = (DualRail(1) @ Scalar(0.5**0.5)).double().to_tensor().eval().array\n", + "np.allclose(array_teleportation[:, :, :2, :2, :2, :2], array_dr)\n" ] }, { @@ -3274,7 +3063,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "51acb733", "metadata": {}, "outputs": [], @@ -3289,6 +3078,8 @@ " a, b = _flat(SU), _flat(SV)\n", " num = abs(np.vdot(a, b))\n", " den = np.linalg.norm(a) * np.linalg.norm(b)\n", + " if den == 0:\n", + " return 0.0\n", " return float(num / den)\n", "\n", "def average_fidelity(SU, SV, d):\n", @@ -3298,17 +3089,39 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 17, "id": "fb497580", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n", + "/home/mateuszkupper/Documents/optyx/.venv/lib/python3.12/site-packages/cotengra/hyperoptimizers/hyper.py:329: UserWarning: Trial error: not enough values to unpack (expected 2, got 1). Set `HyperOptimizer` kwarg `on_trial_error='raise'` to raise this error, or `on_trial_error='ignore'` to silence.\n", + " warnings.warn(\n" + ] + }, { "data": { "text/plain": [ "Text(0.5, 1.0, 'Fusion-based Teleportation Fidelity vs Contraction Chi')" ] }, - "execution_count": 110, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" }, @@ -3323,7 +3136,7 @@ " \n", " \n", " \n", - " 2025-09-19T11:03:03.818054\n", + " 2025-09-20T14:18:22.288043\n", " image/svg+xml\n", " \n", " \n", @@ -3359,16 +3172,16 @@ " \n", " \n", + "\" clip-path=\"url(#pf106dbf14a)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3428,11 +3241,11 @@ " \n", " \n", + "\" clip-path=\"url(#pf106dbf14a)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3475,11 +3288,11 @@ " \n", " \n", + "\" clip-path=\"url(#pf106dbf14a)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3521,11 +3334,11 @@ " \n", " \n", + "\" clip-path=\"url(#pf106dbf14a)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3541,11 +3354,11 @@ " \n", " \n", + "\" clip-path=\"url(#pf106dbf14a)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3595,11 +3408,11 @@ " \n", " \n", + "\" clip-path=\"url(#pf106dbf14a)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3615,11 +3428,11 @@ " \n", " \n", + "\" clip-path=\"url(#pf106dbf14a)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3656,11 +3469,11 @@ " \n", " \n", + "\" clip-path=\"url(#pf106dbf14a)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3676,11 +3489,11 @@ " \n", " \n", + "\" clip-path=\"url(#pf106dbf14a)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3759,43 +3572,63 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4273,15 +4022,15 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", + "L 384.668523 34.466612 \n", + "\" clip-path=\"url(#pf106dbf14a)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4321,7 +4070,7 @@ "L 400.90125 22.318125 \n", "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4569,7 +4318,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4594,10 +4343,9 @@ " error_for_chi = []\n", " for _ in range(10):\n", " error_for_chi.append(\n", - " average_fidelity(\n", + " process_fidelity(\n", " fusion_teleportation.eval(QuimbBackend(optimiser)).tensor.array,\n", - " array_teleportation,\n", - " d=2\n", + " array_teleportation\n", " )\n", " )\n", " errors.append(np.median(error_for_chi))\n", @@ -4620,7 +4368,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 18, "id": "ac439493", "metadata": {}, "outputs": [], @@ -4629,32 +4377,34 @@ "\n", "def fusion_teleportation_with_photon_loss(p):\n", " @Channel.from_callable(\n", - " dom=qubit, cod=qubit\n", + " dom=qubit, cod=qmode**2\n", " )\n", " def fusion_teleportation(a):\n", " dr_input_1, dr_input_2 = DualRail(1)(a)\n", " b, c, d, e = dual_rail_encoded_bell()\n", - " dr_input_2_loss, c_loss, e_loss = PhotonLoss(p)(dr_input_2), PhotonLoss(p)(c), PhotonLoss(p)(e)\n", - " s, k = FusionTypeII()(dr_input_1, dr_input_2_loss, b, c_loss)\n", + " dr_input_1_loss, dr_input_2_loss, b_loss, c_loss, d_loss, e_loss = (\n", + " PhotonLoss(p)(dr_input_1), PhotonLoss(p)(dr_input_2), PhotonLoss(p)(b), PhotonLoss(p)(c), PhotonLoss(p)(d), PhotonLoss(p)(e)\n", + " )\n", + " s, k = FusionTypeII()(dr_input_1_loss, dr_input_2_loss, b_loss, c_loss)\n", " fusion_failure_processing(s)\n", - " output_rail_1, output_rail = correction(k, d, e_loss)\n", - " return DualRail(1).dagger()(output_rail_1, output_rail)\n", + " output_rail_1, output_rail = correction(k, d_loss, e_loss)\n", + " return output_rail_1, output_rail\n", " return fusion_teleportation" ] }, { "cell_type": "code", - "execution_count": null, - "id": "ea619cd4", + "execution_count": 41, + "id": "7e1a2957", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Text(0.5, 1.0, 'Fusion-based Teleportation Fidelity vs Photon Survival Probability (p)')" + "Text(0.5, 1.0, 'Fusion-based Teleportation: Success Probability vs Average Fidelity')" ] }, - "execution_count": 22, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" }, @@ -4664,12 +4414,12 @@ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2025-09-19T10:16:21.874591\n", + " 2025-09-20T14:23:06.268966\n", " image/svg+xml\n", " \n", " \n", @@ -4685,41 +4435,41 @@ " \n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", + " \n", " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -5888,57 +5733,54 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "\n" @@ -5952,23 +5794,26 @@ } ], "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "ps = np.linspace(0.0, 1.0, 20)\n", "\n", - "ps = np.linspace(0, 1, 20)\n", - "errors_with_loss = []\n", + "F_avg_vals = []\n", + "succ_probs = []\n", "for p in ps:\n", - " errors_with_loss.append(\n", - " average_fidelity(\n", - " fusion_teleportation_with_photon_loss(p).eval().tensor.array,\n", - " array_teleportation,\n", - " d=2\n", - " )\n", - " )\n", + " S_impl = fusion_teleportation_with_photon_loss(p).eval().tensor.array\n", + " S_tgt = array_teleportation\n", + " s = average_fidelity(S_impl, S_tgt, d=2)\n", "\n", - "plt.plot(ps, errors_with_loss, marker='o')\n", - "plt.grid()\n", + " succ_probs.append(s)\n", + "\n", + "plt.figure()\n", + "plt.plot(ps, succ_probs, marker='o')\n", + "plt.grid(True)\n", "plt.xlabel('Photon Survival Probability (p)')\n", - "plt.ylabel('Average Gate Fidelity')\n", - "plt.title('Fusion-based Teleportation Fidelity vs Photon Survival Probability (p)')" + "plt.ylabel('Average fidelity')\n", + "plt.title('Fusion-based Teleportation: Success Probability vs Average Fidelity')\n" ] }, { @@ -5997,7 +5842,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "id": "fcbe90b6", "metadata": {}, "outputs": [ @@ -6005,7 +5850,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[1, 0] [0. 1.]\n" + "[1, 0] [0, 1]\n" ] } ], @@ -6018,7 +5863,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 21, "id": "bdb9611d", "metadata": {}, "outputs": [ @@ -6033,7 +5878,7 @@ " \n", " \n", " \n", - " 2025-09-19T10:16:22.025814\n", + " 2025-09-20T14:18:43.556071\n", " image/svg+xml\n", " \n", " \n", @@ -6062,157 +5907,157 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pbbc99b4496)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p68022146c7)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -7520,32 +7365,9 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7580,9 +7425,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7593,7 +7438,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7638,7 +7483,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 22, "id": "9e5c4078", "metadata": {}, "outputs": [], @@ -7663,7 +7508,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 23, "id": "30b96ad0", "metadata": {}, "outputs": [], @@ -7690,7 +7535,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 24, "id": "1c50f388", "metadata": {}, "outputs": [ @@ -7715,7 +7560,7 @@ " \n", " \n", " \n", - " 2025-09-19T10:17:16.103446\n", + " 2025-09-20T14:19:37.183022\n", " image/svg+xml\n", " \n", " \n", @@ -7751,16 +7596,16 @@ " \n", " \n", + "\" clip-path=\"url(#p83458ab365)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7806,11 +7651,11 @@ " \n", " \n", + "\" clip-path=\"url(#p83458ab365)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7852,11 +7697,11 @@ " \n", " \n", + "\" clip-path=\"url(#p83458ab365)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7893,11 +7738,11 @@ " \n", " \n", + "\" clip-path=\"url(#p83458ab365)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7945,11 +7790,11 @@ " \n", " \n", + "\" clip-path=\"url(#p83458ab365)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8006,11 +7851,11 @@ " \n", " \n", + "\" clip-path=\"url(#p83458ab365)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8276,16 +8121,16 @@ " \n", " \n", + "\" clip-path=\"url(#p83458ab365)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8328,11 +8173,11 @@ " \n", " \n", + "\" clip-path=\"url(#p83458ab365)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8348,11 +8193,11 @@ " \n", " \n", + "\" clip-path=\"url(#p83458ab365)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8380,11 +8225,11 @@ " \n", " \n", + "\" clip-path=\"url(#p83458ab365)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8400,11 +8245,11 @@ " \n", " \n", + "\" clip-path=\"url(#p83458ab365)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8452,11 +8297,11 @@ " \n", " \n", + "\" clip-path=\"url(#p83458ab365)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8740,9 +8585,9 @@ "L 127.048587 224.015787 \n", "L 93.399222 231.470859 \n", "L 59.321307 233.998125 \n", - "\" clip-path=\"url(#p6d9b947ed2)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#p83458ab365)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9011,7 +8856,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9039,7 +8884,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 25, "id": "06b9a545", "metadata": {}, "outputs": [ @@ -9054,7 +8899,7 @@ " \n", " \n", " \n", - " 2025-09-19T10:17:16.172772\n", + " 2025-09-20T14:19:37.254559\n", " image/svg+xml\n", " \n", " \n", @@ -9090,16 +8935,16 @@ " \n", " \n", + "\" clip-path=\"url(#p7534fc087b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9176,11 +9021,11 @@ " \n", " \n", + "\" clip-path=\"url(#p7534fc087b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9223,11 +9068,11 @@ " \n", " \n", + "\" clip-path=\"url(#p7534fc087b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9265,11 +9110,11 @@ " \n", " \n", + "\" clip-path=\"url(#p7534fc087b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9318,11 +9163,11 @@ " \n", " \n", + "\" clip-path=\"url(#p7534fc087b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9380,11 +9225,11 @@ " \n", " \n", + "\" clip-path=\"url(#p7534fc087b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9651,16 +9496,16 @@ " \n", " \n", + "\" clip-path=\"url(#p7534fc087b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9677,11 +9522,11 @@ " \n", " \n", + "\" clip-path=\"url(#p7534fc087b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9698,11 +9543,11 @@ " \n", " \n", + "\" clip-path=\"url(#p7534fc087b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9719,11 +9564,11 @@ " \n", " \n", + "\" clip-path=\"url(#p7534fc087b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9740,11 +9585,11 @@ " \n", " \n", + "\" clip-path=\"url(#p7534fc087b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9761,11 +9606,11 @@ " \n", " \n", + "\" clip-path=\"url(#p7534fc087b)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10041,9 +9886,9 @@ "L 197.387015 143.270751 \n", "L 53.709395 231.055379 \n", "L -1 262.721498 \n", - "\" clip-path=\"url(#pbb4c0ea47e)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#p7534fc087b)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -10303,7 +10148,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10349,7 +10194,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 26, "id": "79f358ae", "metadata": {}, "outputs": [], @@ -10365,7 +10210,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 27, "id": "4888034c", "metadata": {}, "outputs": [ @@ -10387,7 +10232,7 @@ " \n", " \n", " \n", - " 2025-09-19T10:50:29.636857\n", + " 2025-09-20T14:19:37.414832\n", " image/svg+xml\n", " \n", " \n", @@ -10421,35 +10266,35 @@ " \n", " \n", + "\" clip-path=\"url(#pdc0410589b)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdc0410589b)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdc0410589b)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdc0410589b)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pdc0410589b)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pdc0410589b)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pdc0410589b)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -10568,11 +10413,11 @@ "L 167.778687 33.07423 \n", "L 169.081412 33.262286 \n", "L 170.382137 33.454569 \n", - "\" clip-path=\"url(#p738f5004be)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#pdc0410589b)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -10676,7 +10521,7 @@ "\" style=\"fill: none; stroke: #d62728; stroke-linecap: round\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10707,7 +10552,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10731,7 +10576,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10765,7 +10610,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11204,7 +11049,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11224,7 +11069,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 28, "id": "bff50dee", "metadata": {}, "outputs": [], @@ -11235,7 +11080,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 29, "id": "bf2d9106", "metadata": {}, "outputs": [], @@ -11249,7 +11094,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 30, "id": "908e477d", "metadata": {}, "outputs": [], @@ -11268,7 +11113,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 31, "id": "07f5f7ba", "metadata": {}, "outputs": [], @@ -11286,7 +11131,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 32, "id": "988c9618", "metadata": {}, "outputs": [ @@ -11495,10 +11340,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 71, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -11537,7 +11382,7 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 33, "id": "96d5bf6b", "metadata": {}, "outputs": [], @@ -11559,7 +11404,7 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 34, "id": "bce649df", "metadata": {}, "outputs": [], @@ -11580,7 +11425,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 35, "id": "f0c1fbf3", "metadata": {}, "outputs": [], @@ -11598,7 +11443,7 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 36, "id": "463bcb6f", "metadata": {}, "outputs": [], @@ -11610,7 +11455,7 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 37, "id": "3f3fca2d", "metadata": {}, "outputs": [], @@ -11632,7 +11477,7 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 38, "id": "54633b7a", "metadata": {}, "outputs": [], @@ -11642,7 +11487,7 @@ }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 39, "id": "e019251e", "metadata": {}, "outputs": [], @@ -11658,7 +11503,7 @@ }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 40, "id": "ca6102c5", "metadata": {}, "outputs": [], @@ -11668,14 +11513,6 @@ " result_optyx\n", ")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "419dd1dd", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/optyx/core/diagram.py b/optyx/core/diagram.py index d0d52299..ce40e78e 100644 --- a/optyx/core/diagram.py +++ b/optyx/core/diagram.py @@ -314,12 +314,12 @@ def list_to_dim(dims: np.ndarray | list) -> Dim: number_of_input_layer_wires = len(self.dom) if input_dims is None: - layer_dims = [2 for _ in range(len(self.dom))] + input_dims = [2 for _ in range(len(self.dom))] else: assert len(self.dom) == len(input_dims), ( f"Input dims length {len(input_dims)} does not match number of input wires {len(self.dom)}" ) - layer_dims = input_dims + layer_dims = input_dims if len(self.boxes) == 0 and len(self.offsets) == 0: return tensor.Diagram.id(list_to_dim(layer_dims)) @@ -333,10 +333,9 @@ def list_to_dim(dims: np.ndarray | list) -> Dim: left_offset, box, right_offset, - layer_dims, + input_dims, prev_layers ) - dims_in = layer_dims[left_offset:left_offset + len(box.dom)] dims_out, _ = modify_io_dims_against_max_dim( box.determine_output_dimensions(dims_in), diff --git a/optyx/utils/utils.py b/optyx/utils/utils.py index 31c9e300..df0e6502 100644 --- a/optyx/utils/utils.py +++ b/optyx/utils/utils.py @@ -518,6 +518,7 @@ def get_max_dim_for_box( ): from optyx.core.diagram import Swap, DualRail from optyx.core.zw import Create, Endo + from optyx.core.control import BitControlledBox if len(box.dom) == 0 or isinstance(box, (Swap, Endo)): return 1e20 @@ -529,6 +530,11 @@ def get_max_dim_for_box( [False] * left_offset + [True] * len(box.dom) + [False] * right_offset + ) if not isinstance(box, BitControlledBox) else ( + [False] * (left_offset + 1) + + [True] * (len(box.dom) - 1) + + [False] * right_offset + ) # walk previous layers from nearest to farthest for previous_left_offset, previous_box in prev_layers[::-1]: From aa8a1acdd3eb44741fd91e196c15dd4e5c476448 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Sat, 20 Sep 2025 15:44:42 +0100 Subject: [PATCH 17/59] Fixed an issue with checking if a channel diagram is pure --- docs/notebooks/graphix_workshop.ipynb | 860 +++++++++++++------------- optyx/core/backends.py | 2 +- optyx/core/channel.py | 18 + test/test_qubit.py | 22 +- 4 files changed, 467 insertions(+), 435 deletions(-) diff --git a/docs/notebooks/graphix_workshop.ipynb b/docs/notebooks/graphix_workshop.ipynb index aea2c944..187435cc 100644 --- a/docs/notebooks/graphix_workshop.ipynb +++ b/docs/notebooks/graphix_workshop.ipynb @@ -41,7 +41,7 @@ " \n", " \n", " \n", - " 2025-09-20T14:16:32.451481\n", + " 2025-09-20T15:23:03.038095\n", " image/svg+xml\n", " \n", " \n", @@ -70,27 +70,27 @@ "L 151.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#pa284aa0791)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#peefc055285)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#peefc055285)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#peefc055285)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#peefc055285)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#peefc055285)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#peefc055285)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -396,7 +396,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -435,7 +435,7 @@ " \n", " \n", " \n", - " 2025-09-20T14:16:32.484953\n", + " 2025-09-20T15:23:03.113336\n", " image/svg+xml\n", " \n", " \n", @@ -464,27 +464,27 @@ "L 151.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p7c1f3775ff)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p82b0da7130)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p82b0da7130)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p82b0da7130)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p82b0da7130)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p82b0da7130)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p82b0da7130)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p82b0da7130)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p82b0da7130)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", @@ -957,7 +957,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1305,7 +1305,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "4b5ee771", "metadata": {}, "outputs": [ @@ -1320,7 +1320,7 @@ " \n", " \n", " \n", - " 2025-09-20T14:16:34.796782\n", + " 2025-09-20T15:23:05.418345\n", " image/svg+xml\n", " \n", " \n", @@ -1349,217 +1349,217 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p4bcf70933b)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p0b68c35c60)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2920,9 +2920,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2957,9 +2957,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2968,9 +2968,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2979,9 +2979,9 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2992,7 +2992,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3136,7 +3136,7 @@ " \n", " \n", " \n", - " 2025-09-20T14:18:22.288043\n", + " 2025-09-20T15:24:56.567030\n", " image/svg+xml\n", " \n", " \n", @@ -3172,16 +3172,16 @@ " \n", " \n", + "\" clip-path=\"url(#p4267fe75bd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3241,11 +3241,11 @@ " \n", " \n", + "\" clip-path=\"url(#p4267fe75bd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3288,11 +3288,11 @@ " \n", " \n", + "\" clip-path=\"url(#p4267fe75bd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3334,11 +3334,11 @@ " \n", " \n", + "\" clip-path=\"url(#p4267fe75bd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3354,11 +3354,11 @@ " \n", " \n", + "\" clip-path=\"url(#p4267fe75bd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3408,11 +3408,11 @@ " \n", " \n", + "\" clip-path=\"url(#p4267fe75bd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3428,11 +3428,11 @@ " \n", " \n", + "\" clip-path=\"url(#p4267fe75bd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3469,11 +3469,11 @@ " \n", " \n", + "\" clip-path=\"url(#p4267fe75bd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3489,11 +3489,11 @@ " \n", " \n", + "\" clip-path=\"url(#p4267fe75bd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3572,63 +3572,83 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4022,15 +4042,15 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", + "L 384.668523 34.484297 \n", + "\" clip-path=\"url(#p4267fe75bd)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4070,7 +4090,7 @@ "L 400.90125 22.318125 \n", "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4318,7 +4338,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4394,7 +4414,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 19, "id": "7e1a2957", "metadata": {}, "outputs": [ @@ -4404,7 +4424,7 @@ "Text(0.5, 1.0, 'Fusion-based Teleportation: Success Probability vs Average Fidelity')" ] }, - "execution_count": 41, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, @@ -4419,7 +4439,7 @@ " \n", " \n", " \n", - " 2025-09-20T14:23:06.268966\n", + " 2025-09-20T15:25:17.545024\n", " image/svg+xml\n", " \n", " \n", @@ -4455,16 +4475,16 @@ " \n", " \n", + "\" clip-path=\"url(#p086050d627)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4510,11 +4530,11 @@ " \n", " \n", + "\" clip-path=\"url(#p086050d627)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4556,11 +4576,11 @@ " \n", " \n", + "\" clip-path=\"url(#p086050d627)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4597,11 +4617,11 @@ " \n", " \n", + "\" clip-path=\"url(#p086050d627)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4649,11 +4669,11 @@ " \n", " \n", + "\" clip-path=\"url(#p086050d627)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4710,11 +4730,11 @@ " \n", " \n", + "\" clip-path=\"url(#p086050d627)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5116,16 +5136,16 @@ " \n", " \n", + "\" clip-path=\"url(#p086050d627)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5175,11 +5195,11 @@ " \n", " \n", + "\" clip-path=\"url(#p086050d627)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5195,11 +5215,11 @@ " \n", " \n", + "\" clip-path=\"url(#p086050d627)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5242,11 +5262,11 @@ " \n", " \n", + "\" clip-path=\"url(#p086050d627)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5262,11 +5282,11 @@ " \n", " \n", + "\" clip-path=\"url(#p086050d627)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5294,11 +5314,11 @@ " \n", " \n", + "\" clip-path=\"url(#p086050d627)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5314,11 +5334,11 @@ " \n", " \n", + "\" clip-path=\"url(#p086050d627)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5366,11 +5386,11 @@ " \n", " \n", + "\" clip-path=\"url(#p086050d627)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5549,9 +5569,9 @@ "L 350.49436 37.375236 \n", "L 367.581441 35.071924 \n", "L 384.668523 34.414125 \n", - "\" clip-path=\"url(#pd7c6b24c91)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#p086050d627)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -5779,7 +5799,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5878,7 +5898,7 @@ " \n", " \n", " \n", - " 2025-09-20T14:18:43.556071\n", + " 2025-09-20T15:25:17.703789\n", " image/svg+xml\n", " \n", " \n", @@ -5907,157 +5927,157 @@ "L 583.2 7.2 \n", "L 7.2 7.2 \n", "z\n", - "\" clip-path=\"url(#p68022146c7)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: #ffffff; stroke: #ffffff; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: #ffffff; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"fill: none; stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pb7b266ae53)\" style=\"stroke: #000000; stroke-linejoin: miter\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -7365,7 +7385,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7391,7 +7411,18 @@ " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -7413,19 +7444,8 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7438,7 +7458,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7560,7 +7580,7 @@ " \n", " \n", " \n", - " 2025-09-20T14:19:37.183022\n", + " 2025-09-20T15:26:10.606186\n", " image/svg+xml\n", " \n", " \n", @@ -7596,16 +7616,16 @@ " \n", " \n", + "\" clip-path=\"url(#pa1fb20084e)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7651,11 +7671,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa1fb20084e)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7697,11 +7717,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa1fb20084e)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7738,11 +7758,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa1fb20084e)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7790,11 +7810,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa1fb20084e)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7851,11 +7871,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa1fb20084e)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8121,16 +8141,16 @@ " \n", " \n", + "\" clip-path=\"url(#pa1fb20084e)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8173,11 +8193,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa1fb20084e)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8193,11 +8213,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa1fb20084e)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8225,11 +8245,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa1fb20084e)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8245,11 +8265,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa1fb20084e)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8297,11 +8317,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa1fb20084e)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8585,9 +8605,9 @@ "L 127.048587 224.015787 \n", "L 93.399222 231.470859 \n", "L 59.321307 233.998125 \n", - "\" clip-path=\"url(#p83458ab365)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#pa1fb20084e)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -8856,7 +8876,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8899,7 +8919,7 @@ " \n", " \n", " \n", - " 2025-09-20T14:19:37.254559\n", + " 2025-09-20T15:26:10.677437\n", " image/svg+xml\n", " \n", " \n", @@ -8935,16 +8955,16 @@ " \n", " \n", + "\" clip-path=\"url(#p674a2f91d2)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9021,11 +9041,11 @@ " \n", " \n", + "\" clip-path=\"url(#p674a2f91d2)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9068,11 +9088,11 @@ " \n", " \n", + "\" clip-path=\"url(#p674a2f91d2)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9110,11 +9130,11 @@ " \n", " \n", + "\" clip-path=\"url(#p674a2f91d2)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9163,11 +9183,11 @@ " \n", " \n", + "\" clip-path=\"url(#p674a2f91d2)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9225,11 +9245,11 @@ " \n", " \n", + "\" clip-path=\"url(#p674a2f91d2)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9496,16 +9516,16 @@ " \n", " \n", + "\" clip-path=\"url(#p674a2f91d2)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9522,11 +9542,11 @@ " \n", " \n", + "\" clip-path=\"url(#p674a2f91d2)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9543,11 +9563,11 @@ " \n", " \n", + "\" clip-path=\"url(#p674a2f91d2)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9564,11 +9584,11 @@ " \n", " \n", + "\" clip-path=\"url(#p674a2f91d2)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9585,11 +9605,11 @@ " \n", " \n", + "\" clip-path=\"url(#p674a2f91d2)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9606,11 +9626,11 @@ " \n", " \n", + "\" clip-path=\"url(#p674a2f91d2)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9886,9 +9906,9 @@ "L 197.387015 143.270751 \n", "L 53.709395 231.055379 \n", "L -1 262.721498 \n", - "\" clip-path=\"url(#p7534fc087b)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#p674a2f91d2)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -10148,7 +10168,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10232,7 +10252,7 @@ " \n", " \n", " \n", - " 2025-09-20T14:19:37.414832\n", + " 2025-09-20T15:26:10.879280\n", " image/svg+xml\n", " \n", " \n", @@ -10266,35 +10286,35 @@ " \n", " \n", + "\" clip-path=\"url(#p2d12089205)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2d12089205)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2d12089205)\" style=\"fill: none; stroke-dasharray: 3.7,1.6; stroke-dashoffset: 0; stroke: #000000; stroke-opacity: 0.7\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2d12089205)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p2d12089205)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2d12089205)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p2d12089205)\" style=\"fill: none; stroke: #2ca02c; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -10413,11 +10433,11 @@ "L 167.778687 33.07423 \n", "L 169.081412 33.262286 \n", "L 170.382137 33.454569 \n", - "\" clip-path=\"url(#pdc0410589b)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", + "\" clip-path=\"url(#p2d12089205)\" style=\"fill: none; stroke: #d62728; stroke-linecap: square\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -10521,7 +10541,7 @@ "\" style=\"fill: none; stroke: #d62728; stroke-linecap: round\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10552,7 +10572,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10576,7 +10596,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -10610,7 +10630,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11049,7 +11069,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -11340,7 +11360,7 @@ "
" ], "text/plain": [ - "" + "" ] }, "execution_count": 32, @@ -11513,6 +11533,14 @@ " result_optyx\n", ")" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a7c85548", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/optyx/core/backends.py b/optyx/core/backends.py index b87508e5..ab9e1565 100644 --- a/optyx/core/backends.py +++ b/optyx/core/backends.py @@ -250,7 +250,7 @@ def _prob_dist_mixed( if not any(t in {bit, mode} for t in self.output_types): raise ValueError( - "Types must contain at least one 'bit' or 'mode'." + "Output types must contain at least one 'bit' or 'mode'." ) values = self._convert_array_to_dict(self.tensor.array, round_digits) diff --git a/optyx/core/channel.py b/optyx/core/channel.py index eed7812d..cabf31f3 100644 --- a/optyx/core/channel.py +++ b/optyx/core/channel.py @@ -240,12 +240,30 @@ def is_pure(self): for layer in self: generator = layer.inside[0][1] + # if we have a discard/measure acting on quantum types, it's not pure + if ( + isinstance(generator, (Discard, Measure)) and + any(not ty.is_classical for ty in generator.dom.inside) + ): + return False + if hasattr(generator, 'env') and generator.env != diagram.Ty(): + return False + + # if we prepare quantum from classical types, it's not pure + if ( + isinstance(generator, Encode) and + any(ty.is_classical for ty in generator.cod.inside) + ): + return False + + # if we're mixing classical and quantum types, it's not pure are_layers_pure.append( any(ty.is_classical for ty in generator.cod.inside) or any(ty.is_classical for ty in generator.dom.inside) or isinstance(generator, Discard) ) + # assume all classical maps are pure are_layers_classical.append( all(ty.is_classical for ty in generator.cod.inside) and all(ty.is_classical for ty in generator.dom.inside) diff --git a/test/test_qubit.py b/test/test_qubit.py index c6f5ca6c..003f08df 100644 --- a/test/test_qubit.py +++ b/test/test_qubit.py @@ -107,27 +107,13 @@ def test_discard_qubits(): def test_bit_flip_error(): prob = 0.43 - a = (qubits.BitFlipError(prob).get_kraus().to_tensor().to_quimb() ^ ...).data - b = zx.X(1, 2) >> zx.Id(1) @ zx.ZBox( - 1, 1, np.sqrt((1 - prob) / prob) - ) @ zx.scalar(np.sqrt(prob * 2)) - b = (b.to_tensor().to_quimb() ^ ...).data - - assert np.allclose(a, b) + a = (qubits.Z(0, 1) >> qubits.BitFlipError(prob)).eval().tensor.array + assert np.allclose(a, np.array([[-.14, -0.14], [-0.14, -0.14]])) def test_dephasingerror(): prob = 0.43 - a = (qubits.DephasingError(prob).get_kraus().to_tensor().to_quimb() ^ ...).data - b = ( - zx.H - >> zx.X(1, 2) - >> zx.H - @ zx.ZBox(1, 1, np.sqrt((1 - prob) / prob)) - @ zx.scalar(np.sqrt(prob * 2)) - ) - b = (b.to_tensor().to_quimb() ^ ...).data - - assert np.allclose(a, b) + a = (qubits.Z(0, 1) >> qubits.DephasingError(prob)).eval().tensor.array + assert np.allclose(a, np.array([[-.14, 1.], [1, -0.14]])) def test_ket(): from optyx.core import diagram From 9ebdd71f1936019fcb14fea54e70a0ba9cb10841 Mon Sep 17 00:00:00 2001 From: mateuszkupper Date: Mon, 22 Sep 2025 16:13:11 +0100 Subject: [PATCH 18/59] revised readme notebook --- docs/notebooks/distributed_entanglement.png | Bin 0 -> 314876 bytes docs/notebooks/graphix_workshop.ipynb | 3532 ++++++------------- docs/notebooks/teleportation_danube.png | Bin 0 -> 190048 bytes 3 files changed, 1012 insertions(+), 2520 deletions(-) create mode 100644 docs/notebooks/distributed_entanglement.png create mode 100644 docs/notebooks/teleportation_danube.png diff --git a/docs/notebooks/distributed_entanglement.png b/docs/notebooks/distributed_entanglement.png new file mode 100644 index 0000000000000000000000000000000000000000..ab5c83befd7dd9a22c717e8301ec3881fccdb517 GIT binary patch literal 314876 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