diff --git a/README.md b/README.md
index 228b0c0c..e89b0db2 100644
--- a/README.md
+++ b/README.md
@@ -1,37 +1,431 @@
-# 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](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.
-# Development
+## Basic syntax: the CNOT gate
-## Format the code
+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.
+### 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 import qubit
+from optyx.qubits import Z, X, Scalar
+
+cnot = Z(1, 2) @ qubit >> qubit @ X(2, 1) @ Scalar(2 ** 0.5)
+cnot.draw()
```
-black optyx/
+
+### Function syntax
+
+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
+@Channel.from_callable(
+ dom=qubit @ qubit, cod=qubit @ qubit
+)
+def cnot(a, b):
+ c, d = Z(1, 2)(a)
+ e = X(2, 1)(d, b)
+ Scalar(2 ** 0.5)()
+ return c, e
```
-## Lint the code
+## Qubit example: teleportation protocol
+
+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 :
+
+
+### Define the protocol
+
+Write the protocol using function syntax:
+
+```python
+from optyx import bit
+from optyx.qubits import Measure
+from optyx.classical import CtrlX, CtrlZ
+
+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 = CtrlX(a_, b)
+ return CtrlZ(c_, bb)
```
-pflake8 optyx/
-pylint optyx/
+
+Or using monoidal syntax:
+
+```python
+teleportation_monoidal_syntax = (
+ qubit @ bell >>
+ cnot @ qubit >>
+ H() @ qubit ** 2 >>
+ Measure(1) @ Measure(1) @ qubit >>
+ bit @ CtrlX >>
+ CtrlZ
+)
```
-## Test the code
+### Simulate using backends
+
+```python
+import numpy as np
+from optyx.qubits import Id
+
+np.allclose(
+ teleportation.eval().tensor.array,
+ teleportation_monoidal_syntax.eval().tensor.array,
+ Id(1).double().to_tensor().eval().array
+)
```
-pytest .
+
+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
+from optyx.core.backends import (
+ DiscopyBackend,
+ QuimbBackend
+)
+
+np.allclose(
+ teleportation.eval(DiscopyBackend()).tensor.array,
+ teleportation.eval(QuimbBackend()).tensor.array
+)
```
-## Test the code and produce coverage statistics
+### 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))
```
-coverage run -m pytest .
-coverage report --fail-under=95 --show-missing
+
+
+
+
+
+
+
+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()
+pyzx.full_reduce(pyzx_graph, quiet=True)
+pyzx_graph.normalize()
+pyzx.draw(pyzx_graph)
```
-## Build the documentation
+
+
+The diagram (a doubled identity) is the identity CPTP map as expected.
+
+
+## Photonic example: the Hong-Ou-Mandel effect
+
+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 BS, Create
+
+beam_splitter = BS
+beam_splitter.draw()
+
+HOM = (
+ Create(1) @ Create(1) >>
+ beam_splitter
+)
+
+HOM.eval().prob_dist()
```
-sphinx-build docs docs/_build/html
+
+
+
+
+ {(0, 2): 0.5, (1, 1): 0, (2, 0): 0.5}
+
+
+### 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
+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
+
+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
+from optyx.photonic import BS
+
+internal_state_1 = [1, 0]
+internal_state_2 = [np.sqrt(0.9), np.sqrt(0.1)]
+
+create = Create(1, 1, internal_states=(
+ internal_state_1, internal_state_2))
+
+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)
+```
+
+
+## Hybrid example: 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 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~ :
+
+
+
+
+### 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
+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)
+
+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 Pauli byproducts
+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))
+```
+
+
+
+
+#### Test the protocol for different internal states
+
+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
+
+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))
+
+inner_product_states = []
+inner_product_bell_states = []
+
+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)
+
+ 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(process_fidelity/normalisation)
+```
+
+The simulation data reveals how distinguishability affects the fidelity of the entanglement generation protocol.
+
+```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()
+```
+
+
+
+
+## Interfaces with external libraries
+
+### Graphix interface
+
+Import an `OpenGraph` from [graphix](https://github.com/TeamGraphix/graphix).
+
+
+```python
+import graphix
+
+circuit = graphix.Circuit(2)
+circuit.cnot(0, 1)
+
+pattern = circuit.transpile().pattern
+
+simulator = graphix.simulator.PatternSimulator(pattern, backend="statevector")
+graphix_result = simulator.run().psi.conj()
+```
+
+
+```python
+from optyx.qubits import Circuit, Ket
+
+optyx_zx = Circuit(pattern)
+
+optyx_res = (
+ qubits.Ket("+")**2 >> optyx_zx
+).eval().amplitudes()
+
+for keys in optyx_res.keys():
+ assert np.isclose(optyx_res[keys], graphix_result[keys], atol=1e-6)
+```
+
+### Perceval circuits and processors
+
+Interface with both processors and circuits in [Perceval](https://github.com/Quandela/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)
+```
+
+
+
+
+
+
+
+
+
+
+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)
+
+result_perceval = p.probs()
+```
+
+Convert to optyx and check that the results agree.
+
+
+```python
+optyx_diagram = Channel.from_perceval(p)
+
+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)
+)
+
+result_optyx = protocol.eval().prob_dist()
+
+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)
+
+check_dict_agreement(
+ {tuple(k): v for k, v in dict(result_perceval["results"]).items()},
+ result_optyx
+)
+```
\ No newline at end of file
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
diff --git a/docs/notebooks/bosonic-vqe-2.ipynb b/docs/notebooks/bosonic-vqe-2.ipynb
index c558f36d..d028b85c 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-05T20:09:47.097250\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(#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,11 +916,11 @@
" \n",
" \n",
" \n",
- " 2025-07-01T14:58:42.693815\n",
+ " 2025-09-05T20:09:47.853222\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(#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",
" \n",
- " \n",
+ " \n",
" \n",
" \n",
" \n",
@@ -1761,71 +1761,6 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "05f93f4b",
- "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])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "id": "4351a6e7",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(67.9411254969543+0j)"
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "sum"
- ]
- },
- {
- "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": [],
@@ -1835,11 +1770,13 @@
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": null,
"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 +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",
+ "f_exp = lambda xs: to_float(expectation.lambdify(*free_syms)(*xs).eval().tensor.array)\n",
"\n",
"def d_f_exp(xs):\n",
" return [\n",
- " expectation.grad(s).lambdify(*free_syms)(*xs).eval().array[0, 0]\n",
+ " expectation.grad(s).lambdify(*free_syms)(*xs).eval().tensor.array\n",
" for s in free_syms\n",
" ]"
]
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": 7,
"id": "24355282-4c9c-40b3-b643-461981f9475f",
"metadata": {},
"outputs": [],
@@ -1890,7 +1827,7 @@
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": 8,
"id": "e96227b0-db8e-4871-8c12-b1d034a4bc86",
"metadata": {},
"outputs": [
@@ -1898,7 +1835,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
- "100%|██████████| 10/10 [06:35<00:00, 39.56s/it]\n"
+ "100%|██████████| 10/10 [04:56<00:00, 29.62s/it]\n"
]
}
],
@@ -1908,10 +1845,20 @@
},
{
"cell_type": "code",
- "execution_count": 11,
+ "execution_count": 9,
"id": "088c8fa8-76b3-45bd-a5dd-b337be0d33b1",
"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": [
@@ -1923,11 +1870,11 @@
" \n",
" \n",
" \n",
- " 2025-07-01T15:06:04.533106\n",
+ " 2025-09-05T20:15:39.618171\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 +1905,12 @@
" \n",
" \n",
" \n",
- " \n",
" \n",
" \n",
- " \n",
+ " \n",
" \n",
" \n",
" \n",
@@ -1999,7 +1946,7 @@
" \n",
" \n",
" \n",
- " \n",
+ " \n",
" \n",
" \n",
" \n",
@@ -2038,7 +1985,7 @@
" \n",
" \n",
" \n",
- " \n",
+ " \n",
" \n",
" \n",
" \n",
@@ -2072,7 +2019,7 @@
" \n",
" \n",
" \n",
- " \n",
+ " \n",
" \n",
" \n",
" \n",
@@ -2117,7 +2064,7 @@
" \n",
" \n",
" \n",
- " \n",
+ " \n",
" \n",
" \n",
" \n",
@@ -2171,7 +2118,7 @@
" \n",
" \n",
" \n",
- " \n",
+ " \n",
" \n",
" \n",
" \n",
@@ -2203,12 +2150,12 @@
" \n",
" \n",
" \n",
- " \n",
" \n",
" \n",
- " \n",
+ " \n",
" \n",
" \n",
" \n",
@@ -2240,7 +2187,7 @@
" \n",
" \n",
" \n",
- " \n",
+ " \n",
" \n",
" \n",
" \n",
@@ -2256,7 +2203,7 @@
" \n",
" \n",
" \n",
- " \n",
+ " \n",
" \n",
" \n",
" \n",
@@ -2272,7 +2219,7 @@
" \n",
" \n",
" \n",
- " \n",
+ " \n",
" \n",
" \n",
" \n",
@@ -2287,7 +2234,7 @@
" \n",
" \n",
" \n",
- " \n",
+ " \n",
" \n",
" \n",
" \n",
@@ -2302,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",
@@ -2351,7 +2298,7 @@
" \n",
" \n",
" \n",
- " \n",
+ " \n",
" \n",
" \n",
" \n",
@@ -2371,19 +2318,11 @@
"plt.plot(range(len(xs)),fxs,'b.')\n",
"plt.show()"
]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "ce3cd5e4-f9b5-4f29-b805-7bee285dfed7",
- "metadata": {},
- "outputs": [],
- "source": []
}
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3",
+ "display_name": ".venv",
"language": "python",
"name": "python3"
},
@@ -2397,7 +2336,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",
@@ -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",
"