From 3afb4a1c3da14aeb8376b0eadac652657ec9da04 Mon Sep 17 00:00:00 2001 From: lucas Date: Mon, 29 Apr 2024 13:29:53 +0200 Subject: [PATCH 01/79] stim integration --- src/mqt/qecc/cc_decoder/decoder.py | 52 +++-- .../plotting/plot_convergence_rate.ipynb | 125 ++++++++++++ .../plotting/plot_pseudothresholds.ipynb | 193 ++++++++++++++++++ .../qecc/cc_decoder/{ => plotting}/plots.py | 48 +++-- .../run_color_code_phenomenological_noise.py | 70 +++++++ .../cc_decoder/stim_interface/__init__.py | 0 .../stim_interface/color_code_stim.py | 92 +++++++++ .../stim_interface/dem_to_matrices.py | 172 ++++++++++++++++ .../stim_interface/max_sat_sinter_decoder.py | 123 +++++++++++ .../stim_interface/max_sat_stim_decoder.py | 112 ++++++++++ 10 files changed, 957 insertions(+), 30 deletions(-) create mode 100644 src/mqt/qecc/cc_decoder/plotting/plot_convergence_rate.ipynb create mode 100644 src/mqt/qecc/cc_decoder/plotting/plot_pseudothresholds.ipynb rename src/mqt/qecc/cc_decoder/{ => plotting}/plots.py (91%) create mode 100644 src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py create mode 100644 src/mqt/qecc/cc_decoder/stim_interface/__init__.py create mode 100644 src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py create mode 100644 src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py create mode 100644 src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py create mode 100644 src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py diff --git a/src/mqt/qecc/cc_decoder/decoder.py b/src/mqt/qecc/cc_decoder/decoder.py index 674ef5a2..b90e3bdf 100644 --- a/src/mqt/qecc/cc_decoder/decoder.py +++ b/src/mqt/qecc/cc_decoder/decoder.py @@ -1,5 +1,4 @@ """LightsOut MaxSAT-based decoder for the hexagonal color code.""" - from __future__ import annotations import datetime @@ -37,14 +36,19 @@ def preconstruct_parity_constraint(self, light: int, indices: list[int]) -> None Adds all constraint to the optimizer that are independent of the value of the light. """ helper_vars = self.helper_vars[light] - assert self.switch_vars is not None - for i in range(1, len(indices) - 1): - constraint = Xor(self.switch_vars[indices[i]], helper_vars[i]) == helper_vars[i - 1] + if len(helper_vars) > 1: + # Xor(switch1, helper1) == helper0, Xor(switch2, helper2) == helper1, ... + for i in range(1, len(indices) - 1): + constraint = Xor(self.switch_vars[indices[i]], helper_vars[i]) == helper_vars[i - 1] + self.optimizer.add(simplify(constraint)) + # switchN-1 == helperN-1 + constraint = self.switch_vars[indices[-1]] == helper_vars[-1] + self.optimizer.add(simplify(constraint)) + else: + assert len(indices) == 1 + constraint = Xor(self.switch_vars[indices[0]], False) == helper_vars[0] self.optimizer.add(simplify(constraint)) - - constraint = self.switch_vars[indices[-1]] == helper_vars[-1] - self.optimizer.add(simplify(constraint)) def complete_parity_constraint(self, light: int, indices: list[int], val: bool) -> None: """Completes the parity constraints for a light. @@ -56,22 +60,28 @@ def complete_parity_constraint(self, light: int, indices: list[int], val: bool) constraint = Xor(self.switch_vars[indices[0]], helper_vars[0]) == val self.optimizer.add(simplify(constraint)) - def preconstruct_z3_instance(self) -> None: + def preconstruct_z3_instance(self, weights) -> None: """Preconstruct the z3 instance for the lights-out problem. Creates all necessary variables, adds the known parts of the parity constraints. Soft constraints are added to the optimizer with default weights. """ if self.switch_vars is None: - self.switch_vars = [Bool(f"switch_{i}") for i in range(len(self.switches_to_lights))] + self.switch_vars = [Bool(f"switch_{i}") for i in range( + len(self.switches_to_lights))] for light, switches in self.lights_to_switches.items(): if light not in self.helper_vars: - self.helper_vars[light] = [Bool(f"helper_{light}_{i}") for i in range(len(switches) - 1)] + if len(switches) > 1: + self.helper_vars[light] = [ + Bool(f"helper_{light}_{i}") for i in range(len(switches) - 1)] + else: + self.helper_vars[light] = [ + Bool(f"helper_{light}_{i}") for i in range(len(switches))] self.preconstruct_parity_constraint(light, switches) - for switch in self.switch_vars: - self.optimizer.add_soft(Not(switch)) + for idx, switch in enumerate(self.switch_vars): + self.optimizer.add_soft(Not(switch), weights[idx]) def validate_model(self, model: ModelRef, lights: list[bool]) -> bool: """Validate the model by checking if pressing the switches turns off all lights.""" @@ -90,15 +100,15 @@ def count_switches(self, model: ModelRef) -> int: return sum(1 for var in self.switch_vars if model[var]) def solve( - self, lights: list[bool], solver_path: str = "z3" - ) -> tuple[list[int], datetime.timedelta, datetime.timedelta]: + self, lights: list[bool], solver_path: str = "z3" + ) -> tuple[list[int], bool, datetime.timedelta]: """Solve the lights-out problem for a given pattern. Assumes that the z3 instance has already been pre-constructed. """ # push a new context to the optimizer self.optimizer.push() - + self.optimizer.set("timeout", 1500) # add the problem specific constraints start = datetime.datetime.now() for light, val in enumerate(lights): @@ -110,11 +120,17 @@ def solve( start = datetime.datetime.now() result = self.optimizer.check() solve_time = datetime.datetime.now() - start - assert str(result) == "sat", "No solution found" + if str(result) != "sat": + self.optimizer.pop() + return ([0 for var in self.switch_vars], False, solve_time) # validate the model model = self.optimizer.model() - assert self.validate_model(model, lights), "Model is invalid" + if self.validate_model(model, lights) == False: + self.optimizer.pop() + + assert self.validate_model(model, lights), "Model is invalid" + return ([0 for var in self.switch_vars], False, solve_time) assert self.switch_vars is not None switches = [1 if model[var] else 0 for var in self.switch_vars] else: @@ -130,7 +146,7 @@ def solve( # pop the context from the optimizer self.optimizer.pop() - return switches, constr_time, solve_time + return switches, True, solve_time def simulate_error_rate(code: ColorCode, error_rate: float, nr_sims: int, solver_path: str = "z3") -> dict[str, Any]: diff --git a/src/mqt/qecc/cc_decoder/plotting/plot_convergence_rate.ipynb b/src/mqt/qecc/cc_decoder/plotting/plot_convergence_rate.ipynb new file mode 100644 index 00000000..25deac6c --- /dev/null +++ b/src/mqt/qecc/cc_decoder/plotting/plot_convergence_rate.ipynb @@ -0,0 +1,125 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-23T16:57:07.915059Z", + "start_time": "2024-04-23T16:57:07.902158Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/luca/Documents/codeRepos/cc-decoding/src/mqt/qecc/cc_decoder\n" + ] + } + ], + "source": [ + "import os\n", + "import matplotlib.pyplot as plt\n", + "from collections import defaultdict\n", + "import matplotlib.ticker as ticker\n", + "\n", + "\n", + "print(os.getcwd())\n", + "with open(f'{os.getcwd()}/convergence_rate.txt', 'r') as file:\n", + " content = file.read()\n", + "\n", + "convergence_rate_dict = defaultdict(lambda: defaultdict(int))\n", + "for line in content.split('\\n'):\n", + " d, per, n_converged, n_not_converged = line.split(' ')[:]\n", + " convergence_rate_dict[d][round(float(per),5)] = (int(n_converged), int(n_not_converged))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-23T16:57:38.875969Z", + "start_time": "2024-04-23T16:57:38.669858Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d=3\n", + "d=4\n", + "d=5\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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eP3114WDg4PIzc21XvD/Yu4xaGxsFI8//rjo16+fyMzMNPr9NjQ0GNrpq9fBzsZ/Jymvg0JIMwa2di0UQmavwQshxMcffywGDBgg1Gq1GDNmjDh58qThu4ceekg899xzRvV37twpwsLChFqtFsOGDRN79+41+l6n04k33nhD+Pn5CY1GIyZMmCCys7ON6pSVlYnZs2cLFxcXodVqxbx580R1dbXFYuyIFPHfSeq/+FLE//3334tJkyYJT09P4erqKu6//36xb98+i8V4L+Yegy1btggAbX5WrlwphBDi8OHDJr8HIPLy8iwcbVvWjl9v7dq1ol+/fsLJyUnEx8eL7777zlIh3pM5x0D/d9rUz+HDhw31+up1sLPx30nq66AQ0oyBrV0LFUIIYbn7S0RERES2RzZzgIiIiIj0mAARERGR7DABIiIiItlhAkRERESywwSIiIiIZIcJEBEREckOEyAiIiKSHSZAREREJDtMgIjIpM8++wzu7u4Wa//IkSNQKBSoqKgwS3tXr16FQqFAZmamWdojor6NCRCRTM2dOxcKhQIKhQJqtRqDBw/GmjVr0NzcbJXzP/DAAygoKICbm5tVztcXWTpJJerLmAARydjkyZNRUFCAnJwcvPzyy1i1ahXee+89q5xbrVbD398fCoXCKufrjpaWFpM7VTc2Nnarvc4e1932iajzmAARyZhGo4G/vz+Cg4OxaNEiJCQkYM+ePUZ1vvnmG0RERMDFxcWQMAHA0aNHYW9vj8LCQqP6L730En72s58BAK5du4apU6fCw8MDzs7OGDZsGPbt2wfA9COw48ePY/z48XBycoKHhwcSExNx69YtAMD+/fsxbtw4uLu7w8vLC4899hiuXLnSpXgbGhrwyiuvICgoCM7OzoiLi8ORI0cM3+vvqOzZsweRkZHQaDS4fv06QkJC8Oabb2LOnDnQarV4/vnnAQBffPEFhg0bBo1Gg5CQEHzwwQdG52vvuLuNHz8eS5cuxUsvvQRvb28kJiYCANatW4fo6Gg4Ozujf//+WLx4MWpqagzjN2/ePFRWVhru5K1atapTcRIREyAiuoOjo6PR3Ye6ujq8//772L59O44ePYrr16/jlVdeAQA8+OCDGDhwILZv326o39TUhL/97W/41a9+BQBYsmQJGhoacPToUWRlZeGdd96Bi4uLyXNnZmZiwoQJiIyM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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "for d in convergence_rate_dict:\n", + " print(f'd={d}')\n", + " pers = []\n", + " convergence_rates = []\n", + " for per in convergence_rate_dict[d]:\n", + " pers.append(per)\n", + " pers.sort()\n", + "\n", + " for per in pers:\n", + " n_converged, n_not_converged = convergence_rate_dict[d][per]\n", + " convergence_rates.append(n_converged / (n_converged + n_not_converged))\n", + " plt.plot(pers, convergence_rates, label=f'd={d}')\n", + "\n", + "ax = plt.gca()\n", + "ax.xaxis.set_major_locator(ticker.MaxNLocator(nbins=10))\n", + "ax.grid()\n", + "\n", + "plt.legend()\n", + "plt.ylabel('Convergence rate')\n", + "plt.xlabel('Physical error rate')\n", + "plt.savefig('convergence.svg')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-23T16:57:08.282477Z", + "start_time": "2024-04-23T16:57:08.279518Z" + } + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/mqt/qecc/cc_decoder/plotting/plot_pseudothresholds.ipynb b/src/mqt/qecc/cc_decoder/plotting/plot_pseudothresholds.ipynb new file mode 100644 index 00000000..014c1b59 --- /dev/null +++ b/src/mqt/qecc/cc_decoder/plotting/plot_pseudothresholds.ipynb @@ -0,0 +1,193 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-23T17:01:27.415602Z", + "start_time": "2024-04-23T17:01:27.367630Z" + } + }, + "outputs": [], + "source": [ + "import os\n", + "import matplotlib.pyplot as plt\n", + "import sinter\n", + "import numpy as np\n", + "\n", + "samples=sinter.read_stats_from_csv_files(f'{os.getcwd()}/pseudothreshold_plot.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-23T17:01:29.027377Z", + "start_time": "2024-04-23T17:01:27.418020Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlAAAAHHCAYAAABwaWYjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOy9d5xcV3n//z63TC/bq1ZaWbIkSy5y7wUXbGMgNg41gDEB8k1McWxIyJdiSgLfvEwxIU4oSbADPzrY4NgY4kIxGBfJXZbVV6vtbfqdueWc3x+zu9rVdktGLucN49m5c++5Z+7M7nz0PM/5PEIppdBoNBqNRqPRLBrjcE9Ao9FoNBqN5qWGFlAajUaj0Wg0S0QLKI1Go9FoNJologWURqPRaDQazRLRAkqj0Wg0Go1miWgBpdFoNBqNRrNEtIDSaDQajUajWSJaQGk0Go1Go9EsES2gNBqNRqPRaJaIFlAazYuQW265BSEEjz766OGeysuW8847j/POO+8FPcenPvUphBAv2Pjvete76OzsfMHGX4g9e/YghOCWW245bHPQaA4XWkBpNH9CJoTRxC0SibBmzRre//73MzAwcLinp3mZct555yGE4HWve92M5yZE0Be+8IXDMDON5qWLdbgnoNG8EvnMZz7DypUrKZfLPPDAA/z7v/87d911F08//TSxWOxwT09ziPj4xz/ORz/60cM9jUn+53/+h02bNnHiiScekvFWrFiB4zjYtn1IxtNoXkroCJRGcxi49NJLefvb38573vMebrnlFq699lp2797Nz372s8M9Nc0hxLIsIpHI4Z4GAMuXL6e2tpZPf/rTh2zMiSiqaZqHbEyN5qWCFlAazYuA888/H4Ddu3dP216pVLjuuutobGwkHo9zxRVXMDQ0NOP4X/ziF5x99tnE43GSySSXXXYZzzzzzLR93vWud5FIJOjp6eHyyy8nkUjQ2NjIhz/8YYIgmLZvsVjk+uuvp6Ojg3A4zNq1a/nCF76AUmrafkII3v/+9/OjH/2I9evXE41GOf3003nqqacA+PrXv87q1auJRCKcd9557NmzZ8bcH3roIS655BLS6TSxWIxzzz2X3//+99P2magl2rFjB+9617uoqakhnU5z9dVXUyqVpu3r+z6f/exnWbVqFeFwmM7OTv7v//2/VCqVed6BKoODg/zlX/4lzc3NRCIRjjvuOG699dYZ+42MjPCOd7yDVCpFTU0NV111FU888cSMeqC5aqC+853vcMoppxCLxaitreWcc87hV7/61eTzP/vZz7jssstoa2sjHA6zatUqPvvZz854n5ZCMpnkb//2b7njjjvYvHnzgvvv2rWLN77xjdTV1RGLxTjttNO48847p+0zWw1Uf38/V199NcuWLSMcDtPa2sqf/dmfzXjvF/OZ1WhezGgBpdG8CNi5cycA9fX107Z/4AMf4IknnuCGG27gr//6r7njjjt4//vfP22fb3/721x22WUkEgn++Z//mU984hNs2bKFs846a8aXVhAEXHzxxdTX1/OFL3yBc889ly9+8Yt84xvfmNxHKcXrX/96vvzlL3PJJZfwpS99ibVr1/KRj3yE6667bsbcf/e733H99ddz1VVX8alPfYpnn32W1772tdx88838y7/8C3/zN3/DRz7yER588EHe/e53Tzv2vvvu45xzziGXy3HDDTfwuc99jkwmw/nnn8/DDz8841xvetObyOfzfP7zn+dNb3oTt9xyy4yIynve8x4++clPcsIJJ/DlL3+Zc889l89//vO85S1vmfc9cByH8847j29/+9v8xV/8BTfeeCPpdJp3vetdfOUrX5ncT0rJ6173Or73ve9x1VVX8U//9E/09fVx1VVXzTv+BJ/+9Kd5xzvegW3bfOYzn+HTn/40HR0d3HfffZP73HLLLSQSCa677jq+8pWvcOKJJ/LJT37yoNOBH/rQh6itreVTn/rUvPsNDAxwxhln8Mtf/pK/+Zu/4Z/+6Z8ol8u8/vWv57bbbpv32CuvvJLbbruNq6++mn/7t3/jgx/8IPl8nr17907us5TPrEbzokVpNJo/Gd/61rcUoO655x41NDSkuru71fe//31VX1+votGo2rdv37T9LrzwQiWlnDz+b//2b5VpmiqTySillMrn86qmpka9973vnXae/v5+lU6np22/6qqrFKA+85nPTNv3+OOPVyeeeOLk49tvv10B6h//8R+n7ffnf/7nSgihduzYMbkNUOFwWO3evXty29e//nUFqJaWFpXL5Sa3/8M//IMCJveVUqojjzxSXXzxxdNeY6lUUitXrlQXXXTR5LYbbrhBAerd7373tDldccUVqr6+fvLx448/rgD1nve8Z9p+H/7whxWg7rvvvslt5557rjr33HMnH990000KUN/5zncmt7muq04//XSVSCQmX8tPfvITBaibbrppcr8gCNT555+vAPWtb31rxrwn2L59uzIMQ11xxRUqCIJpczzwGhzIX/3VX6lYLKbK5fLktquuukqtWLFixr4Hcu6556oNGzYopZT69Kc/rQC1adMmpZRSu3fvVoC68cYbJ/e/9tprFaB+97vfTW7L5/Nq5cqVqrOzc3LuE8dOvOaxsbEZYx3IUj6zGs2LGR2B0mgOAxdeeCGNjY10dHTwlre8hUQiwW233UZ7e/u0/d73vvdNSwGdffbZBEFAV1cXAP/7v/9LJpPhrW99K8PDw5M30zQ59dRTuf/++2ec+//8n/8z7fHZZ5/Nrl27Jh/fddddmKbJBz/4wWn7XX/99Sil+MUvfjFt+wUXXDBtKf2pp54KVCMRyWRyxvaJcz3++ONs376dt73tbYyMjEzOvVgscsEFF/Db3/4WKeWCcx8ZGSGXy03OHZgRKbv++usBZqSgpnLXXXfR0tLCW9/61slttm3zwQ9+kEKhwG9+8xsA7r77bmzb5r3vfe/kfoZhcM0118w59gS33347Uko++clPYhjT//xOfZ+j0ejkz/l8nuHhYc4++2xKpRJbt25d8DzzMRGFmq8W6q677uKUU07hrLPOmtyWSCR43/vex549e9iyZcusx0WjUUKhEL/+9a8ZGxubdZ/n85nVaF6M6FV4Gs1h4Oabb2bNmjVYlkVzczNr166d8YUK1cLfqdTW1gJMfjlt374d2F9DdSCpVGra40gkQmNj44wxp37ZdXV10dbWNk38ABx11FGTz883x3Q6DUBHR8es2w+c+3ypr2w2O/maZzvX1OuRSqXo6urCMAxWr149bb+WlhZqampmzH0qXV1dHHnkkTPehwNfd1dXF62trTNWSx54ztnYuXMnhmGwfv36efd75pln+PjHP8599903KQ4nyGazC55nPtLpNNdeey033HADjz322LTrO0FXV9ek4J3K1Gtx9NFHz3g+HA7zz//8z1x//fU0Nzdz2mmn8drXvpZ3vvOdtLS0AEv/zGo0L1a0gNJoDgOnnHIKJ5100oL7zbW6SY0Xc09EaL797W9PfkFNxbKm/4q/EKul5hpzsXO/8cYb2bhx46z7JhKJJY05wQtpXvlCk8lkOPfcc0mlUnzmM59h1apVRCIRNm/ezN///d/PiMo9Hz70oQ/x5S9/mU9/+tPcdNNNBz/pKVx77bW87nWv4/bbb+eXv/wln/jEJ/j85z/Pfffdx/HHH7/kz6xG82JFf1I1mpcwq1atAqCpqYkLL7zwkIy5YsUK7rnnHvL5/LQo1ETqaMWKFYfkPBNzT6VSh3TuUkq2b98+GS2BalF0JpOZd+4rVqzgySefREo5LQp14OtesWIF999/P6VSaVoUaseOHQvOb9WqVUgp2bJly5yi8de//jUjIyP89Kc/5ZxzzpncfuAKzYNhIgr1qU99atYI4IoVK3juuedmbF/sZ2DVqlVcf/31XH/99Wzfvp2NGzfyxS9+ke985zsvyGdWozkc6BoojeYlzMUXX0wqleJzn/scnufNeH42y4OFeM1rXkMQBPzrv/7rtO1f/vKXEUJw6aWXPu/5TuXEE09k1apVfOELX6BQKMx4/vnOHZgRVfnSl74EwGWXXTbvsf39/fzgBz+Y3Ob7Pl/96ldJJBKce+65QPWae57HN7/5zcn9pJTcfPPNC87v8ssvxzAMPvOZz8yIJE1E0SaibFOjaq7r8m//9m8Ljr8Urr32WmpqavjMZz4z47nXvOY1PPzwwzz44IOT24rFIt/4xjfo7OycMwVZKpUol8vTtq1atYpkMjlpI/FCfGY1msOBjkBpNC9hUqkU//7v/8473vEOTjjhBN7ylrfQ2NjI3r17ufPOOznzzDNnCKGFeN3rXserXvUqPvaxj7Fnzx6OO+44fvWrX/Gzn/2Ma6+9djKCcLAYhsF//Md/cOmll7Jhwwauvvpq2tvb6enp4f777yeVSnHHHXcsaczjjjuOq666im984xuTqbCHH36YW2+9lcsvv5xXvepVcx77vve9j69//eu8613vYtOmTXR2dvLjH/+Y3//+99x0002T0bjLL7+cU045heuvv54dO3awbt06fv7znzM6OgrMnz5cvXo1H/vYx/jsZz/L2WefzRve8AbC4TCPPPIIbW1tfP7zn+eMM86gtraWq666ig9+8IMIIfj2t789I015sKTTaT70oQ/NWkz+0Y9+lO9973tceumlfPCDH6Suro5bb72V3bt385Of/GTWej2Abdu2ccEFF/CmN72J9evXY1kWt912GwMDA5M2Ei/EZ1ajORxoAaXRvMR529veRltbG//v//0/brzxRiqVCu3t7Zx99tlcffXVSx7PMAx+/vOf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Vw5rQw92eijUb/C05yADM54Y8j3MVBrVryH5KkX+kyAIhyfFtqt3qb9/A2XwVWWPG2axWIxLL70Uj8dDRUUF9957735dr6CggGuuuYY5c+YwatQoTjrpJL72ta/x2muv5XWdE044geuuu44bbriBgoICysrKePDBB4nFYnz5y1/G6/Uybtw4nn766e5zDMPgiiuuYMyYMTidTiZMmMBPf/rT7v3JZJIpU6Zw1VVXdW/btGkTXq+X3/zmNwBs27aNs846i4KCAtxuN1OmTOGpp57K6fp33nknv/3tb3n88ceRJAlJknosivxpkHcPVGdnJ62trb2G59ra2ohEIgAEAgHSgwULwrCydB1JllG9TpH/JAjCocWyIBPP/fjjF8OfL+pnp5ndn+v1NBfkuKzW4sWLeeWVV3j88ccpLS3l9ttvZ9WqVcyYMaP7mKuvvppHHnlkwOtEo9E+t+/YsYPHHnuMBQsW5Nb2vfz2t7/lm9/8Ju+88w5/+ctfuOaaa/j73//Oueeey+23386SJUv4j//4DxoaGnC5XJimSXV1NX/9618pKirizTff5KqrrqKiooLzzz8fh8PBH/7wB4466ijOPPNMPvvZz3LJJZewcOFCLr/8ciBbTzGdTvPqq6/idrtZu3YtHo8HYNDr33LLLaxbt45IJMJDDz0E8KnLrR7SEN7ll1/Ovffey9y5cwFYvnw5t9xyC+eccw4A77zzDvX19cPaUGFgZjyJ7FBR/AGR/yQIwqElE4cfVA7f9foNrvpw+w6wuQc9LBqN8utf/5pHHnmEk046CcgGLbvXjN3trrvu4pZbbul+bZom0WgUj8eD3M/IwYUXXsjjjz9OIpHgrLPO4n//939zb/8u06dP59vf/jYAt912Gz/60Y8oLi7myiuvBOC73/0uv/zlL3nvvfc4+uij0TSN733ve93njxkzhrfeeotHH32U888/H4AZM2Zw991385WvfIUvfvGLbNu2jSeffLL7nIaGBj73uc8xbVq2OPTYsWO79w12fY/Hg9PpJJVKUV5envf7/STkHUD9v//3/7jxxhv54he/iK7r2YuoKpdddll3kc2JEycO6QcsDJ0RT+IocyG5AyL/SRAE4RO2adMm0uk0Rx11VPe2wsLC7slWu5WWllJaWtr92jRNIpEIPp+v3wBqyZIl3HHHHWzYsIHbbruNm266iQce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3++nuLiY73znOz3e2+jRo/n+97/PhRdeiNvtpqqqiqVLl/a4RkNDA4sWLcLj8eDz+Tj//PNpaWnp3v/uu+9y4okn4vV68fl8zJ49mxUrVnTvf/jhh6mtrcXlcnHuuefS0dEx5PfzaTCkQprCJ0BPQyYOehKQsrWe3MWYphPZb0OZdTq4PQe6lYIgCCMuoSc46o9H7dc1QqkQlz1zWd7nLbtoGS7NldOxixcv5pVXXuHxxx+ntLSU22+/nVWrVjFjxozuY66++moeeeSRAa8TjUa7v1+7di133XUXy5YtY/PmzXm3f7ff/va3XHHFFbzzzjusWLGCq666itraWq688sruY+655x5uv/12vve97/Hss8/yjW98g/r6ehYuXIhpmt3B0yuvvIKu61x77bVccMEFvPzyywBcfPHFzJw5k1/+8pcoisKaNWvQNA2AZcuWccUVV/DDH/6Qc845h2eeeYY77rhjyO/n00AEUJ8Wpgl6AtIJsHSQVbC5wV+VrfFk94LqwGxuRqusQBbBkyAIwqdGNBrl17/+NY888ggnnXQSkA1aqqurexx311139ehJMk2TaDSKx+NB3icdI5VKceGFF3LPPfdQW1u7XwFUTU0NS5YsQZIkJkyYwPvvv8+SJUt6BFDHHnsst956KwD19fW88cYbLFmyhIULF/Liiy/y/vvvs2XLFmpqagD43e9+x5QpU1i+fDlz586loaGBxYsXM3HiRADGjx/ffe2f/vSnnHbaaXzzm9/svv6bb77JM888M+T3dKCJAOpA05PQ1QySBKoTPKXZsgR2bzaAkpQeh1uZNFpJyQFqrCAIwifPqTpZdtGyvM75KPhRnz1Ovz3tt0wsnJjXvXOxadMm0uk0Rx21p6essLCQCRMm9DiutLSU0tLS7temaRKJRPD5fL0CqNtuu41JkyZxySWX5Nze/hx99NFIktT9et68edx7770YhoGiKN3b9jZv3rzumXvr1q2jpqamO3gCmDx5MoFAgHXr1jF37lxuuukmvvKVr/D73/+ek08+mS984QvU1dV1n3/uuef2uv7BHECJHKgDSXWAsxCKxkPlLKiZC+VTwber12mf4MlMpZBtNpRA4MC0VxAE4QCQJAmX5srry6E6suci9fjToTryus7eQcdwuPrqq/F4PN1fPp+P6upqfD5f97bd/v3vf/PXv/4VVVVRVbW7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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "# Render a matplotlib plot of the data.\n", + "fig, ax = plt.subplots(1, 1)\n", + "sinter.plot_error_rate(\n", + " ax=ax,\n", + " stats=samples,\n", + " group_func=lambda stat: f\"d={stat.json_metadata['d']}, {stat.decoder}\",\n", + " x_func=lambda stat: stat.json_metadata['p'],\n", + " failure_units_per_shot_func=lambda stats: stats.json_metadata['rounds'],\n", + " filter_func=lambda stat: stat.json_metadata['d'] < 5,\n", + ")\n", + "x_s = np.linspace(0.001, 0.029, 1000000)\n", + "y_s = np.linspace(0.001, 0.029, 1000000)\n", + "ax.set_yscale('log')\n", + "ax.plot(x_s, y_s, 'k-', alpha=0.75, zorder=0, label='x=y')\n", + "ax.grid()\n", + "ax.set_title('Phenomenological Noise')\n", + "ax.set_ylabel('Logical Error Probability (per shot)')\n", + "ax.set_xlabel('Physical Error Rate')\n", + "ax.legend(loc='lower right')\n", + "fig.savefig('pseudoth.svg')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-23T17:01:30.231605Z", + "start_time": "2024-04-23T17:01:29.029721Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlAAAAHHCAYAAABwaWYjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAADR3klEQVR4nOzdd3xb5fX48Y+2LMmWRxyPxI6zByGbhIQVRqCUUaCDUSBAofxadigte7albSCkpSl0fBmlpdBSoC1QCgkb0gIJYWWQPT3ioWFt3Xt/fzy2bMdLiu3YDuf9egnZV1dXj4VjHz/Pec4xGYZhIIQQQggh0mbu7wEIIYQQQgw2EkAJIYQQQmRIAighhBBCiAxJACWEEEIIkSEJoIQQQgghMiQBlBBCCCFEhiSAEkIIIYTIkARQQgghhBAZkgBKCCGEECJDEkAJMQA99thjmEwmPvzww/4eykFr/vz5zJ8/v09f484778RkMvXZ9S+66CIqKir67Prd2bZtGyaTiccee6zfxiBEf5EASogDqDkwar45nU7GjRvHlVdeSXV1dX8PTxyk5s+fj8lk4rTTTmv3WHMQdN999/XDyIQYvKz9PQAhvozuvvtuRo4cSTQa5Z133uGhhx7ipZde4rPPPsPlcvX38EQvufXWW7nxxhv7exgpL7zwAqtWrWLmzJm9cr0RI0YQiUSw2Wy9cj0hBhOZgRKiH5x88smcf/75XHrppTz22GNce+21bN26lX/84x/9PTTRi6xWK06ns7+HAUB5eTl5eXncddddvXbN5llUi8XSa9cUYrCQAEqIAeC4444DYOvWrW2Ox2IxFi1aRGFhIW63mzPPPJO9e/e2e/6///1vjjrqKNxuN9nZ2Zxyyil8/vnnbc656KKL8Hg87N69mzPOOAOPx0NhYSE/+MEP0DStzbmhUIjrr7+esrIyHA4H48eP57777sMwjDbnmUwmrrzySv72t78xadIksrKymDt3Lp9++ikAv/3tbxkzZgxOp5P58+ezbdu2dmP/3//+x1e+8hW8Xi8ul4tjjjmGd999t805zblEmzZt4qKLLiI3Nxev18vFF19MOBxuc24ymeSee+5h9OjROBwOKioquPnmm4nFYl38H1Bqamr4zne+Q1FREU6nk6lTp/L444+3O6+uro4LLriAnJwccnNzWbhwIR9//HG7fKDOcqD+9Kc/MXv2bFwuF3l5eRx99NG88sorqcf/8Y9/cMopp1BaWorD4WD06NHcc8897f4/ZSI7O5vrrruOf/3rX6xevbrb87ds2cI3v/lN8vPzcblcHH744bz44ottzukoB6qqqoqLL76Y4cOH43A4KCkp4Wtf+1q7//fpfM8KMZBJACXEALB582YACgoK2hy/6qqr+Pjjj7njjjv43ve+x7/+9S+uvPLKNuc88cQTnHLKKXg8Hn7+859z2223sXbtWo488sh2v7Q0TeOkk06ioKCA++67j2OOOYb777+f3/3ud6lzDMPg9NNP54EHHuArX/kKS5YsYfz48dxwww0sWrSo3djffvttrr/+ehYuXMidd97JunXrOPXUU1m2bBm/+tWv+P73v88NN9zAypUrueSSS9o897XXXuPoo48mEAhwxx138NOf/hSfz8dxxx3H+++/3+61vvWtbxEMBrn33nv51re+xWOPPdZuRuXSSy/l9ttvZ8aMGTzwwAMcc8wx3HvvvZxzzjld/j+IRCLMnz+fJ554gm9/+9ssXrwYr9fLRRddxC9/+cvUebquc9ppp/GXv/yFhQsX8pOf/ITKykoWLlzY5fWb3XXXXVxwwQXYbDbuvvtu7rrrLsrKynjttddS5zz22GN4PB4WLVrEL3/5S2bOnMntt9/e4+XAa665hry8PO68884uz6uurmbevHn85z//4fvf/z4/+clPiEajnH766Tz33HNdPvfrX/86zz33HBdffDG/+c1vuPrqqwkGg+zYsSN1Tibfs0IMWIYQ4oB59NFHDcBYvny5sXfvXmPnzp3GU089ZRQUFBhZWVnGrl272px3wgknGLqup55/3XXXGRaLxfD5fIZhGEYwGDRyc3ONyy67rM3rVFVVGV6vt83xhQsXGoBx9913tzl3+vTpxsyZM1OfP//88wZg/PjHP25z3je+8Q3DZDIZmzZtSh0DDIfDYWzdujV17Le//a0BGMXFxUYgEEgdv+mmmwwgda6u68bYsWONk046qc3XGA6HjZEjRxoLFixIHbvjjjsMwLjkkkvajOnMM880CgoKUp+vWbPGAIxLL720zXk/+MEPDMB47bXXUseOOeYY45hjjkl9vnTpUgMw/vSnP6WOxeNxY+7cuYbH40l9LX//+98NwFi6dGnqPE3TjOOOO84AjEcffbTduJtt3LjRMJvNxplnnmlomtZmjPu+B/u6/PLLDZfLZUSj0dSxhQsXGiNGjGh37r6OOeYY45BDDjEMwzDuuusuAzBWrVplGIZhbN261QCMxYsXp86/9tprDcB4++23U8eCwaAxcuRIo6KiIjX25uc2f80NDQ3trrWvTL5nhRjIZAZKiH5wwgknUFhYSFlZGeeccw4ej4fnnnuOYcOGtTnvu9/9bpsloKOOOgpN09i+fTsAr776Kj6fj3PPPZfa2trUzWKxMGfOHF5//fV2r/3//t//a/P5UUcdxZYtW1Kfv/TSS1gsFq6++uo2511//fUYhsG///3vNsePP/74Nlvp58yZA6iZiOzs7HbHm19rzZo1bNy4kfPOO4+6urrU2EOhEMcffzxvvfUWuq53O/a6ujoCgUBq7EC7mbLrr78eoN0SVGsvvfQSxcXFnHvuualjNpuNq6++msbGRt58800AXn75ZWw2G5dddlnqPLPZzBVXXNHptZs9//zz6LrO7bffjtnc9sdv6//PWVlZqY+DwSC1tbUcddRRhMNh1q9f3+3rdKV5FqqrXKiXXnqJ2bNnc+SRR6aOeTwevvvd77Jt2zbWrl3b4fOysrKw2+288cYbNDQ0dHjO/nzPCjEQyS48IfrBsmXLGDduHFarlaKiIsaPH9/uFyqoxN/W8vLyAFK/nDZu3Ai05FDtKycnp83nTqeTwsLCdtds/ctu+/btlJaWtgl+ACZOnJh6vKsxer1eAMrKyjo8vu/Yu1r68vv9qa+5o9dq/X7k5OSwfft2zGYzY8aMaXNecXExubm57cbe2vbt2xk7dmy7/w/7ft3bt2+npKSk3W7JfV+zI5s3b8ZsNjNp0qQuz/v888+59dZbee2111LBYTO/39/t63TF6/Vy7bXXcscdd/DRRx+1eX+bbd++PRXwttb6vZg8eXK7xx0OBz//+c+5/vrrKSoq4vDDD+fUU0/lwgsvpLi4GMj8e1aIgUoCKCH6wezZs5k1a1a353W2u8loSuZunqF54oknUr+gWrNa2/4T74vdUp1dM92xL168mGnTpnV4rsfjyeiazfqyeGVf8/l8HHPMMeTk5HD33XczevRonE4nq1ev5kc/+lG7Wbn9cc011/DAAw9w1113sXTp0p4PupVrr72W0047jeeff57//Oc/3Hbbbdx777289tprTJ8+PePvWSEGKvlOFWIQGz16NABDhw7lhBNO6JVrjhgxguXLlxMMBtvMQjUvHY0YMaJXXqd57Dk5Ob06dl3X2bhxY2q2BFRStM/n63LsI0aM4JNPPkHX9TazUPt+3SNGjOD1118nHA63mYXatGlTt+MbPXo0uq6zdu3aToPGN954g7q6Op599lmOPvro1PF9d2j2RPMs1J133tnhDOCIESPYsGFDu+Ppfg+MHj2a66+/nuuvv56NGzcybdo07r//fv70pz/1yfesEP1BcqCEGMROOukkcnJy+OlPf0oikWj3eEclD7rz1a9+FU3T+PWvf93m+AMPPIDJZOLkk0/e7/G2NnPmTEaPHs19991HY2Nju8f3d+xAu1mVJUuWAHDKKad0+dyqqiqefvrp1LFkMsmDDz6Ix+PhmGOOAdR7nkgk+P3vf586T9d1li1b1u34zjjjDMxmM3fffXe7maTmWbTmWbbWs2rxeJzf/OY33V4/E9deey25ubncfffd7R776le/yvvvv8/KlStTx0KhEL/73e+oqKjodAkyHA4TjUbbHBs9ejTZ2dmpMhJ98T0rRH+QGSghBrGcnBweeughLrjgAmbMmME555xDYWEhO3bs4MUXX+SII45oFwh157TTTuPYY4/llltuYdu2bUydOpVXXnmFf/zjH1x77bWpGYSeMpvN/OEPf+Dkk0/mkEMO4eKLL2bYsGHs3r2b119/nZycHP71r39ldM2pU6eycOFCfve736WWwt5//30ef/xxzjjjDI499thOn/vd736X3/72t1x00UWsWrWKiooKnnnmGd59912WLl2amo0744wzmD17Ntdffz2bNm1iwoQJ/POf/6S+vh7oevlwzJgx3HLLLdxzzz0cddRRnHXWWTgcDj744ANKS0u59957mTdvHnl5eSxcuJCrr74ak8nEE0880W6Zsqe8Xi/XXHNNh8nkN954I3/5y184+eSTufrqq8nPz+fxxx9n69at/P3vf+8wXw/giy++4Pjjj+db3/oWkyZNwmq18txzz1FdXZ0qI9EX37NC9AcJoIQY5M477zxKS0v52c9+xuLFi4nFYgwbNoyjjjqKiy++OOPrmc1m/vnPf3L77bfz9NNP8+ijj1JRUcHixYtTu9l6y/z581m5ciX33HMPv/71r2lsbKS4uJg5c+Zw+eWX79c1//CHPzBq1Cgee+wxnnvuOYqLi7npppu44447unxeVlYW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+c8HXCB1zTXX8Mc//rG/hyGEEEKIg4Q1nZO+/vWvc8MNN/DMM8+Qm5vb6XkrV67kl7/8Jffffz8333xzb42xx+bPn88bb7zR38MQQgghxEEirRmoL774gu9///tdBk8Ac+fO5amnnuKGG25IewBvvfUWp512GqWlpZhMJp5//vl25yxbtoyKigqcTidz5szh/fffT/v6QgghhBC9La0AymazpT7+4x//2OESXTweTy2TtT6/O6FQiKlTp7Js2bIOH3/66adZtGgRd9xxB6tXr2bq1KmcdNJJ1NTUpM6ZNm0akydPbnfbs2dP2uMQQgghhEhXWkt4rV188cV85StfYejQoW2OB4NBLr74Yi688MKMrnfyySdz8sknd/r4kiVLuOyyy7j44osBePjhh3nxxRd55JFHuPHGGwFYs2ZNZl9EF2KxWJsAMRAIAJBIJEgkEqnjzR+3PiYyI+9hz8j713PyHvaMvH89J+9hz3T1/vX1e5pxAGUYBiaTqd3xXbt24fV6e2VQzeLxOKtWreKmm25KHTObzZxwwgmsXLmyV1+r2b333stdd93V7vgrr7yCy+Vqd/zVV1/tk3F8mch72DPy/vWcvIc9I+9fz8l72DMdvX/hcLhPXzPtAGr69OmYTCZMJhPHH388VmvLUzVNY+vWrXzlK1/p1cHV1taiaRpFRUVtjhcVFbF+/fq0r3PCCSfw8ccfEwqFGD58OH/729+YO3duh+fedNNNLFq0KPV5IBCgrKyME088kZycnNTxRCLBq6++yoIFCzJashQt5D3sGXn/ek7ew56R96/n5D3sma7ev+YVpL6SdgB1xhlnAGq57KSTTsLj8aQes9vtVFRU8PWvf73XB9gbli9fnva5DocDh8PR7rjNZuvwm7uz4yJ98h72jLx/PSfvYc/I+9dz8h72TEfvX1+/n2kHUHfccQcAFRUVnH322Tidzj4bVLMhQ4ZgsViorq5uc7y6upri4uI+fe1ly5axbNkyNE3r09cRQgghxOCTcSuXhQsX4nQ6WbVqFX/605/405/+xEcffdQXY8NutzNz5kxWrFiROqbrOitWrOh0Ca63XHHFFaxdu5YPPvigT19HCCGEEINPxknkNTU1nHPOObzxxhupulA+n49jjz2Wp556isLCwoyu19jYyKZNm1Kfb926lTVr1pCfn095eTmLFi1i4cKFzJo1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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "# Render a matplotlib plot of the data.\n", + "fig, ax = plt.subplots(1, 1)\n", + "sinter.plot_error_rate(\n", + " ax=ax,\n", + " stats=samples,\n", + " group_func=lambda stat: f\"d={stat.json_metadata['d']}, {stat.decoder}\",\n", + " x_func=lambda stat: stat.json_metadata['p'],\n", + " failure_units_per_shot_func=lambda stats: stats.json_metadata['rounds'],\n", + " filter_func=lambda stat: stat.json_metadata['d'] > 4,\n", + ")\n", + "x_s = np.linspace(0.001, 0.029, 1000000)\n", + "y_s = np.linspace(0.001, 0.029, 1000000)\n", + "ax.set_yscale('log')\n", + "ax.plot(x_s, y_s, 'k-', alpha=0.75, zorder=0, label='x=y')\n", + "ax.grid()\n", + "ax.set_title('Phenomenological Noise')\n", + "ax.set_ylabel('Logical Error Probability (per shot)')\n", + "ax.set_xlabel('Physical Error Rate')\n", + "ax.set_ylim(0.00001, 1)\n", + "ax.legend(loc='lower right')\n", + "fig.savefig('no-pseudoth.svg')" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-23T17:43:50.463968Z", + "start_time": "2024-04-23T17:43:47.961663Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "# Render a matplotlib plot of the data.\n", + "fig, ax = plt.subplots(1, 2, sharey=True, figsize=(12,5))\n", + "sinter.plot_error_rate(\n", + " ax=ax[0],\n", + " stats=samples,\n", + " group_func=lambda stat: f\"d={stat.json_metadata['d']}, {stat.decoder}\",\n", + " x_func=lambda stat: stat.json_metadata['p'],\n", + " failure_units_per_shot_func=lambda stats: stats.json_metadata['rounds'],\n", + " filter_func=lambda stat: stat.json_metadata['d'] < 5,\n", + ")\n", + "x_s = np.linspace(0.001, 0.029, 1000000)\n", + "y_s = np.linspace(0.001, 0.029, 1000000)\n", + "ax[0].set_yscale('log')\n", + "ax[0].plot(x_s, y_s, 'k-', alpha=0.75, zorder=0, label='x=y')\n", + "ax[0].grid()\n", + "ax[0].set_ylabel('Logical Error Probability (per shot)')\n", + "ax[0].set_xlabel('Physical Error Rate')\n", + "ax[0].legend(loc='lower right')\n", + "\n", + "# Render a matplotlib plot of the data.\n", + "sinter.plot_error_rate(\n", + " ax=ax[1],\n", + " stats=samples,\n", + " group_func=lambda stat: f\"d={stat.json_metadata['d']}, {stat.decoder}\",\n", + " x_func=lambda stat: stat.json_metadata['p'],\n", + " failure_units_per_shot_func=lambda stats: stats.json_metadata['rounds'],\n", + " filter_func=lambda stat: stat.json_metadata['d'] > 4,\n", + ")\n", + "x_s = np.linspace(0.001, 0.029, 1000000)\n", + "y_s = np.linspace(0.001, 0.029, 1000000)\n", + "ax[1].set_yscale('log')\n", + "ax[1].plot(x_s, y_s, 'k-', alpha=0.75, zorder=0, label='x=y')\n", + "ax[1].grid()\n", + "#ax[1].set_ylabel('Logical Error Probability (per shot)')\n", + "ax[1].set_xlabel('Physical Error Rate')\n", + "ax[1].set_ylim(0.00001, 1)\n", + "ax[1].legend(loc='lower right')\n", + "\n", + "fig.savefig('pseudoth.svg')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/mqt/qecc/cc_decoder/plots.py b/src/mqt/qecc/cc_decoder/plotting/plots.py similarity index 91% rename from src/mqt/qecc/cc_decoder/plots.py rename to src/mqt/qecc/cc_decoder/plotting/plots.py index 28a87fcb..19b9d041 100644 --- a/src/mqt/qecc/cc_decoder/plots.py +++ b/src/mqt/qecc/cc_decoder/plotting/plots.py @@ -196,7 +196,6 @@ def generate_plots(results_dir: Path, results_file: Path) -> None: def generate_plots_tn(results_dir: Path, results_file: Path) -> None: - """Generate the plots for the tensor network decoder.""" # read in all generated data data = [] for file in results_dir.glob("*.json"): @@ -204,7 +203,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: data.append(json.loads(f.read())) # prepare code to per,ler map and print - code_to_xys: dict[float, Any] = {} + code_to_xys = {} for run in data: xys = code_to_xys.setdefault(run["n_k_d"][-1], []) xys.append((run["physical_error_rate"], run["logical_failure_rate"])) @@ -212,7 +211,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: for xys in code_to_xys.values(): xys.sort(key=lambda xy: xy[0]) - _, ax = plt.subplots(2, 2, figsize=(12, 10)) + fig, ax = plt.subplots(2, 2, figsize=(12, 10)) # add data for code, xys in sorted(code_to_xys.items()): ax[0][0].plot(*zip(*xys), "x-", label=f"d={code}") @@ -233,31 +232,56 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: for code, xys in sorted(code_to_xys.items()): ax[1][0].plot(*zip(*xys), "x-", label=f"d={code}") ax[1][0].set_xlabel("Physical error rate") - ax[1][0].set_ylabel("Average time per run (microseconds)") + ax[1][0].set_ylabel("Average time per run (µs)") ax[1][0].legend() ax[1][0].set_ylim(0, 300000) ds = [] - p_data: dict[float, Any] = {} - pers = [0.001, 0.021, 0.051, 0.081, 0.111] - for d, cdata in sorted(code_to_xys.items()): + p_data = {} + pers = [ 0.051, 0.081, 0.111] # 0.001, 0.021, + for d, data in sorted(code_to_xys.items()): ds.append(d) - for p, t in cdata: + for idx,(p,t) in enumerate(data): if p in pers: if p not in p_data: p_data[p] = {"d": [], "t": []} p_data[p]["d"].append(d) p_data[p]["t"].append(t) - for p, pdata in sorted(p_data.items()): - ax[1][1].plot(ds, pdata["t"], label="p=" + str(p)) + + for p, data in sorted(p_data.items()): + ax[1][1].plot(ds, data["t"], label="p=" + str(p)) ax[1][1].set_xlabel("Distance") - ax[1][1].set_ylabel("Average time per run (microseconds)") + ax[1][1].set_ylabel("Average time per run (µs)") ax[1][1].legend() - # ax[1][1].set_yscale("log") + ax[1][1].set_yscale("log") ax[1][1].set_xticks(ds) ax[1][1].set_ylim(0, 300000) + + data = [] + for file in results_dir.glob("*.json"): + with file.open() as f: + data.append(json.loads(f.read())) + metrics = {} + per_metrics = {} + # save plot as vector graphic + for result in data: + d = result["n_k_d"][2] + p = result['physical_error_rate'] + + if d not in metrics: + metrics[d] = { + "p": [], + "logical_error_rate": [], + } + if p not in per_metrics: + per_metrics[p] = {} + + metrics[d]["p"].append(p) + metrics[d]["logical_error_rate"].append(result["logical_failure_rate"]) + print(f"chi = {data[0]['decoder']}") + calculate_threshold(code_dict=metrics, ax=ax[0][1], title="Threshold") plt.savefig(results_file, bbox_inches="tight") diff --git a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py b/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py new file mode 100644 index 00000000..26ff4358 --- /dev/null +++ b/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py @@ -0,0 +1,70 @@ +import numpy as np +import sinter +import matplotlib.pyplot as plt +from mqt.qecc.cc_decoder.stim_interface.color_code_stim import gen_pcm_and_logical, gen_stim_circuit_memory_experiment +from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import sinter_decoders + + +def generate_example_tasks(): + for p in np.arange(0.001, 0.03, 0.001): + for d in [3,4,5]: + pcm, l_op = gen_pcm_and_logical(d) + cc_circuit = gen_stim_circuit_memory_experiment(pcm, l_op, d, p) + yield sinter.Task( + circuit=cc_circuit, + detector_error_model=cc_circuit.detector_error_model( + decompose_errors=False), + json_metadata={ + 'p': p, + 'd': d, + 'rounds': d, + }, + ) + + +def main(): + samples = sinter.collect( + num_workers=10, + max_shots=10_000, + max_errors=500, + tasks=generate_example_tasks(), + decoders=['maxsat', 'bposd'], + custom_decoders=sinter_decoders(), + + print_progress=True, + save_resume_filepath=f'pseudothreshold_plot.csv', + ) + + # Print samples as CSV data. + print(sinter.CSV_HEADER) + for sample in samples: + print(sample.to_csv_line()) + + # Render a matplotlib plot of the data. + fig, ax = plt.subplots(1, 1) + sinter.plot_error_rate( + ax=ax, + stats=samples, + group_func=lambda stat: f"Color Code d={stat.json_metadata['d']} dec={stat.decoder}", + x_func=lambda stat: stat.json_metadata['p'], + failure_units_per_shot_func=lambda stats: stats.json_metadata['rounds'], + filter_func=lambda stat: stat.json_metadata['d'] > 2, + ) + x_s = np.linspace(0.001, 0.029, 1000000) + y_s = np.linspace(0.001, 0.029, 1000000) + ax.set_yscale('log') + ax.plot(x_s, y_s, 'k-', alpha=0.75, zorder=0, label='x=y') + + ax.grid() + ax.set_title('Phenomenological Noise') + ax.set_ylabel('Logical Error Probability (per shot)') + ax.set_xlabel('Physical Error Rate') + ax.legend() + + # Save to file and also open in a window. + fig.savefig('plot.png') + plt.show() + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/src/mqt/qecc/cc_decoder/stim_interface/__init__.py b/src/mqt/qecc/cc_decoder/stim_interface/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py new file mode 100644 index 00000000..de2cd8b8 --- /dev/null +++ b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py @@ -0,0 +1,92 @@ +import stim +import itertools as it +import numpy as np + + + +def neighbors(perm): + node_sw = (perm[0]+1, perm[1], perm[2]-1) + node_se = (perm[0], perm[1]+1, perm[2]-1) + node_e = (perm[0]-1, perm[1]+1, perm[2]) + node_ne = (perm[0]-1, perm[1], perm[2]+1) + node_nw = (perm[0], perm[1]-1, perm[2]+1) + node_w = (perm[0]+1, perm[1]-1, perm[2]) + return [node_sw, node_se, node_e, node_ne, node_nw, node_w] + + +def gen_pcm_and_logical(distance): + lattice_points_to_qubit_index, ancilla_qubit_to_lattice_points = {}, {} + qubit_count, ancilla_qubit_count = 0, 0 + logical_operator = set() + t = (distance-1)//2 + + for comb in it.product(range(3*t+1), repeat=3): + if sum(comb) == 3 * t: + if (comb[1]-comb[0]) % 3 == 1: + ancilla_qubit_to_lattice_points[ancilla_qubit_count] = comb + ancilla_qubit_count += 1 + else: + lattice_points_to_qubit_index[comb] = qubit_count + if comb[2] == 0: + logical_operator.add(qubit_count) + qubit_count += 1 + + parity_check_matrix = np.zeros( + (ancilla_qubit_count, qubit_count), dtype=bool) + + for ancilla_qubit, lattice_point in ancilla_qubit_to_lattice_points.items(): + for neighbor in neighbors(lattice_point): + if neighbor in lattice_points_to_qubit_index: + qubit = lattice_points_to_qubit_index[neighbor] + parity_check_matrix[ancilla_qubit, qubit] = True + print(qubit_count, ancilla_qubit_count) + return (parity_check_matrix, logical_operator) + + +def add_checks_one_round(pcm, circuit, detectors, error_probability): + for check in pcm: + if error_probability == 0: + mpp_X_instruction = f"MPP " + mpp_Z_instruction = f"MPP " + else: + mpp_X_instruction = f"MPP({error_probability}) " + mpp_Z_instruction = f"MPP({error_probability}) " + for q in np.where(check)[0]: + mpp_X_instruction += "X"+str(q)+"*" + mpp_Z_instruction += "Z"+str(q)+"*" + # circuit.append_from_stim_program_text(mpp_X_instruction[:-1]) + circuit.append_from_stim_program_text(mpp_Z_instruction[:-1]) + if detectors is True: + for q in range(len(pcm)): + circuit.append( + # "DETECTOR", [stim.target_rec(-1*q-1), stim.target_rec(-1*q-2*len(pcm)-1)]) + "DETECTOR", [stim.target_rec(-1*q-1), stim.target_rec(-1*q-len(pcm)-1)]) + return circuit + + +def gen_stim_circuit_memory_experiment(pcm, logical_operator, distance, error_probability): + data_qubits = range(len(pcm[0])) + circuit = stim.Circuit() + circuit.append("R", data_qubits) + + # initialization + circuit = add_checks_one_round(pcm, circuit, False, 0) + + # rounds of QEC + for i in range(distance): + circuit.append("X_ERROR", data_qubits, error_probability) + # circuit.append("DEPOLARIZE1", data_qubits, error_probability) + circuit = add_checks_one_round(pcm, circuit, True, error_probability) + + # logical measurement + + circuit = add_checks_one_round(pcm, circuit, True, 0) + + log_measurement_instruction = "MPP " + for q in logical_operator: + log_measurement_instruction += "Z"+str(q)+"*" + circuit.append_from_stim_program_text(log_measurement_instruction[:-1]) + + circuit.append("OBSERVABLE_INCLUDE", [stim.target_rec(-1)], (0)) + + return (circuit) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py new file mode 100644 index 00000000..0c83c68d --- /dev/null +++ b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py @@ -0,0 +1,172 @@ +# Author: Oscar Higgott https://github.com/oscarhiggott/stimbposd/blob/main/src/stimbposd/dem_to_matrices.py +from typing import List, FrozenSet, Dict, Tuple +from dataclasses import dataclass + +from scipy.sparse import csc_matrix +import numpy as np + +import stim + + +def iter_set_xor(set_list: List[List[int]]) -> FrozenSet[int]: + out = set() + for x in set_list: + s = set(x) + out = (out - s) | (s - out) + return frozenset(out) + + +def dict_to_csc_matrix( + elements_dict: Dict[int, FrozenSet[int]], shape: Tuple[int, int] +) -> csc_matrix: + """ + Constructs a `scipy.sparse.csc_matrix` check matrix from a dictionary `elements_dict` giving the indices of nonzero + rows in each column. + + Parameters + ---------- + elements_dict : dict[int, frozenset[int]] + A dictionary giving the indices of nonzero rows in each column. `elements_dict[i]` is a frozenset of ints + giving the indices of nonzero rows in column `i`. + shape : Tuple[int, int] + The dimensions of the matrix to be returned + + Returns + ------- + scipy.sparse.csc_matrix + The `scipy.sparse.csc_matrix` check matrix defined by `elements_dict` and `shape` + """ + nnz = sum(len(v) for k, v in elements_dict.items()) + data = np.ones(nnz, dtype=np.uint8) + row_ind = np.zeros(nnz, dtype=np.int64) + col_ind = np.zeros(nnz, dtype=np.int64) + i = 0 + for col, v in elements_dict.items(): + for row in v: + row_ind[i] = row + col_ind[i] = col + i += 1 + return csc_matrix((data, (row_ind, col_ind)), shape=shape) + + +@dataclass +class DemMatrices: + check_matrix: csc_matrix + observables_matrix: csc_matrix + edge_check_matrix: csc_matrix + edge_observables_matrix: csc_matrix + hyperedge_to_edge_matrix: csc_matrix + priors: np.ndarray + + +def detector_error_model_to_check_matrices( + dem: stim.DetectorErrorModel, allow_undecomposed_hyperedges: bool = True +) -> DemMatrices: + """ + Convert a `stim.DetectorErrorModel` into a `DemMatrices` object. + + Parameters + ---------- + dem : stim.DetectorErrorModel + A stim DetectorErrorModel + allow_undecomposed_hyperedges: bool + If True, don't raise an exception if a hyperedge is not decomposable. Instead, the hyperedge `h` is still added + to the `DemMatrices.check_matrix`, `DemMatrices.observables_matrix` and `DemMatrices.priors` but it will not + have any edges in its decomposition in `DemMatrices.hyperedge_to_edge_matrix[:, h]`. + Returns + ------- + DemMatrices + A collection of matrices representing the stim DetectorErrorModel + """ + hyperedge_ids: Dict[FrozenSet[int], int] = {} + edge_ids: Dict[FrozenSet[int], int] = {} + hyperedge_obs_map: Dict[int, FrozenSet[int]] = {} + edge_obs_map: Dict[int, FrozenSet[int]] = {} + priors_dict: Dict[int, float] = {} + hyperedge_to_edge: Dict[int, FrozenSet[int]] = {} + + def handle_error( + prob: float, detectors: List[List[int]], observables: List[List[int]] + ) -> None: + hyperedge_dets = iter_set_xor(detectors) + hyperedge_obs = iter_set_xor(observables) + + if hyperedge_dets not in hyperedge_ids: + hyperedge_ids[hyperedge_dets] = len(hyperedge_ids) + priors_dict[hyperedge_ids[hyperedge_dets]] = 0.0 + hid = hyperedge_ids[hyperedge_dets] + hyperedge_obs_map[hid] = hyperedge_obs + priors_dict[hid] = priors_dict[hid] * (1 - prob) + prob * (1 - priors_dict[hid]) + + eids = [] + for i in range(len(detectors)): + e_dets = frozenset(detectors[i]) + e_obs = frozenset(observables[i]) + + if len(e_dets) > 2: + if not allow_undecomposed_hyperedges: + raise ValueError( + "A hyperedge error mechanism was found that was not decomposed into edges. " + "This can happen if you do not set `decompose_errors=True` as required when " + "calling `circuit.detector_error_model`." + ) + else: + continue + + if e_dets not in edge_ids: + edge_ids[e_dets] = len(edge_ids) + eid = edge_ids[e_dets] + eids.append(eid) + edge_obs_map[eid] = e_obs + + if hid not in hyperedge_to_edge: + hyperedge_to_edge[hid] = frozenset(eids) + + for instruction in dem.flattened(): + if instruction.type == "error": + dets: List[List[int]] = [[]] + frames: List[List[int]] = [[]] + t: stim.DemTarget + p = instruction.args_copy()[0] + for t in instruction.targets_copy(): + if t.is_relative_detector_id(): + dets[-1].append(t.val) + elif t.is_logical_observable_id(): + frames[-1].append(t.val) + elif t.is_separator(): + dets.append([]) + frames.append([]) + handle_error(p, dets, frames) + elif instruction.type == "detector": + pass + elif instruction.type == "logical_observable": + pass + else: + raise NotImplementedError() + check_matrix = dict_to_csc_matrix( + {v: k for k, v in hyperedge_ids.items()}, + shape=(dem.num_detectors, len(hyperedge_ids)), + ) + observables_matrix = dict_to_csc_matrix( + hyperedge_obs_map, shape=(dem.num_observables, len(hyperedge_ids)) + ) + priors = np.zeros(len(hyperedge_ids)) + for i, p in priors_dict.items(): + priors[i] = p + hyperedge_to_edge_matrix = dict_to_csc_matrix( + hyperedge_to_edge, shape=(len(edge_ids), len(hyperedge_ids)) + ) + edge_check_matrix = dict_to_csc_matrix( + {v: k for k, v in edge_ids.items()}, shape=(dem.num_detectors, len(edge_ids)) + ) + edge_observables_matrix = dict_to_csc_matrix( + edge_obs_map, shape=(dem.num_observables, len(edge_ids)) + ) + return DemMatrices( + check_matrix=check_matrix, + observables_matrix=observables_matrix, + edge_check_matrix=edge_check_matrix, + edge_observables_matrix=edge_observables_matrix, + hyperedge_to_edge_matrix=hyperedge_to_edge_matrix, + priors=priors, + ) \ No newline at end of file diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py new file mode 100644 index 00000000..4ce63f25 --- /dev/null +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -0,0 +1,123 @@ +import pathlib +from typing import Dict +from sinter import Decoder, CompiledDecoder +import numpy as np +from stimbposd import SinterDecoder_BPOSD + +import stim + +from mqt.qecc.cc_decoder.stim_interface.max_sat_stim_decoder import MaxSatStim + + +class SinterCompiledDecoder_MAXSAT(CompiledDecoder): + def __init__(self, decoder: "MAXSAT", **kwargs): + self.decoder = decoder + + if kwargs: + self.convergence_cnt = 0 + self.not_convergence_cnt = 0 + self.d = kwargs["d"] + self.p = kwargs["p"] + self.measure_convergence = True + else: + self.measure_convergence = False + + + def decode_shots_bit_packed( + self, + *, + bit_packed_detection_event_data: "np.ndarray", + ) -> "np.ndarray": + predictions, converged_cnt, not_converged_cnt =self.decoder.decode_batch( + shots=bit_packed_detection_event_data, + bit_packed_shots=True, + bit_packed_predictions=True, + ) + if self.measure_convergence: + self.convergence_cnt += converged_cnt + self.not_convergence_cnt += not_converged_cnt + with open('convergence_rate.txt', 'a') as self.f: + self.f.write(str(self.d) + ' ' + str(self.p) + ' ' + str(self.convergence_cnt) + ' ' + str(self.not_convergence_cnt) + '\n') + + return predictions + + +class SinterDecoder_MAXSAT(Decoder): + def __init__( + self, + **maxsat_kwargs, + ): + self.maxsat_kwargs = maxsat_kwargs + + + def compile_decoder_for_dem( + self, *, dem: stim.DetectorErrorModel + ) -> CompiledDecoder: + maxsat = MaxSatStim( + model=dem, +# **self.maxsat_kwargs, + ) + return SinterCompiledDecoder_MAXSAT(maxsat, **self.maxsat_kwargs) + + def decode_via_files( + self, + *, + num_shots: int, + num_dets: int, + num_obs: int, + dem_path: pathlib.Path, + dets_b8_in_path: pathlib.Path, + obs_predictions_b8_out_path: pathlib.Path, + tmp_dir: pathlib.Path, + ) -> None: + """Performs decoding by reading problems from, and writing solutions to, file paths. + Args: + num_shots: The number of times the circuit was sampled. The number of problems + to be solved. + num_dets: The number of detectors in the circuit. The number of detection event + bits in each shot. + num_obs: The number of observables in the circuit. The number of predicted bits + in each shot. + dem_path: The file path where the detector error model should be read from, + e.g. using `stim.DetectorErrorModel.from_file`. The error mechanisms + specified by the detector error model should be used to configure the + decoder. + dets_b8_in_path: The file path that detection event data should be read from. + Note that the file may be a named pipe instead of a fixed size object. + The detection events will be in b8 format (see + https://github.com/quantumlib/Stim/blob/main/doc/result_formats.md ). The + number of detection events per shot is available via the `num_dets` + argument or via the detector error model at `dem_path`. + obs_predictions_b8_out_path: The file path that decoder predictions must be + written to. The predictions must be written in b8 format (see + https://github.com/quantumlib/Stim/blob/main/doc/result_formats.md ). The + number of observables per shot is available via the `num_obs` argument or + via the detector error model at `dem_path`. + tmp_dir: Any temporary files generated by the decoder during its operation MUST + be put into this directory. The reason for this requirement is because + sinter is allowed to kill the decoding process without warning, without + giving it time to clean up any temporary objects. All cleanup should be done + via sinter deleting this directory after killing the decoder. + """ + dem = stim.DetectorErrorModel.from_file(dem_path) + max_sat = MaxSatStim( + model=dem, + **self.maxsat_kwargs, + ) + shots = stim.read_shot_data_file( + path=dets_b8_in_path, + format="b8", + num_detectors=dem.num_detectors, + bit_packed=False, + ) + predictions, _, _ = max_sat.decode_batch(shots) + stim.write_shot_data_file( + data=predictions, + path=obs_predictions_b8_out_path, + format="b8", + num_observables=dem.num_observables, + ) + + +def sinter_decoders(**kwargs) -> Dict[str, Decoder]: + return {"maxsat": SinterDecoder_MAXSAT(**kwargs), "bposd": SinterDecoder_BPOSD()} \ No newline at end of file diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py new file mode 100644 index 00000000..110bbc48 --- /dev/null +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -0,0 +1,112 @@ +from mqt.qecc.cc_decoder.max_sat_decoder import LightsOut +import numpy as np +from mqt.qecc.cc_decoder.stim_interface.dem_to_matrices import detector_error_model_to_check_matrices +import stim + + +class MaxSatStim: + def __init__( + self, + model: stim.DetectorErrorModel, + timeout=1000 + ): + f"""Class for decoding stim circuits using the LightsOut MaxSAT decoder. + Parameters + ---------- + model : stim.DetectorErrorModel + The detector error model of the stim circuit to be decoded + """ + self._matrices = detector_error_model_to_check_matrices( + model, allow_undecomposed_hyperedges=True + ) + self.num_detectors = model.num_detectors + self.num_errors = model.num_errors + qtf, ftq = self.check_matrix_to_adj_lists(self._matrices.check_matrix) + self.problem = LightsOut(ftq, qtf) + self.observables = self._matrices.observables_matrix + self.problem.preconstruct_z3_instance(weights=[self.weight_function(p) for p in self._matrices.priors]) + + def check_matrix_to_adj_lists(self, check_matrix) -> tuple[dict, dict]: + qtf = {} + ftq = {} + for row in range(check_matrix.shape[0]): + for col in range(check_matrix.shape[1]): + if check_matrix[row, col] == 1: + if row not in ftq: + ftq[row] = [] + if col not in qtf: + qtf[col] = [] + qtf[col].append(row) + ftq[row].append(col) + return qtf, ftq + + def weight_function(self, x): + return np.log((1 - x) / x) + + def decode(self, syndrome: np.ndarray) -> np.ndarray: + """ + Decode the syndrome and return a prediction of which observables were flipped + + Parameters + ---------- + syndrome : np.ndarray + A single shot of syndrome data. This should be a binary array with a length equal to the + number of detectors in the `stim.Circuit` or `stim.DetectorErrorModel`. E.g. the syndrome might be + one row of shot data sampled from a `stim.CompiledDetectorSampler`. + + Returns + ------- + np.ndarray + A binary numpy array `predictions` which predicts which observables were flipped. + Its length is equal to the number of observables in the `stim.Circuit` or `stim.DetectorErrorModel`. + `predictions[i]` is 1 if the decoder predicts observable `i` was flipped and 0 otherwise. + """ + lights = [bool(b) for b in syndrome] + estimate, converge, _ = self.problem.solve(lights) + if converge == False: + convergence_bool = 0 + else: + convergence_bool = 1 + return (self._matrices.observables_matrix @ estimate) % 2, convergence_bool + + def decode_batch( + self, + shots: np.ndarray, + *, + bit_packed_shots: bool = False, + bit_packed_predictions: bool = False, + ) -> np.ndarray: + """ + Decode a batch of shots of syndrome data. This is just a helper method, equivalent to iterating over each + shot and calling `BPOSD.decode` on it. + + Parameters + ---------- + shots : np.ndarray + A binary numpy array of dtype `np.uint8` or `bool` with shape `(num_shots, num_detectors)`, where + here `num_shots` is the number of shots and `num_detectors` is the number of detectors in the `stim.Circuit` or `stim.DetectorErrorModel`. + + Returns + ------- + np.ndarray + A 2D numpy array `predictions` of dtype bool, where `predictions[i, :]` is the output of + `self.decode(shots[i, :])`. + """ + not_converged_cnt = 0 + converged_cnt = 0 + if bit_packed_shots: + shots = np.unpackbits(shots, axis=1, bitorder="little")[ + :, : self.num_detectors + ] + predictions = np.zeros( + (shots.shape[0], self._matrices.observables_matrix.shape[0]), dtype=bool + ) + for i in range(shots.shape[0]): + predictions[i, :], convergence_bool = self.decode(shots[i, :]) + if convergence_bool == 1: + converged_cnt += 1 + else: + not_converged_cnt += 1 + if bit_packed_predictions: + predictions = np.packbits(predictions, axis=1, bitorder="little") + return predictions, converged_cnt, not_converged_cnt From 3c97be9b0c0b86635c7a11bc276f6914ba7c8c3c Mon Sep 17 00:00:00 2001 From: lucas Date: Tue, 14 May 2024 12:23:19 +0200 Subject: [PATCH 02/79] readme update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 77b1a925..4b93a778 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ decoder.run(distance=d, error_rate=p, nr_sims=nr_sims) ``` The dataset used in the paper evaluation on decoding quantum color codes is available on Zenodo: -[![a](https://img.shields.io/static/v1?label=DOI&message=10.5281/zenodo.7760135&color=inactive&style=flat-square)](https://doi.org/10.5281/zenodo.7760135) +[![a](https://img.shields.io/static/v1?label=DOI&message=10.5281/zenodo.7760134&color=inactive&style=flat-square)](https://doi.org/10.5281/zenodo.7760134) ### Example for applying error correction to a circuit From 93d6af43e4e212098dc10a35eabd149372eaf82c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 13:46:32 +0000 Subject: [PATCH 03/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + src/mqt/qecc/cc_decoder/decoder.py | 18 +- .../plotting/plot_convergence_rate.ipynb | 84 +++------- .../plotting/plot_pseudothresholds.ipynb | 156 ++++++------------ src/mqt/qecc/cc_decoder/plotting/plots.py | 21 +-- .../run_color_code_phenomenological_noise.py | 50 +++--- .../stim_interface/color_code_stim.py | 46 +++--- .../stim_interface/dem_to_matrices.py | 76 ++++----- .../stim_interface/max_sat_sinter_decoder.py | 82 +++++---- .../stim_interface/max_sat_stim_decoder.py | 58 +++---- 10 files changed, 246 insertions(+), 346 deletions(-) diff --git a/README.md b/README.md index 38775cf6..ffd12e30 100644 --- a/README.md +++ b/README.md @@ -155,6 +155,7 @@ If you use our tool for your research, we will be thankful if you refer to it by ## Credits The contributors to this tool are: + - Lucas Berent - Lukas Burgholzer - Thomas Grurl diff --git a/src/mqt/qecc/cc_decoder/decoder.py b/src/mqt/qecc/cc_decoder/decoder.py index ba7496a3..7ebbd841 100644 --- a/src/mqt/qecc/cc_decoder/decoder.py +++ b/src/mqt/qecc/cc_decoder/decoder.py @@ -1,4 +1,5 @@ """LightsOut MaxSAT-based decoder for the hexagonal color code.""" + from __future__ import annotations import datetime @@ -68,17 +69,14 @@ def preconstruct_z3_instance(self, weights) -> None: Soft constraints are added to the optimizer with default weights. """ if self.switch_vars is None: - self.switch_vars = [Bool(f"switch_{i}") for i in range( - len(self.switches_to_lights))] + self.switch_vars = [Bool(f"switch_{i}") for i in range(len(self.switches_to_lights))] for light, switches in self.lights_to_switches.items(): if light not in self.helper_vars: if len(switches) > 1: - self.helper_vars[light] = [ - Bool(f"helper_{light}_{i}") for i in range(len(switches) - 1)] + self.helper_vars[light] = [Bool(f"helper_{light}_{i}") for i in range(len(switches) - 1)] else: - self.helper_vars[light] = [ - Bool(f"helper_{light}_{i}") for i in range(len(switches))] + self.helper_vars[light] = [Bool(f"helper_{light}_{i}") for i in range(len(switches))] self.preconstruct_parity_constraint(light, switches) for idx, switch in enumerate(self.switch_vars): @@ -100,9 +98,7 @@ def count_switches(self, model: ModelRef) -> int: assert self.switch_vars is not None return sum(1 for var in self.switch_vars if model[var]) - def solve( - self, lights: list[bool], solver_path: str = "z3" - ) -> tuple[list[int], bool, datetime.timedelta]: + def solve(self, lights: list[bool], solver_path: str = "z3") -> tuple[list[int], bool, datetime.timedelta]: """Solve the lights-out problem for a given pattern. Assumes that the z3 instance has already been pre-constructed. @@ -114,7 +110,7 @@ def solve( start = datetime.datetime.now() for light, val in enumerate(lights): self.complete_parity_constraint(light, self.lights_to_switches[light], val) - constr_time = datetime.datetime.now() - start + datetime.datetime.now() - start switches: list[int] = [] if solver_path == "z3": # solve the problem @@ -127,7 +123,7 @@ def solve( # validate the model model = self.optimizer.model() - if self.validate_model(model, lights) == False: + if self.validate_model(model, lights) is False: self.optimizer.pop() assert self.validate_model(model, lights), "Model is invalid" diff --git a/src/mqt/qecc/cc_decoder/plotting/plot_convergence_rate.ipynb b/src/mqt/qecc/cc_decoder/plotting/plot_convergence_rate.ipynb index 25deac6c..3dd183ba 100644 --- a/src/mqt/qecc/cc_decoder/plotting/plot_convergence_rate.ipynb +++ b/src/mqt/qecc/cc_decoder/plotting/plot_convergence_rate.ipynb @@ -2,71 +2,33 @@ "cells": [ { "cell_type": "code", - "execution_count": 7, - "metadata": { - "ExecuteTime": { - "end_time": "2024-04-23T16:57:07.915059Z", - "start_time": "2024-04-23T16:57:07.902158Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/home/luca/Documents/codeRepos/cc-decoding/src/mqt/qecc/cc_decoder\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ + "import locale\n", "import os\n", - "import matplotlib.pyplot as plt\n", "from collections import defaultdict\n", - "import matplotlib.ticker as ticker\n", "\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib import ticker\n", "\n", - "print(os.getcwd())\n", - "with open(f'{os.getcwd()}/convergence_rate.txt', 'r') as file:\n", + "with open(f\"{os.getcwd()}/convergence_rate.txt\", encoding=locale.getpreferredencoding(False)) as file:\n", " content = file.read()\n", "\n", "convergence_rate_dict = defaultdict(lambda: defaultdict(int))\n", - "for line in content.split('\\n'):\n", - " d, per, n_converged, n_not_converged = line.split(' ')[:]\n", - " convergence_rate_dict[d][round(float(per),5)] = (int(n_converged), int(n_not_converged))\n" + "for line in content.split(\"\\n\"):\n", + " d, per, n_converged, n_not_converged = line.split(\" \")[:]\n", + " convergence_rate_dict[d][round(float(per), 5)] = (int(n_converged), int(n_not_converged))" ] }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "ExecuteTime": { - "end_time": "2024-04-23T16:57:38.875969Z", - "start_time": "2024-04-23T16:57:38.669858Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "d=3\n", - "d=4\n", - "d=5\n" - ] - }, - { - "data": { - "text/plain": "
", - "image/png": "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eP3114WDg4PIzc21XvD/Yu4xaGxsFI8//rjo16+fyMzMNPr9NjQ0GNrpq9fBzsZ/Jymvg0JIMwa2di0UQmavwQshxMcffywGDBgg1Gq1GDNmjDh58qThu4ceekg899xzRvV37twpwsLChFqtFsOGDRN79+41+l6n04k33nhD+Pn5CY1GIyZMmCCys7ON6pSVlYnZs2cLFxcXodVqxbx580R1dbXFYuyIFPHfSeq/+FLE//3334tJkyYJT09P4erqKu6//36xb98+i8V4L+Yegy1btggAbX5WrlwphBDi8OHDJr8HIPLy8iwcbVvWjl9v7dq1ol+/fsLJyUnEx8eL7777zlIh3pM5x0D/d9rUz+HDhw31+up1sLPx30nq66AQ0oyBrV0LFUIIYbn7S0RERES2RzZzgIiIiIj0mAARERGR7DABIiIiItlhAkRERESywwSIiIiIZIcJEBEREckOEyAiIiKSHSZAREREJDtMgIjIpM8++wzu7u4Wa//IkSNQKBSoqKgwS3tXr16FQqFAZmamWdojor6NCRCRTM2dOxcKhQIKhQJqtRqDBw/GmjVr0NzcbJXzP/DAAygoKICbm5tVztcXWTpJJerLmAARydjkyZNRUFCAnJwcvPzyy1i1ahXee+89q5xbrVbD398fCoXCKufrjpaWFpM7VTc2Nnarvc4e1932iajzmAARyZhGo4G/vz+Cg4OxaNEiJCQkYM+ePUZ1vvnmG0RERMDFxcWQMAHA0aNHYW9vj8LCQqP6L730En72s58BAK5du4apU6fCw8MDzs7OGDZsGPbt2wfA9COw48ePY/z48XBycoKHhwcSExNx69YtAMD+/fsxbtw4uLu7w8vLC4899hiuXLnSpXgbGhrwyiuvICgoCM7OzoiLi8ORI0cM3+vvqOzZsweRkZHQaDS4fv06QkJC8Oabb2LOnDnQarV4/vnnAQBffPEFhg0bBo1Gg5CQEHzwwQdG52vvuLuNHz8eS5cuxUsvvQRvb28kJiYCANatW4fo6Gg4Ozujf//+WLx4MWpqagzjN2/ePFRWVhru5K1atapTcRIREyAiuoOjo6PR3Ye6ujq8//772L59O44ePYrr16/jlVdeAQA8+OCDGDhwILZv326o39TUhL/97W/41a9+BQBYsmQJGhoacPToUWRlZeGdd96Bi4uLyXNnZmZiwoQJiIyM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" - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ - "\n", "for d in convergence_rate_dict:\n", - " print(f'd={d}')\n", " pers = []\n", " convergence_rates = []\n", " for per in convergence_rate_dict[d]:\n", @@ -76,27 +38,22 @@ " for per in pers:\n", " n_converged, n_not_converged = convergence_rate_dict[d][per]\n", " convergence_rates.append(n_converged / (n_converged + n_not_converged))\n", - " plt.plot(pers, convergence_rates, label=f'd={d}')\n", + " plt.plot(pers, convergence_rates, label=f\"d={d}\")\n", "\n", "ax = plt.gca()\n", "ax.xaxis.set_major_locator(ticker.MaxNLocator(nbins=10))\n", "ax.grid()\n", "\n", "plt.legend()\n", - "plt.ylabel('Convergence rate')\n", - "plt.xlabel('Physical error rate')\n", - "plt.savefig('convergence.svg')" + "plt.ylabel(\"Convergence rate\")\n", + "plt.xlabel(\"Physical error rate\")\n", + "plt.savefig(\"convergence.svg\")" ] }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "ExecuteTime": { - "end_time": "2024-04-23T16:57:08.282477Z", - "start_time": "2024-04-23T16:57:08.279518Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [] } @@ -116,8 +73,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.5" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/src/mqt/qecc/cc_decoder/plotting/plot_pseudothresholds.ipynb b/src/mqt/qecc/cc_decoder/plotting/plot_pseudothresholds.ipynb index 014c1b59..1f62d6fe 100644 --- a/src/mqt/qecc/cc_decoder/plotting/plot_pseudothresholds.ipynb +++ b/src/mqt/qecc/cc_decoder/plotting/plot_pseudothresholds.ipynb @@ -2,170 +2,121 @@ "cells": [ { "cell_type": "code", - "execution_count": 12, - "metadata": { - "ExecuteTime": { - "end_time": "2024-04-23T17:01:27.415602Z", - "start_time": "2024-04-23T17:01:27.367630Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "import os\n", + "\n", "import matplotlib.pyplot as plt\n", - "import sinter\n", "import numpy as np\n", + "import sinter\n", "\n", - "samples=sinter.read_stats_from_csv_files(f'{os.getcwd()}/pseudothreshold_plot.csv')" + "samples = sinter.read_stats_from_csv_files(f\"{os.getcwd()}/pseudothreshold_plot.csv\")" ] }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "ExecuteTime": { - "end_time": "2024-04-23T17:01:29.027377Z", - "start_time": "2024-04-23T17:01:27.418020Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": "
", - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlAAAAHHCAYAAABwaWYjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOy9d5xcV3n//z63TC/bq1ZaWbIkSy5y7wUXbGMgNg41gDEB8k1McWxIyJdiSgLfvEwxIU4oSbADPzrY4NgY4kIxGBfJXZbVV6vtbfqdueWc3x+zu9rVdktGLucN49m5c++5Z+7M7nz0PM/5PEIppdBoNBqNRqPRLBrjcE9Ao9FoNBqN5qWGFlAajUaj0Wg0S0QLKI1Go9FoNJologWURqPRaDQazRLRAkqj0Wg0Go1miWgBpdFoNBqNRrNEtIDSaDQajUajWSJaQGk0Go1Go9EsES2gNBqNRqPRaJaIFlAazYuQW265BSEEjz766OGeysuW8847j/POO+8FPcenPvUphBAv2Pjvete76OzsfMHGX4g9e/YghOCWW245bHPQaA4XWkBpNH9CJoTRxC0SibBmzRre//73MzAwcLinp3mZct555yGE4HWve92M5yZE0Be+8IXDMDON5qWLdbgnoNG8EvnMZz7DypUrKZfLPPDAA/z7v/87d911F08//TSxWOxwT09ziPj4xz/ORz/60cM9jUn+53/+h02bNnHiiScekvFWrFiB4zjYtn1IxtNoXkroCJRGcxi49NJLefvb38573vMebrnlFq699lp2797Nz372s8M9Nc0hxLIsIpHI4Z4GAMuXL6e2tpZPf/rTh2zMiSiqaZqHbEyN5qWCFlAazYuA888/H4Ddu3dP216pVLjuuutobGwkHo9zxRVXMDQ0NOP4X/ziF5x99tnE43GSySSXXXYZzzzzzLR93vWud5FIJOjp6eHyyy8nkUjQ2NjIhz/8YYIgmLZvsVjk+uuvp6Ojg3A4zNq1a/nCF76AUmrafkII3v/+9/OjH/2I9evXE41GOf3003nqqacA+PrXv87q1auJRCKcd9557NmzZ8bcH3roIS655BLS6TSxWIxzzz2X3//+99P2magl2rFjB+9617uoqakhnU5z9dVXUyqVpu3r+z6f/exnWbVqFeFwmM7OTv7v//2/VCqVed6BKoODg/zlX/4lzc3NRCIRjjvuOG699dYZ+42MjPCOd7yDVCpFTU0NV111FU888cSMeqC5aqC+853vcMoppxCLxaitreWcc87hV7/61eTzP/vZz7jssstoa2sjHA6zatUqPvvZz854n5ZCMpnkb//2b7njjjvYvHnzgvvv2rWLN77xjdTV1RGLxTjttNO48847p+0zWw1Uf38/V199NcuWLSMcDtPa2sqf/dmfzXjvF/OZ1WhezGgBpdG8CNi5cycA9fX107Z/4AMf4IknnuCGG27gr//6r7njjjt4//vfP22fb3/721x22WUkEgn++Z//mU984hNs2bKFs846a8aXVhAEXHzxxdTX1/OFL3yBc889ly9+8Yt84xvfmNxHKcXrX/96vvzlL3PJJZfwpS99ibVr1/KRj3yE6667bsbcf/e733H99ddz1VVX8alPfYpnn32W1772tdx88838y7/8C3/zN3/DRz7yER588EHe/e53Tzv2vvvu45xzziGXy3HDDTfwuc99jkwmw/nnn8/DDz8841xvetObyOfzfP7zn+dNb3oTt9xyy4yIynve8x4++clPcsIJJ/DlL3+Zc889l89//vO85S1vmfc9cByH8847j29/+9v8xV/8BTfeeCPpdJp3vetdfOUrX5ncT0rJ6173Or73ve9x1VVX8U//9E/09fVx1VVXzTv+BJ/+9Kd5xzvegW3bfOYzn+HTn/40HR0d3HfffZP73HLLLSQSCa677jq+8pWvcOKJJ/LJT37yoNOBH/rQh6itreVTn/rUvPsNDAxwxhln8Mtf/pK/+Zu/4Z/+6Z8ol8u8/vWv57bbbpv32CuvvJLbbruNq6++mn/7t3/jgx/8IPl8nr17907us5TPrEbzokVpNJo/Gd/61rcUoO655x41NDSkuru71fe//31VX1+votGo2rdv37T9LrzwQiWlnDz+b//2b5VpmiqTySillMrn86qmpka9973vnXae/v5+lU6np22/6qqrFKA+85nPTNv3+OOPVyeeeOLk49tvv10B6h//8R+n7ffnf/7nSgihduzYMbkNUOFwWO3evXty29e//nUFqJaWFpXL5Sa3/8M//IMCJveVUqojjzxSXXzxxdNeY6lUUitXrlQXXXTR5LYbbrhBAerd7373tDldccUVqr6+fvLx448/rgD1nve8Z9p+H/7whxWg7rvvvslt5557rjr33HMnH990000KUN/5zncmt7muq04//XSVSCQmX8tPfvITBaibbrppcr8gCNT555+vAPWtb31rxrwn2L59uzIMQ11xxRUqCIJpczzwGhzIX/3VX6lYLKbK5fLktquuukqtWLFixr4Hcu6556oNGzYopZT69Kc/rQC1adMmpZRSu3fvVoC68cYbJ/e/9tprFaB+97vfTW7L5/Nq5cqVqrOzc3LuE8dOvOaxsbEZYx3IUj6zGs2LGR2B0mgOAxdeeCGNjY10dHTwlre8hUQiwW233UZ7e/u0/d73vvdNSwGdffbZBEFAV1cXAP/7v/9LJpPhrW99K8PDw5M30zQ59dRTuf/++2ec+//8n/8z7fHZZ5/Nrl27Jh/fddddmKbJBz/4wWn7XX/99Sil+MUvfjFt+wUXXDBtKf2pp54KVCMRyWRyxvaJcz3++ONs376dt73tbYyMjEzOvVgscsEFF/Db3/4WKeWCcx8ZGSGXy03OHZgRKbv++usBZqSgpnLXXXfR0tLCW9/61slttm3zwQ9+kEKhwG9+8xsA7r77bmzb5r3vfe/kfoZhcM0118w59gS33347Uko++clPYhjT//xOfZ+j0ejkz/l8nuHhYc4++2xKpRJbt25d8DzzMRGFmq8W6q677uKUU07hrLPOmtyWSCR43/vex549e9iyZcusx0WjUUKhEL/+9a8ZGxubdZ/n85nVaF6M6FV4Gs1h4Oabb2bNmjVYlkVzczNr166d8YUK1cLfqdTW1gJMfjlt374d2F9DdSCpVGra40gkQmNj44wxp37ZdXV10dbWNk38ABx11FGTz883x3Q6DUBHR8es2w+c+3ypr2w2O/maZzvX1OuRSqXo6urCMAxWr149bb+WlhZqampmzH0qXV1dHHnkkTPehwNfd1dXF62trTNWSx54ztnYuXMnhmGwfv36efd75pln+PjHP8599903KQ4nyGazC55nPtLpNNdeey033HADjz322LTrO0FXV9ek4J3K1Gtx9NFHz3g+HA7zz//8z1x//fU0Nzdz2mmn8drXvpZ3vvOdtLS0AEv/zGo0L1a0gNJoDgOnnHIKJ5100oL7zbW6SY0Xc09EaL797W9PfkFNxbKm/4q/EKul5hpzsXO/8cYb2bhx46z7JhKJJY05wQtpXvlCk8lkOPfcc0mlUnzmM59h1apVRCIRNm/ezN///d/PiMo9Hz70oQ/x5S9/mU9/+tPcdNNNBz/pKVx77bW87nWv4/bbb+eXv/wln/jEJ/j85z/Pfffdx/HHH7/kz6xG82JFf1I1mpcwq1atAqCpqYkLL7zwkIy5YsUK7rnnHvL5/LQo1ETqaMWKFYfkPBNzT6VSh3TuUkq2b98+GS2BalF0JpOZd+4rVqzgySefREo5LQp14OtesWIF999/P6VSaVoUaseOHQvOb9WqVUgp2bJly5yi8de//jUjIyP89Kc/5ZxzzpncfuAKzYNhIgr1qU99atYI4IoVK3juuedmbF/sZ2DVqlVcf/31XH/99Wzfvp2NGzfyxS9+ke985zsvyGdWozkc6BoojeYlzMUXX0wqleJzn/scnufNeH42y4OFeM1rXkMQBPzrv/7rtO1f/vKXEUJw6aWXPu/5TuXEE09k1apVfOELX6BQKMx4/vnOHZgRVfnSl74EwGWXXTbvsf39/fzgBz+Y3Ob7Pl/96ldJJBKce+65QPWae57HN7/5zcn9pJTcfPPNC87v8ssvxzAMPvOZz8yIJE1E0SaibFOjaq7r8m//9m8Ljr8Urr32WmpqavjMZz4z47nXvOY1PPzwwzz44IOT24rFIt/4xjfo7OycMwVZKpUol8vTtq1atYpkMjlpI/FCfGY1msOBjkBpNC9hUqkU//7v/8473vEOTjjhBN7ylrfQ2NjI3r17ufPOOznzzDNnCKGFeN3rXserXvUqPvaxj7Fnzx6OO+44fvWrX/Gzn/2Ma6+9djKCcLAYhsF//Md/cOmll7Jhwwauvvpq2tvb6enp4f777yeVSnHHHXcsaczjjjuOq666im984xuTqbCHH36YW2+9lcsvv5xXvepVcx77vve9j69//eu8613vYtOmTXR2dvLjH/+Y3//+99x0002T0bjLL7+cU045heuvv54dO3awbt06fv7znzM6OgrMnz5cvXo1H/vYx/jsZz/L2WefzRve8AbC4TCPPPIIbW1tfP7zn+eMM86gtraWq666ig9+8IMIIfj2t789I015sKTTaT70oQ/NWkz+0Y9+lO9973tceumlfPCDH6Suro5bb72V3bt385Of/GTWej2Abdu2ccEFF/CmN72J9evXY1kWt912GwMDA5M2Ei/EZ1ajORxoAaXRvMR529veRltbG//v//0/brzxRiqVCu3t7Zx99tlcffXVSx7PMAx+/vOf88lPfpIf/OAHfOtb36Kzs5Mbb7xxcjXboeK8887jwQcf5LOf/Sz/+q//SqFQoKWlhVNPPZW/+qu/el5j/sd//AdHHHEEt9xyC7fddhstLS38wz/8AzfccMO8x0WjUX7961/z0Y9+lFtvvZVcLsfatWv51re+xbve9a7J/UzT5M477+RDH/oQt956K4ZhcMUVV3DDDTdw5plnLug8PtHG56tf/Sof+9jHiMViHHvssbzjHe8Aql5g//M//8P111/Pxz/+cWpra3n729/OBRdcwMUXX/y8rslcXHvttdx0000zCtObm5v5wx/+wN///d/z1a9+lXK5zLHHHssdd9wxbxSvo6ODt771rdx77718+9vfxrIs1q1bxw9/+EOuvPLKyf0O9WdWozkcCHWo/1mj0Wg0r0Buv/12rrjiCh544AHOPPPMwz0djUbzAqMFlEaj0SwRx3GmeTUFQcCrX/1qHn30Ufr7+6c9p9FoXp7oFJ5Go9EskQ984AM4jsPpp59OpVLhpz/9KX/4wx/43Oc+p8WTRvMKQUegNBqNZol897vf5Ytf/CI7duygXC6zevVq/vqv/3pGn0KNRvPyRQsojUaj0Wg0miWifaA0Go1Go9FologWUBqNRqPRaDRLRBeRL4CUkt7eXpLJ5Eu6v5ZGo9FoNK8klFLk83na2trmNH89GLSAWoDe3t4ZXeU1Go1Go9G8NOju7mbZsmWHfFwtoBZgon1Dd3c3qVRqcrvnefzqV7/i1a9+NbZtH67pvaTR1/Dg0Nfv4NHX8ODQ1+/g0dfw4Jjv+uVyOTo6OqY1RT+UaAG1ABNpu1QqNUNAxWIxUqmU/tA/T/Q1PDj09Tt49DU8OPT1O3j0NTw4FnP9XqjyG11EPgc333wz69ev5+STTz7cU9FoNBqNRvMiQwuoObjmmmvYsmULjzzyyOGeikaj0Wg0mhcZWkBpNBqNRqPRLBEtoDQajUaj0WiWiBZQGo1Go9FoNEtECyiNRqPRaDSaJaIFlEaj0Wg0Gs0S0QJKo9FoNBqNZoloATUH2gdKo9FoNBrNXGgBNQfaB0qj0Wg0Gs1caAGl0Wg0Go1Gs0S0gNJoNBqNRqNZIlpAaTQajUaj0SwRLaA0Go1Go9EcNhw3QEp1uKexZLSA0mg0Go1G8ycnX/Z4uifLAzuGGC5WDvd0lox1uCeg0Wg0Go3mlUOx4rN3pMSu4SL5sotAIOXhntXS0QJKo9FoNBrNC47jBnSPFtk5VCRb9khHbJbXxekecw731J4XWkBpNBqNRqN5wSh7AT0Zhx2DBUaLLqmIzfLaGEKIwz21g0ILqDm4+eabufnmmwmC4HBPRaPRaDSalxyuL8eFU56RgksibLG8LoYxLpykVGztz7FjqEAibHHJ0S2YxktHVGkBNQfXXHMN11xzDblcjnQ6fbino9FoNBrNSwIvkPRmHHYOFhgqVIjaFh21MYwp4ujh3aPc+uAeRosuAN97uJvWdIQbXreeS45uPVxTXxJaQGk0Go1Gozlo/EDSly2zY6jAQLaEbSrqkxYIl4JfIlA+gfLZ3FXgW78dmXF8f7bMX39nM//+9hNeEiJKCyiNRqPRaF6hOL5DwS0glURR9WJSSjH5v/Gfq/+fvm1iuy8lA7kiu0Yy9BfygEcsDEJKesYCAoLx8SVSwY8eTlN1UZqerlPjWz59xxYuWv/iT+dpAaXRaDQazSsEX/rk3TzZSpZBZ5AxZ4ySX5q2z4SQEuMCRyqFlApPKvxA4UtJECh8qah4AY4fUCgHmMIkHQ0TMi0MYWJgETLC1Z+FiSEMdg9KCmVvzvkpoC9b5uHdo5y+qv4Fuw6HAi2gNBqNRqN5CeEFkpIbUHL96n0lwBBgmQamAUIITCEwhEAIRSVwKAUFcu4YI+UhHL+Ir3zCpk0ilKA+3EygBH4gx0WSxPMljicp+wFlLyCQav9N7XcNN4VB1BQ0pC1sc+GI0VBucYZPg/ny874+fyq0gNJoNBqN5kWIlArHCybFUqHsM1ZyyVd8Kl6AG1TTaYYQqPEUm0AQ4FHy85SDAnlvhFKQw5NlhDCIGFHCZgzbiGMYAC4GHoGaXRxZJliGgW0aRG2BaRg8n8xa3lE8sDXgkZ2LW9nelIws/SR/YrSA0mg0Go3mMFPxAgquouQFlCo+mZJHxnFxvADXq9YOCQEh0yBsm9TEQoRMAyEESimcoEjJz5Nzx8i4w5RVCSkCIpEQNWaasNGEEgaoakpuQnDJ6g+YxvMXR/ORL1eF06adAf548Mk0IBj/2YjsI9x0F5XB1yDLyxBASzrCKSvrDu1EXgC0gNJoNBqN5k+M60syJZeesTEA7tyynXKgcAMfUBgG2CaELLBCAlMolJKUVUDJ95GeJFABgfLxpIvjF3FlGUOYRIwoNXY9pjH9K16M/8eYNLA8OLUklaJrSFEoKxIRwYpGMTl2YVw4PTpFOHXUC87bYFHxFD98sPo67fRmrPguZHozbnkZADe8bv2LvoActIDSaDQajeZPQrHiM5DPs3dshL3ZEQaLQ5S8HMcRZ2dhM8Z4ukwBBCCkQLn7C7qVUAgFQhjVx0rQO2rhlE1qYjFWNdVgVvNyi6bf2ctv++/gnJbX0RJdvujjtuwLuPtxn4LaH0FKiGWct8FiKKd4ZGeAP56tW1ZXFU6rmqtl6aXhbv6sY5BfD6fwU08AYKWeIB2czvvOXsmxnWruE7+I0AJKo9FoNJoXACkVw8Ui+3KjdI2O0J0bYNQZxVNlQhYkQhGaQnEoQmusBWGaix57QsDkprSRS0U9LtlosX7Z4saRSvHH3kfodnbwx95Hef0RHVOiU/OfuxpBgnDz/ghSbmAZP3/Un9yvrQ7OXi9pqytRliW6R0bxh/u4zf8lJIAEGONaybCKOI1f5Ctb4Stb4amrnlr0tThcaAGl0Wg0Gs0holipsC83Qm9ulJ0jAwwUhyh6JQyhiIfCNCYTRMx6TDEucqQCSgix+MjRVAEzlZwDP3zQ502nM6+IyrmjPNOb5w/b86imRxAm7Cg+xJcf9FneYNCUChExY7MeqxT8vqtAuLnqIG7XbBq/fxhhDyLMMsKoEI+5lFSRu0Z8OMAzsz6rSM3RP9gQBv/nnI8s4iocfrSAmgPdC0+j0Wg0C+EFHoPFMXpyY+wZ7WdPdoB8uYinAqJWiJpIgpZEzYx6JJioIZLsGhYIW7KiyVgwAiSV4u7HZ4qnqdz9uM+69pljKaUYLPfwnZ1frG5o3V8FJQwXUg+y14W9wwu86DSEDtgkDB87uWPycXmKW4GpDOIyRJwwLXmLD39jEDuYK00XIL7zBby7L8Bua1tgIocXLaDmQPfC02g0Gs0EfiApuh5jToExJ8dYOU9PfojhYoZ8pYDju5iGTSqUoCPdQsi05x1vegrOhO0+qSjzpuB8qXiyK5iWtjtwFRtUI1H/dZ9HTVxgWRVcewcl81lybMUjN++8lAJZWokR1OPNYdlk2COYsd3MpvWUErgjZ/PqZC2negPUDVcIKYFMRsAAeyiPHQzMPwfXxR8b0wJKo9FoNJqXAlKqceNIieMF5MolhopZhoo5RpwxMuVRil4JV1YAgW2EiNsR6sINxNJhFpuEm5qCmyqAcs6yyRRcR73BQFYxkJUMZBQDWcVQTlUzflOYuoqtMi6ghD3MgNrKCM9hhnYhjP2ZFCVD+MXVyHIz4cb7Z8yttOcDyHL75OOQqaiNBdSGfeoiZVTg8+DeBoxID/GVX53l+Pcjy+2sLf6eVinxkrV4YRuEQAmBcWDo6iWMFlAajUajeUUxYVBZdH1KlYBixSfjlBku5chWCuTdqp9SRRbwpYthSEKmTdSK0hqpJWyGllSzNO3cB6TgZhNAP3rQZ64El2VAYIwhrCIgsMZXsdnpzQijhBnbgxHKTDsmpOqIy6MIe0dRyKykb8zEiPQQbrwfpapu5RP3E1yyooezWgaIG+74doE0bQJstoymyU/2zTvweEUtJVZFi1TiDc/rGr1U0AJKo9FoNC9bXF/iuONiyfUZK3lkSi5F1yVXzlP085SCLBWVRQkX8LFMQSwSocZIEDIj+wu+DwFdQ4q8N4YRKQJgpR4DqgIocGsRIgAMkGHiUZ9E1CcW9ohGfCIhH8PweDrz0OR4E8bhwixj1zw+ub0jvpojkutZmVxPXagJIQQoSVdfmW/9HpSfQPoJlFeDlzkZu+YRhJ1B+QkAVoULxJSFlCEmc3Wy2gL48hV9/Peu1JzH/3n9blR8ppO4F0h89+VTV6wFlEaj0Whe8ig1HlWq7G97MlpyKVR8ym6AG0h8WcFVBTwKOHIEXzlI4WHaFikjTNisxRKhqthYBPMZSU7Fl4ruYcVzfQHP9A2QOPKLM/YRZploy53TtgVAdvxGefx24HEHnE4pwbHW67ms5ngMr4w1WMSsPI1ZymE7GZqcMreL8xnzUxR3fBSUCQi8zCkgAlAmtcLhmJ4dGL1Mj4SNn+x8VWSFFeeXu64gL6NVT6rsa0iaZV6dfJTOiEuZxORhri+p+BLLFLTk84u4skAwd8PhFwtaQGk0Go3msFHxA7yg2lJEyaooqd6qokiq/duUgkDOfL5Q8cmUXEpuQMUPkBIQYBsKZZQJjCKOHCWvMlSkAwpCRpiUncZ+nkU5sxpJ0sprN5RZ3yrJuybPDVg8M5JhX2k3KrILM74LY9n8AkIpkJUWlqXqSUVDWMLGMuz995jYgWDfWJ4d6oEZx1889FouChyMXb/CCFwMWXX8VkIgrRDKCvOm+Da+XjhuUjxVEeOP4c9rdxJE48wWKzKkz2mZn3AuDu+erU7egXI5yv0Nb6ccCCqBxDYMmmRA/QNbCG3pXtwFNuYvwn8xoAWURqPRaP4kBFJRqPgUKj55x2Ok6JJzPLxAVoWDUijGrZHURGNbAeNNcqHav23cl3syImIKQcQ2idom8bCiLHPkvSyDlSFKQQFfepjCImrGiYeaMMbrl6RS7B6UC0aQDuTZvRV++FA1NjPdSPK1fO/JEumu5yiH9mHGdmEkc1jJ/ccamEhnOW65kVDtwzPGLu15P0lauWrtKKbvY1RczLKLUa5gFh2sUhnh+vRQ4SvNwP5LBAI2mLsRIoEMWwRWGmnYcEC91ilBL032MP+b6yAv9wvIlOFyYaqbzqhL2UwwG9KwccwEId+ZtRGMAkpGgmxZYlsm9SGT+id2EXlwK8ILJqe7IC/+Ti5aQGk0Go3m0KOUouQGVbFU9hkruowWKzheQMWXCAQhyyAaMklYNmK8R5shQAiBENXv0IXSaVIFlPwCRT/PsDNCzhubFmVKWLNHmWZ38p7fRsDwS5ilIX7xlIERqRpJWqnHgaqRpJV8AsMuEgAT8ROhTJrNJtZGG1lpN9Ju1rF1pJb/7g8Rqn141iLuN8cfp/HhbgzXR7g+Qlb9BJRlIm0TZZskQwFJaVMjQ5xSaeGh8CAZo0Ik2oivonNeL0MFnDX6Ey5QDn+5QARJzlb7JQTPxU/h1OydM5+j+p7tCa9lVWiUxJ4R+N1eyFWvldkaJrIxRvFXY8wa3poYIxTCqq2de4cXCVpAaTQajeagKXtVsVQcT6eNFFwKrk/Fk0ilsI2qWEpHQ4QtY9F1RgfiBhXKQREnKFHwMuS9DOWghCc9rFmiTLOxGBuB9ctMAqkYKyoyY0XGxooM5Yp0eaOoFd8lfsCYwvARxv7VdWvFqZxS10B7qAlbTP+qXd+meIMo8ksvgZxShG3aGd4udnFSOY8MRQhiFjJlgjVTyCSAv3caMan2xTupsoYAicX8Be8Sg0I5gSzObcZZiMUoBh4IvxoIUoqQconLPHGZJ5HJkMvFsZU76/Fr+h5m5NkkpcEwAFY0oGljltTyMkKA9xoTvzLH+/OaG7GOvfhF7wEFWkBpNBqN5nng+pLhfAWAB3cOU/Cg5AYEUmEIqum0kEV9zMQwnp9YCpRPOXAo+0Ucv0jWG8XxC1RkGaUkYDI0GsP1UqSj9qJScIuxEfjpQz6/erJCIRhARLoxo3sxot0YNUPTlvrPihKEe1/DkR1r6AwXDjw5ZqmMlStxwUie84rHsTNoZKTjJGqGQ6yMjRFqBI/k7GOPY+ZLmI47ww188rpFQwTJ2VuxmPkSAz8PIYLGeU4Ax17xEPFosSqaggI21aJur2iy884meuR8BtPjaVZTkTrGILkxgQg1UDQjYEagKYIwwkRGHsTwMggUShiI1uPg4nfNrIx/kaIFlEaj0WgWRaFSTcUNFyr058oUnQo2MFIoE4tEaE6GsczF+SNJqdjan2Os5FEbs1nbnMTHxQmKlP0iBS9L3s9QCcr40kMAthEmZISJhZI818MBKThvYSfvQPH4nmCKjcB+HyUr9TjSS2OEBjDCg/iRAaLGzJVgYZnmzNIQy32HW2pmiogf9PbSUPkut9gfrW5QCsNxsfIlQiN5zIJD1MtjhQOCuM3xVj8ythsj2oWQAUhwjeicNUhGtkjHd+7HCOawCQekafDcm8/FS0bHy6MUHj6e8ojlsog526iME0BHbgdRa/rr94wkBVWDkgtZEQgiq5dT9+cXY9Wm5tzLi7cT2fnN6hFKwvkff8mIJ9ACSqPRaDRzEEhF1vEYK7kMZMuMFF1Kro9pCEyzAvYYAH3e4yAFomRgCBNDGJhU7yceG5iYhomBydP7XG7flCdb2i8CklE475gKK5pLKBSmMMdrmFJYwp6W8ltMM93VLQb9GUVfRtE3JunPKAaz1VV7yaP+efKYCR8lwyoRaf7FtPFC2LSHmmgPNVbv7SaiIsLRf/gWIjTKLTVphKqucJu4V0owSB2dsRKhIQdrLI+dcxCujwqZqLjNqdlfEa44UBk/0egPp523LKLc1/B2XGkQSEWgqkX2SkEyX5pXPAEYgaQej0wkjCMr2H6ZZd4orcEoKaefoQXSfAAjY2swVQ1YcYQZBysGGPj5HPDIgsfXvOacecUTQJBcSxDtwHS6kfXrMFZdsOC4Lya0gNJoNBrNJBU/IFPyGClU6MuWyTkelUASsUyiNhixIqOVQcacQVzf4UjSCEBKiSTAx0UpRfV/csrPVQWwo8/iF49ORFf2i6K8o7jj4RBvPD3KhmVzL2FfTDPdH//Rn9HyBOFhxnYTTT6H9JIYdtVOYKaPEniZk3lD3UqOr4uBbYIxPaq2qf0iLh74T+r9gJbA5w35Ij9Nxuk3LeplwH2x06l/di+i7IFl4MfCqHRs8gQL1SDlY3EKFYlhgmUIYpZN2BJYpknEncUMahbqn36S5aKCXSyiHI+gYhJUDIadxUUI84+MAWOL2vd5IwSVplcT7v4JauP7FrUC8sWEFlAajUbzCkYpNe6j5DGYrzCYK1Oo+CgFsZBJbTxEQIlMZYg9pV7yXhYERI0k+VySTcMuwo6xoslYVP3R75+ZvfB4Qkz9/FHJYNYjkAI/qKbdfAl+AF4AeUcu2Ey3Kp4UyeQQyfptEN1GkV1I9osWpWbPFpX2vJ90pZ5zSr9B9AkwDKRlIkMWMmShbItQNI5BHXfv7SE8vlrwjfkCrgKBxauD+6hYcdxIFNeI4gVh3HIE14gQFMSCNUjKFDS/10ek45jGfpcCJT1UZv5mwBOYT+bGvTctns9XfaijBSMaAUNUo3+GUe1nV65Q3rF3yeMdiAoC/LEcBM2oI95HdO35Bz3mnxotoObg5ptv5uabbyYIXj628xqN5pWNF0hKboDjVt26i5WAsVKFjONRqgRYhkEiYtGajqLwyXlj7C32M1YZwpUOYSNGbaiB53rFeP1RAJiw3Z+3/kgqxUhe8WRXME38zEbFg99smT9FNZVpReBuA1Z8B2Z8G8m6bVRUhqm2lSmR4EivhchYG78qriXe+c1ZbQT+vHYnKhyqKrFAYrgeZrmCCCSNwT5WqGepY2iaV5EAwgLAp4F+8IFZgkzOqM2e+Qq4AREoNu74MUJAZdTEzZhUxizcjIWSi4vSxNrBbqhBpBsRta2YqRqMeBRZKDH8nTsWPL7uigsJtTfP2O72DND/L99Z1BxmQylFkCsQFB1yIYt8Os5otpcTvIVK5198aAE1B9dccw3XXHMNuVyOdHq+1QYajUbz4sILJI43IZQCCmWfMcelWPGpjPswQdV3KWwZxMMWDfHqkvOSn6ffGWao3EvRzyMQxK0U6VAdsHD90RtPh5a0oHdMjd8kfWMKd/6s2zRWNgma0ga2WW2ea5kTN0GmKPn9jpHxZroSKz3eS672j9i1D06KoIoCE4sV1jKOLDexrlBPa8XCFA7CKNEY7eV2f6aNwFtTvWyMlFFYk21MTOXR7jxHp/8UCZUFQAK+CGOryqTVZ8FMszV+KiFVwVZlTL+MFTiEVHn8VplmdTAfvffM/r0jTIkKFk7Dpa58+5wC6E9B2fXoHxxhKJtjMJNjKJunf3CEgaFRRpwyo76HNEwwBHhlbtrwKo5rX/MnmduhQgsojUajeYkykX6biCoVKj5j4/3fXE9SCYJqqgpBxDYIW7P7MHnSZbQyzHC5n4w7jCcrRMwYtaHGaY10D6w/mi199qNZxBVUBVBtHIamZKBmOx7gnKMsVjbNFAklv0BPaQ9PiP+c8ZwQ06NWfyEv5ch8krCrkCETYZUxGENIj3CxzKXlXVyUXcaQH6Mse4mMNdFoJbDEs7ixJMWaBsJBgU7nGZY7WwipasW3J0LsjR7FnugxJPyxSUNJgeLp2Bn0mstwAx8fHxkJsMyqpUPSjlAbjpFOOsDCESAAMxUj1FJHqLUOu6WOUFsDslSh/+uLO/5w8uH/+D7dEx8xJVFeAIbACIUwwiGwLISAhtoamhLm8/YFO5xoAaXRaDQvIQKpyJRcxkoevVmHTNGl4lfNKg0hCJkGYdskGbGoMQ0UEqkCAlVBqgBH+hQqwfi2AE+6jJT7Kfp5DGGQsFLUhOpnPXfXkJqWgpvNQwmqQYW2WkFbnaC11qCtVtCQrLqL33SnOznGbMenorCiUSBVwHC5n97SHvqcPfSW9pBxhxe8PkoZnDZ6LuutWvxYmCDmEHKGMNwS0oohHEXLdx+aTIXNlkwThiJ+eYT2UBcGVWFWNFPsiR5Dd2QdgWEjpSJvxhg1G6kLhhg26nmOGoQqEI+Y1IbC1Ibi1IcTxMwwUSME/aPkHnl6tszeDBrf++dEV6+Ysf1gI0hGLFpVs/485SmWSb9TZmj7bgYz+yNIg5kc7miWD7DfaX02PBQFJYmFbBojERoSUVrbG2ld0UpbeyNNdSma65LUp2KYAlASjlx/UK/rcKAFlEaj0bzIcX3JWMmdXBmXdTxc30cJB2GVMEMSJT3KyiMvXXzHxVceUsnxW4BCEsgAhUIIkBJ6R0xKFZOaaIg1LY1YxuxfCfmyYnuf5NEdAcIaG0+fTfVQegy/uBqkhfRTvO64Fo7vnN3m8dxjc9z5RO6A45/Azx+FCPezbPkoP94zRL+zF0/OLDivCzfTFu2kXIixw79/xvMX5t7E2Q21yKBI2OnHqmRRho0frqme0yktWEekpKChsA+jTjJstbI9fAw9VgcSQeAqjMIYVrlMgOKJYBVHVzx2p47mKN+gVsSJhVIk6huwDQtvYITiE48z/MRz+MOLX9VmRiOzbl+sADJis7dzMWuSpN//FwwPDDGSKzCaLzKSr95nCkVG80UGKi5jt/xo6hUZ93uo3n/CUKSEIB2NUJeIUpeIUpuIUxuPUpeIUVNfw7+nE0SVgV2fJryiFau+BmFaYNpghsZv9v77SM2ir82LBS2gNBqN5kVIyfUZLboM56umlYWKTxBIMEtgFsmLQQp+Ft/1EBP/EwamMBFU7w1hYBk2pjAQmNV7YczRBy7gko2C9ctMlFL0ZxXbeiXb+iQ9o/s9AWb3UHKIdfz35Pb7CvDrZ0xsYWMZIezxmyVs+pwu4iunHy/MIrEV1bRctwuM66aQEaE1upzWWCdt0RUso5mEI7FHswzld7MjxoxmukemHEIlh1B5FJAEdhJlTClsX2SqqM9axs7EcYxZDSjDB+GBIYkVXFb/4A/TvJiGiZFkO7CdAMibJpx5POVte/D690fNhGUR7mw7qFVsVm2Ktg+/G1mqvnmi0EVo8H7cplehEitQSlE2TfY4DgO9/QxkcgyMZRnI5Bgcvy9VpgrT6eKoeg+JiE1jMk5TOkFjOkFjOkljTZqmmhoa6+uor2nAjMTHBZAFwgTDJCiUkNk8Rl0tkVWrsZctQ4Sj488vzkLhpYIWUBqNRvMiQClFbrzp7kCuzHChQqHiAxLDLCHNAlk5RNHN4UsPS0QYyaRwKhaJiFhUGxNYuAh8VXPAUE7NWC3XWutR3/IUe9x6RGgEmN1DaWKbVAEVFVCRc/sWTew7dZxlsVUcVXMSbbEV1NuN2EUHq1AktGcMu7AbUXFRlkUsmiBBlJRIcIJYz2a2kFN56vKDhHwIrDjKnB4FU4A/wyBqdvaNtUPUpy6ZxU7FiSdrSdoxQn6O8gJGlgQB+d8+Wv3ZNIiu6SR23Dqi61fhD48d9Co2JxJiwHHGhZHBQPYkBrp6GBzbMotAmjECKEVtPEJzKkZzOk5TTZrm2hqaatM01jXQ1NBILJEGY1wcmXb1Zozfz9JkWJbLBMNDiEiE8AlHEV6xAiM2ezuZlwtaQGk0Gs1hwg/kpNN3b8YhU/IouQGmoTAtB+wcGXeAYjlPoHzCRoSElWZ7rzklglQVQwu1MYHFmVDuHKgKDMuEVc0G7c2DlMJ/ZEf+UbpkGRFi2pL/qZT2vJ8rNrazurVaW+Urr3ovXTzlVe+lx2i5hz8O3zfj+Pc0vJ42swmR9zD7e7Az2zCdCiJQBKEQQSxKEI+AsEgJg7/lrZhYmF6Rs5wQeDkMI4IfjqKAIFD4UhFIiQRsp0LT1n2Lem8aH9w1fYMhIB7DD89X/bOfUEcLiVOPJbbhSIzY/nTcYlNw3YUSA1u2T4kgZRkYnS2CNDs1iRjNNWmaa1I0p2O0JKM0J8M0p+M01tYSjqUgVo+yomBFUWJCGFXzu8FEeFBKCBSoAKV8UKWqUpZVEamkBN8HQxDq7CS8ahVmTc2irtFLHS2gNBqN5nlS9suU/NJkuswUJpZhYYpq25IDkVKRr/jknKrT92C+GmXyAoltKgzTQYQyDLuDlEp5pAoIG1FSdi2WUf3iXkwbk6kiypeK0YJiKKfY1rewCSXAqzYE1LY8wzOZB3mktBvGg0gpu45j606nUmjjkeJMD6WLjrE4pqMqFqLEp8xOYXglLC+PWcky6Nv8kWmZNxQQ6+6jZmwAw6kgVHX1nIzYqIhZtYMsAxWBmXcxyj5KAMJABC4SA9eI4MkSXsTHT0YxhcBG0rBvmNSz3YR397NQL+AJ7GXN4PoEhSKyVAapkPkiMr/wsTC3j5JVm6Ll+ncxMjjKSDbPSL6EcdSJbL33LgbHxhjJ5ekvu4x9+yfzjp+OR2murQqkltoammtTNKWSNKXiNMVChAIPPAcVVL26lBFGhZIIKwZ2FJcoOAJhgDBdMPzqOyGYNM1EjJtoCgGmWY1wGibCMqvX3TTBNDBsG6u1Faup6SW5mu75ogWURqPRLJJABuTdPFk3y1BpiBFnhHJQxsDAMPbXHVVrjyxsYSOliesbOBVBrqQouRJPGtiGQTwUJmqbYGYZqAxSLOdRShExo6Tt+hlF3YuxEbhjk0/fmGQ4D0O5qniaK2t14Co4IzSIXfMQj8vN+L3jNTYYrEpt4LjaM1iRWIMQBvmaDM/sSBISNXRWTmBPeDOuynB0+37vIhG4mH4B0y1glUcx/SKGdFHCIm7GSIgIKaKc6LSx2dhL1igTG1IUrShBTRplVL+I5XhNDlQDH3a+yNofPDRvPzhlGuRefwqRPYPYz3ZjlPc3xQ2lPNzcwlGk+jdcNCmAVBAQFB1kvkh5Tw+Zn88sXj+Qcqaffc4IfZkCfZkCA9kCfZk8/Zk8A5kCvpSAIBQJ84ELX8//dHXjVsab4wlFOrZfIDXXpGmuTdKcTtFUk6QpHiMkFdJ1wfNQUkHgIpSH8HLgRFChGKK2EyOexkjUIpJ1iGgUIxSqCh/LRtgWwqreqqLJQBjjgskwpjmQTz7WTKIFlEaj0cxDySuRrWQZLY8yWBqk4BXwpEfICBGzY6TCqWrXNykJVEDZ98iWPQrlImOlMvmKR9n3USogZFW9mCwThBKMVXttVH2azCi1dgPmHCvhYHE2Ao4Lv9s6XVyELGhMCSI27BoZnbGKzk5vwojuwYr2AtWkYNKu5dja0zi69lQS9nRTx6Rdw3vXfhJTGdT1OYy2nkMgAsJBBbPUj1nJYrlZDN9BoJBmGNeM4ftRRM4hNpbn2tyJhCs+pmVzSqwJL2xh15gYiGr7EiEwGL8XwPjjUHHhZroikKRv++PkYysakO4ske50qETX0PPTzLzHzxjPNLFSCUglwK8sfADw4e/dT7dBdYm+UoAc/xlAYRmC5nScZU1Vy4h3nnU0LckYrTVJWmqSxCKhah9BN0C5HtINUH6AcPII34GQhR2PVh3Go1FEPIlItSGS9YhEHcRqEaEQ4mVWuP1iQgsojUajmYInPXKVHFk3y2BxkEwlg+NXVUvcjlMXqSM0pTg5GG+PUnQlmZJHzvEpe5JAmYTMJA1Rk7BtcuDXmFSKriFF3pEkowZ1CxSBS6XYPSjnsBF4Ai97IqBQfpzltUmOaC2TjFeIxxxMy6ESODhBicH+2yfH3L8KrjIpngAuX/4eViaPwhBzf/lahoXwqmIiUtyHXRnB8EsYgYuHgSMiuCKNrPhYBYdobpBUwSHt5YhZHkYigtloYZoKQ3gI4SEA34zi2XM39RD5xdUgYQqSyz1qV2SINbnIRAdu+1Uorx6s/1qUDUAQSAYyWXqHR+kZ6KN3aBh3IMMVizq/TSqVpKWhkdbGBlrqG2htbKC1ro6WhloaEnEMofADj1/nXF5/2ZsxXR/puqhKBdeXVePJdBgRiWCn01g1aYxYDCMWxYjFEfb4tTBMsOMvu1VuL3a0gNJoNK94Cm6BYrnISHmEodIQRa9IoALCZpi4Hac2UjspJqRUFMo+JbdayzRW8nC8AF9KLGEQGW/Aa84jhmbaCASzFoG7vmLngGRrT9VOwHFntxEQZpH4yq9Obh8FRj0gM36bg5mr6AyOi7+FVakNs++vAgyvgOmVsCpjmJU8cDSM7qY4XoMkzTjhQBIplqkpjhIvlAh5PqZtYdZF2Dj0E2yvBFmqtwPwzBhPd74bNUckTklv1u0HsvzcQeJNHtJO4bZdiV97AggDC6bZAPiBZDSfZyhbYCibZyibY1+hxLZbfsjAaIYg8KqRI2GCFaZDmIsSUDdedx3ptWvnfF4phSyV8PLF6jzyASISwaitw6qtxUilMGJxjHisGmEy514coDk8aAGl0WheNiil8JWPL30CWXXa9uX4YxUQyGDyeTdwqbjVCMofev9AhUrVidtO0BhrxB4v2lZKUfYkBbdCwfEYLbk4boAbKEwBIcskFbGxzcXVhyxUBP76k6qPt/ZIdg1I/MlslSSS3E1QPBIjtn2ixheY3dpIIAibUSJmrHpvRAmbMSJmlJGCT4/3yIxjzkx+kNM7p7pfKwzfwfQKWG4OqzyG8B38wMcJDHwRpcGCIFZP0lDEHZdILk84U8SueAjTgFQEoqHqJJWi1J0klJ9bBLnJJGp8mbxS4Emfil+BvUNEdg4S3b44J27DMnFbXoXXdB4+FgMjGXpHM/SOZOgZGaNvZIyekTEGxnJIdUCRmJIgq+9RKBShraWV1pZltLe0siIaQ/3wh4j5Gs3bNvGGhhmblVKoUokgn0d5HkY0gt3UBIODxM84nXAqhYhGda3RSwQtoDQazUuSQAb0FfsYdoapBBUqQQVf+kglJ8VToILJx9UFRtUvJoWqrpqT1S/qRChBY6hx8our4gWMllwKFY/RokvR9an4stp816w2360xDQacvdzXdwfntLyOlujyBee8GBuBnz869XmfdN1OUo3P4JhbqKjCvMc6+97CpeuP4Oj2JCEjPOcX8YDTzXd2PsKB6+COaDYQQQXTK2JWcljOKJZbQPkVPFdSVCECEcI2w6Rtg7hlUwKWZ8YIjxUwHbdabByLINLRGSklkSvRe7sFwWwNVMYxwUg9hSsMjL0lonvypPZmEO48gmUWfjJyPJt+mad39L9nF0lTCFkmbXU1tNXGaUtFaauvpa29k7YVa2loWYE4IBrmn3wyMj/3cjwjmcSqr9Y2zSqaWluwW1ow6+qQ4TDcdRdWfT2Gvcj0pOZFgRZQGo3mJYVSiiFniF2ZXfQV+6ZZB0yshLMtuyqQDHNyZdxsSF/STz+GsMk4HqWKz1jJI1/2KPsBKEHIEkTsahPeA+XIlrFH6S7uYEvm0UUJqAOLwGe1ERAuNQ3bSTc8Q15swVPlahZOQcSMsSp5NLLcwrPln8+wEbhgXQsnLm+cuFAIP0AEU25+gJCSGtcjLuKkjCQniKN4zH+SnCrS8fgm6so+puciA4krTTxlIoRJ3BA0WmWSokRUlPGlTxmJvcImvu85pG0QxCzKVpSyJcCrVKWZGJdoCuIj/USCBXwEAkj86Cm8wnQxYYYD4q0VQinF8JPxOQ7ezy+e2LO/mS0Qti3a6mpora+lrb6Gtroa2utraa1J0hCWiKAC4QQkWyHeCOEkzHjHq1j19VA/e7/A6qVXyGKxKppcFyMemyaazERicl/pLS4lqXnxoQWURqN5yZCtZNmd2c3e/F4UiuZ482SqbSkopXC8gGyhakj45N4sTiCRKGzDIGKZJOI2xizfnzl3lJJfYNQd4snRh6rHjz5ExIgTNqtGl/WR5snUmSWq8xvOKx7bMz36NLmKruYRgtIwVvIZrMRWAsNjFEBB3EqyOnUsR6aOYVl8NaYwyXsZunbcT5g07cFx9IrNVESWU7wcyS3bMTwP4flV0aQUQkoIAgzfR0iPmsDj4+pUQn4ZQxa4kOUEBEgKVISNZ0QwTZNQ2KAmbBEOWYRsCyU8jt33Q8JT3cWf+9W01xRYCQbWXIcUJlIFWKV9RAvbiOW3I4dG2TNr+97pVMWTIlwfEG8tk2pziNR6CAHOqL0oAXXh8etJdS6rRpYaaqlPJqZF5JTvI0cHkGP9eOE0JBpB1SDKUYRfBstHmGZ1ib9ljXsemXNG9WZEmmLRKaKpHjOx8Jw1Ly20gNJoNC96Sl6JrlwXe3J7cHyHhmgDUWv2ZqlzoZSi6Abkyx4jBZes4+J5AWuoLpVfqPC7HJToKjzH/3T/94znAuXy4NDdsx4nlImSUQI/CkSJLrdQ0gIZxkpuBcCueYhQ7UOTx8SMWo6qPZYjU8fSGuucEUFLmimuafwAiZ5BQmM5FGcRoDCNEsosowwTYUiECgC/usLNLGOICoYKQFWFlSssfBXCVSbKMLEMg6htkA5ZhG0D2zQQgCNdRv0iAoFnpwhVyrPGZhQC7DR1pS7M3LOYuWcx/P2pLofFid3bDfitAcWcCbk44rkYEVMRtRQtpuIaFvjyskzecMFZWLWpGU9Jp0wwOgROAaOukfBpr8ZsX4uSCuV5KMdBOmVkpYxyXWSlAqUiyvfHTSnFZM84YVY9lFQQoHx/v2hqbcWsrdOi6WWOFlAajeZFixu49BR62JnZSbaSpTZSS0N0ZnHuXCilKFYCcuWq83eu7FHxJbZhEAubOLKf/8zfzhm1l9Milh9wrGTA2cfuwlb2FJ6lr9SFYv70k1JgqgQKiRRONb0mAjALmObc9UsH6rb3rfs45hxL0s1CkWhPH+GBETAMKvW1CENhBBVk4GIEZUy/hOFXMKSHlAFSgY+Jj0lAqCqwBBiGwDIE6ZBJ1LYIW8ZkMXwgJXm/RFm6RI0Q7dEG6uwkqngR5b4fzvlazPAAEefW/dfECJM3j6BnT4L8MzmSLGzl/bShCMI2q+prWdZQx7KGWtob6uhorKO9vha7VEaWHIzCHkL7bps8zl12BTLRiRGLThNPyvcJ8iVkPotBGbupGXvd+VirjsNI1Mw5DxUEVVE1efPH7939YqtcBtPEbm7WoukVhhZQGo3mRUcgA/pL/ezM7GS4NEwilKAj2TEjfbI7u5sfbfsRb1zzRlamVwJVm4GS65Mt+wwXKuQdD9eXhCyDaGh6LdOzg4+wO9hNTfZRWuLLKfl59hSeY3f+WboKz+EExWnnqws3Mzq4BqdUR7T1ZzPmXdrzAWS5ffyRoj7lsqK5Qmt9mfpUmUCU2dz3DN3uw7P2kpuwEZhNPAnXJdI3SLR3AKNcIUiGEIZHpNiF4ZdR0kVKiZKKirIIDAspwgjTxBQGpiGIWQbRkoPtlDEFGKaBJQRiijdkOSzIJarnT5pROqJN1NpxImYIfyzHvq//Fvy503DCUDRdmmebl+a55yysfR4bggxhsszt7jSdz77zSprWdM69Gi0cgtoUqCZC6kFMp5sg2oFcc8qkGlVSIUsOslAC6WPaHuEjGrGPOA6j81hEND372FNfi2lWU3eRyIL7al55LElAPfvss3z/+9/nd7/7HV1dXZRKJRobGzn++OO5+OKLufLKKwmHwy/UXDUazcscpRQj5RF2ZnbSW+wlZIRoS7TN2lcOqvYDW0e38oeeP1AfWka+7DGUr5Av+3hSEjINYiGL2th+QZJzR3GCIlLBM2OPAfDk6B/ZU3iOMXdw2vghI8yKxFo6E+voTKxj32CKH/b6GJGe8flOL+Ke4PQ1BqeutqiJz/ziPTJ1DA/uOZ0/FG6a8dxMGwFASsLDo8S692GPjmB4RSyvgBqtEPgBAQaeaWEIC8O0ELEwodoEtmVgGQaWIbBMgWkIjGyR8H/dg5jHyTtsGkSvuYz6xlbSdhxTGCB9jMJOjL1PzW9ACSgp+OWdSdYgOYWJAmnBmGkwnI5z5OjCEajaRGxxS/mFwG17DeF9t+G2vQaEQFZcgnwR5fkYEZtwvYVVV4e1Yh2iZT3EFx/B1GjmY1ECavPmzfzd3/0dDzzwAGeeeSannnoqV1xxBdFolNHRUZ5++mk+9rGP8YEPfIC/+7u/49prr33JC6mbb76Zm2++mWA+rw+NRnPIyFay7MntYW9uL4EKaI42Y5sza2aGSkNkynn8QPFQ38MA/KH3jxhuJ+XAwTYNYnaYQDmUXYdyoUQ5KFEJHMpBiV35LZNjKVUNWAR408TTKQ0XsjK5jlp7Bd3Dgt17FQ8MSgaz1SJw5SeQfgLl1eBlTsaueQRhZ1B+dXVVW61BTXxuAXBEs8EfCjCbjcBU7LFR4l27iPT3YVBGug4dP34UY56VbMo0qFxzKSoaRyqFVNXieD+QmPkckUW0QVkRxLAqIxT3/hojv51a1Y8tApxRGxZRBL5xPMbnxyLY61fRcMqxdCxvxesdpP9fvrPg8UtBptZQWvvhaoqubwjDtrBrkthpAytuYTR1QsPa6uo67dStOYQsSkBdeeWVfOQjH+HHP/4xNTU1c+734IMP8pWvfIUvfvGL/N//+38P1RwPC9dccw3XXHMNuVyOdHrhUK9Go3l+lLwS3fludmd34/gO9dF6ImYEL5AUyj5uIHH9gIofUHIDbnzy72eM4QRF/nfgP5d87tmcuFeKN1MZOoFfPCPpHQ1mrXpSfprijo+CMgGBlzkFRACq+ic1EZk/ehKzksSsJEm7hmNqT+OpsT+S9zLErCQiqGDnhonv3UN0Xzeq4uDEwvihCLFSaF7xBFUBNJYZxYv4IATV7nLVNjGhBRwEJnB+801i8YBwIJC+IONHcSoGQ2M2sUUcHz3mSJJnnEC4s73anHYcIxYFy1xUG5X5qPaI85BOBVWu2iWYyTjRjk6sOJimi0g0QdNaSC8HU1eraA49i/pUbdu2DXsRBl+nn346p59+Op72tdBoNLMgpaLsV8i7RQpekbybpzvXw7AzSsRIEhK1dBU8iq6D61ejJr6S45EigQlsSJ/FM9kH5jxH1IyTsmsnXbcjZmzSUiBsRLnniRBOUCTaevuMY0t7ruGpcjuw/wu+LiFY2SRY2WSwolHwzXu8qpeTmvrnU0w+TkVhReP8Aipp1/DeNZ/EFNVl8RuTG8HLEMn2Eunpxu4eRDkuhUQCmlqIh22iIYuIGlvUde4sRzAGLSg4iFIFVXBQBYfK4OgCZfBVsk+nZuuysijxBJB+1amE2ptnbLdqU9PaqMzGgQXgEyjPr66OcyooKTFsCyMew2ptwqpJYsUMhDsK4RQ0boTaTrCXtlJTo1kKixJQU8XTf//3f/PmN795RorOdV2+//3v8853vnNRYkuj0by0KXsBQ/kKZW98lVcg8aUkkBBIhS8l5cCl4BZwvCJFr0jOy1AOSriyTKAClAJbhLFFYjzpU8A0DGxDYJsGUdvGMqv+4T2l3dzb/3N6S3vmnNPbV11Hc7Rjzud3D0ryI96CNUyrmgXHLDdZ2WSQjk0XQ5dstGZtxTL1+fmaAldPHBD2S5heEasyCqUxxHAGayCPUQiQySTh5gSpsIVtgqs8HFkg8AuLKsSu/PD+Rew1N0FtDLu2lnA0igjZGLaNCFnIskvx0acPamyrNlUtAA88cIvgl9mfygQoQb6ECiSy4iHLPgQBWBZGLEK4PoVZk8CMxzDi4z3iyjmQIWg6GhpWQ2SmANNoDjVLjmteffXVXHLJJTQ1NU3bns/nufrqq3nnO995yCan0WheXCilGCt59Gcd9o6WyJS8iRZnBMrFV2U85VAJipSCLK4q4UkXkAghCBkhQmaEmFmPZVoIAaYQmKbBXNUpo5VBfjfwP+zIPQWAJWzWpU/g6cxDHFhDNBd+UG3K+8DWamRpoRqmjZ0mxyyfvXB9/TKTN53OAc2AmbUZ8FRE4GC6RUw3h1UeRVaKeL5LxZFExzwSmQqRSAz7iCRmyKCiXEqyCAFVG4FIA4lYlLljN/upCIkKK8KxgETcJxSVWGGJCgTDWxaWYO3veMOsESS3Z+DgBJRfGRdNFTBsCMehpgOsMCoIkKUSsuSg3AoCEKkQdkccuyaJEQtjxkLVtKsKqr3qpKz2ratbCY1rdYG45k/KkgWUUmrW1RH79u3TtUIazcuUih8wmKvQPVpiIFfGDSTxsEE8lqfoZ8l7GcqyhCsrKCXBEITNEAkjRsioxTSWXoNS9HI8OPRLnhz9IwqJQHB07amc3nQx2/oC8J8hmCKATDvDvqEYzeN2ThOi6Zl9kud6JJUpQaODrWFav8zkyDbFzoEymZJPIgodDWAZJo5vYAgTUynswMH2SliVMUQlj+9Wr11Z2kQ8QU3JIFWsEAkCZHuasiXJyxJGIIibEZZH0qSsOAkrgu8r9j63ncUsqF970QjRuv2lFB42lVArQbkVtnQv8Z04CJSqRpjcYlXwmHY1xVZ/BITTKBEmKBRR2RJKCIxoA3ZzGqu5GTOVwkinMUKh+cdXEoQxe0dljeYFZNF/1Y4//niEEAghuOCCC7Cs/YcGQcDu3bu55JJLXpBJajSaPz1KKTIlj76sQ/eYQ6bkYhsGqahJWeUYcPYy5g4DEBJhbCNELJTEFLNHYBaLG1R4dOR+Hh2+fzx6BUckN3B282U0RFrZsi/gjod8EDMF0B3KIpOt1iht7ZVUppRjJiNw1DKDp7slpQpLrmFSSuHJSnVFnyxjYNDRGGOtlUYqiR+4KD8PXh7cLLKSoVAp4gY+vjARhIh5kHY8UtkxYl6AZVn4sRCjERNLeMSMMC3hWtxSwMBAnq0Du9nZN8hIzwBnjmQ5WS5OJPjhVrzGToLYMmRsOSpcjxAGsmcAeP6r4BZdBG4rKAxWI0VWBGJ11f5ykRTKiBDkC6ihLFgWZjqNteoIrHS6Kppii620oiqaDvLzptE8XxYtoC6//HIAHn/8cS6++GISU5ohhkIhOjs7ufLKKw/5BDUazZ+WiWjTvrFqtKnsSZIRm7Z0hLw/wl6nm9HyIIYwqLEbsJ5HdAlAKsXjvXt5PHcHG1Ov45jWdrZkHuIPg7+kNN7+oyW6nHNaXkdHfPXkMXc/Ph5KmkMA/W7r/mX6iQhsWGayvsOgo766Eq2zMVh0DZNUAeWghBOUkCrANsLErARt4ZXE7TRxI0bMzWNVxghV+pGlEuWyQ0laOMYyjFicmPJJlIuExrKYjoPllxERhZ+2cVGMZEYo9lboG80zMJJjS1+ePWPV+YUUXCzhLRJsBAqFmKPB7VT8lW/BnSUFd7Cr4A4sAvcRbKKGE+Uolu+A72BEw1ipGERrq8IpnEJZEWShiBzKoshiptOENmzAbmzErK2t1jFpNC8xFv2X74YbbgCgs7OTN7/5zUS0M6tG87JBKUXW8ejPlukaLZEteZiGoDYWojEpyLoj7Mh3M1oZRCBI2XX0jFj0lBWJiGRFo1i4cHoKW/YF3P24TyX1MKG6nfzv3l9w/+Ao2EMA1IQaOKv5MtakjptWMrBnUE6rO5qLdW0Gp68x6WiYOa+FaphWt3rk3OxklClsxWiKtJMO1xO3kkTMOIZShJwBwpktkO+n4rpkjDAqlCCcbqBdKOIVh1BmDDNfQnoeKhKj35QsH/kREcrTJ2wBTdXbyEqDt/6imUsTcS4oONh+tbYr1lih/qg8+x6oR80XiVqCABKFLkKD9+M2vQqVqBp4zrUKbuoY1CTAdzH8CpVoO6FCFstugFhDVThFUigzjCwWkcNZkKOIRILw6tVYzc1YtbWI+VJzGs1LgCX/0/Gqq64CYNOmTTz77LMAbNiwgeOPP/7Qzkyj0TxvlFLV8pDxn2HiZ1BUn4NqRGe06LJvzGEgW6bsByTCNm01UQwBWW+UvdluRir9AKTsWrb3muPiY39+bKEC6qls2jvEnU/kAIilq07gVvK56nz8CGvi53BR54VkCiZP7ZUM51X1llMM5RdnZLShw2BF49ymieuXmaxrN+galKi+Cl6TpK6uCASUgmqUqTW0kkQoTdxKYhvVL3spA1S2FzWyHb/QhycMiDeRSEdptiHmONhjQ7gjY3T1DrBrLMvOTJadA8Ps7h+i4nl8/TTFiog9e8mOAspJvpayqAyVALDjPk0bc8SOrEPWnUbbSasI/Mii+8AdyOQqOACaUWtPWbjFr5LVwm+/XL0HsMIQGs9EtB4LkTSYIWSpRDCcQbkuRiKOvbyDUEsLZn09hv6Ht+ZlxJIF1ODgIG95y1v49a9/PWmqmclkeNWrXsX3v/99GhsXdqnVaDQHj+NW0zwPbB8Cw0IphTxAOE3IDTX+nwkRBfv3K7nBeLTJpikUQSlFzhtlwOlmpDyAQpGya7GNEFv27U9/GZF9hJvuojL4GnLOMn74oM+bTmdOEVX08/SVuvh17j+Jr5z+3IQjuGGV2VH5FY/dfj4wv2P2fIRDHo5fRiKRKqi6cU/cCzl5wnQKVnkp9jVIUuF2UqE6EnaqGmUSBkopHC8gW3GQ+X5ShS7SXj/RkEV8WSexcBgrl6N76zP8fst2tu/tY9fwKHtGM/hKwgHptlbLJnignq4FdWCAsCT1x0LyzI3IhhOoRKp/W83x23x94A4aJcGrQDAhmARYoapgqllevQ/FwQzD4CDSTOKPZJDlMkY0it3chN3WhlVfjxHXzXU1L0+WLKA+8IEPkM/neeaZZzjqqKMA2LJlC1dddRUf/OAH+d73vnfIJ6nRaKYzWnR5vKtqqpivBJMdKibSXULs/+oWQlQtAozqNkH1STG+X20shGmIqnByRxlw9jFS6SdQAWm7Ftuoer5Nqz8C7PRmrPguZHozlfIyAH76sM9juwNc5VAR+3DNffhWNyq0D6zZrBkn5li9V8qg3PtGAOJhaEgKGlKiep8U1CUFt/7amyeNp0hEFU21DoEyEcIkZEawhI1thLANG0uEMA0LU5gYykCO7OLo2pMJ2TGUUlR8yVjRw/ECgkBSq8Zod/fRFAwQSxmMVNJ09Q7xzP13seWprezo6sH1A4RpgGkwceXjkTCr25pZ1drM6rZmjmxrprHiMvDV/2/B9zfWmaD2yoswm45gzmqlWfrALRalFAQBKpAo36/WRPkVlOeA746Pb6PsKIRrwYqhRASkjSgIEGUU5ercLAuZGcOuryfS1o7VUI+RTC6ul51G8xJmyQLq7rvv5p577pkUTwDr16/n5ptv5tWvfvUhnZxGo5mOUop9Yw5P7stSKruEgPp4COMgWlUopch7GQZK+xiu9BKogJRVQ8icnm7pGlLkvTGMSBEQWKknALBSTxCUWzHCAxj2CL2RQYzQyCznEUi3EeksQ/pJwg2/mbFPac81yHI7rz3R5KQjZn9NF280+NGDE7LiwC9pwTtPW87GhrqqlYCwMMTcqTwZ+Ayzi3xZ4BRKSKWIWCbJsMmquIMYeJq+rZt4bG8fW/dleK6rl4iXJUUZ5XkgYWWtSTQcYnlTAx2NdTQ3ttOxbBUttelpIkJURvG3PT7nXKaSev3lmE0zi8BnzD+1Bmf9/tY2VWEkUUGA8gNUEMD4vfKDqshSgPQQBAh8QFbFnx3BSNUj4nUQTSOiKQjHELZdLfI2TYRpVVuzmCYIga8UPPUUsTPOIFJfj9C95jSvIJb8V1dKOavTuG3bSPn8Q+4ajWZ+/ECybSDPs/15QqZBW02U4b6DGE96lPw8Q+U+hsq9BNIjadcSNmfWqZQ9xWO7fRJH/vPktok6KmEWibb9ZMYxMaOeGquD+tAyGsPLaYy0M5oL89OHfYxID+GG38zpBF6fmPlFLJWk4GVpanB4w2n13PekSaa0Pz5THw/xztM7OWVl3YKvvewF5BwPx3WJAiETmuIWo7176N32OJuefpTntm5hcDRbNXw0TFAKK/C45YIe6iKz/a2rvhlSJHFqPg4ojGI3ZvaZ6q3chzOyuGa8i0VWXIJMHiUVE0aiwjL3Cx7bxIiGMC0FlsIQAcIyEOEoIprASDYg0s0Qq4FYLSKcmPd8B2J4Hjz1FFZNjRZPmlccSxZQ559/Ph/60If43ve+R1tbGwA9PT387d/+LRdccMEhn6BGowHHDXi6N8OuoSJ1sTCJiIUM5l6KPxu+9HGCAiW/QN4dI+eNUg4cpJKk7BrCoZkrt0YLiod2BNW0nA9W+s+JtP4EIdRkxmh/+g383NGct/x0jmtdQdSaWfvSVqO45ynIe3M7gR/ow6SUoujnKAVFknaa5ck1nNbUzJUbLLb25xgredTGbNa1pDCMudNGri/JOh6O52MbAi87iDPYRTRq8sOvfJpd27dWU1ieAygwbIQdobO9lTXtzRwRj3NEKES0cifO6PCc5zESYULdP8XMPYvh51AKnKEQ2b1psl2Hph5I+T7+aBaEINTWhJlOIOxqdEgIH4GHUC7CFAjTrvaEi6Qg3gTh5P6bqdtuaTTPlyULqH/913/l9a9/PZ2dnXR0VHtOdXd3c/TRR/Od7zx/gzaNRjM7o0WXJ/ZlGMyVaUlFCVkGUiq29OXoHhZ09OVY31Y7QzzMFExjVAKHQPkILIbHYpTdWtJRi/oDBMueIcUftwc81zsRafGpad6En7xvWqRoKqU9HyAh2jnljNCclgaGEOO95OZ2Ar/k5KoPk1IKJyhS8HPErASrkhtoiLQSMvf34Vzflq46XAMQzKg7d31Joewxmssz0L2bke6djPTspnvXdsqlIqFQiL+55hq6dzyDcnI01cQ5as1G1q05kqNWr2BVWzPWaJbK3j5UxUUZBl03mahg7iiSMBRHvOZRXE+Q3VtLrjuOXzg00XklZTXi5HpYDbWEO5qw4gbCK4EsV9WsNV63FGuqRpZC42LJ1ivgNJpDyZIFVEdHB5s3b+aee+5h69atABx11FFceOGFh3xyGs0rmYl6p6d6shQrPstqYhiG4OHdo9z64B5Giy5gwvZt1MVDvOO0DjZ02Dh+gbyXIeuOUQlKBMrHFBZhM0rKrmNbr5jigaQAj1QULjrWwg/gj9sDBrITIimgffnj+Ml7KclRBCC9OIZdnDX9tphGuvt9mJhSDC5IRaxJK4RyUCLvZQibMToTa2mMthExpzhUK4VVHiFS2EuoNDhtfD+QdPWPsHX3Xvbs7WNfTx8Dg8OYAkyjWkYPEA5ZrF9ZXQ748XdeyNEbjqa2qbU6vJT4w2OUt+3BGclgphJYtSncngFUML8YUlLQ9dt2/NyEsJOIcIjYMUcSWtbC2O33znv8rGMqhSyUCPJFrJok4c5G7KRAmEUwaqDuiHHTyuT+FXK6iFujeUF5XpWnQgguuugiLrrookM9H41GQ1UEbB8osKU/h20YtNdEEaIqnr58z7YZ+48WXb5y7w4uO9mhs8XBECYRI0rKrsUy9qdpptoQTCXnwE8emrLCzgzoPOIJCpF7yfkjICFuJTml8UKCwlp+O/avyAP60F12XHpRPlAwxYdpSFEoKxIRwYpGgScrDJeHsI0Q7fEjaI4uI2ZNaX6rJLYzTCS/h3CxByF9HBFjx95entnexbbd3XR191IqlbFMgWUYmIYgZBk019dw9JErWL+qgw2rl7OqoxUlDO7aKTntnAuxzargCAolKl29uL2DYBrYzQ3VIusl4Od8sEyi644gfvxRRNeuRNgWbs/AksYBkE4ZP5PHCBtEO5KEGuIYiSSk2iHdVk3LWdqUUqP5U/O8BNS9997Lvffey+Dg4IzC8f/6r/86JBPTaF6pTK13qo2FSEZsAuVTckt86w875z32/idivD6UBARSglRV88dAQRAo7nlqf9H1VB8nOW5DIJAcu/5JRqx76feGwIeYmeDkxgs4ru6MqqFkPRy37JPsGzYoNkM8fCbLGiShJdbTGEKwsqkqWjzpMuqOYgqT5mgHzbFlJO2a/TvLgJAzSCTfRTCym627u3myK8PW3T3s7urGDwIMQxAyDSxDUJOMs/aIDjYcuZKj16xk/ZGd1NfObHbuBQqo2kEoz6fSO0ilqxfllDHr0hjhKcIkKGMNPbCo15a68HRSZ52IEQ1P276UVirS8wiGRxGyQqQxTmhZC2bT8qoPU6IZlljwrdFoDi1LFlCf/vSn+cxnPsNJJ51Ea2ur9vrQaA4hY0WXx7pH6R4bIxWXFGSFvkyGgp9j16BHpjRfo1VByYXv/36eL+cpTPdxasNKPUWo4R52qSHwIGLGOaXhfDbWnznpBTVByLQ5Ytoq+6X3Mqs253Up+FkUioZwKy2xDlJ23eTfFd9zyfduY+/jv2XX1qfYvqeXroExFNUWLUKAZQiaGmo4fv1qjlt3BBuOXMmRncuw7cX/efNGxqjs7cUbHsNMxjFbGvb/bVMB1sjDhPrupjxSYTGr6GLrV80QTzCzlcpsiLCNcvL4Y32EmmoIrz4ac8UGRKq12iZF/83VaF4ULFlAfe1rX+OWW27hHe94xwsxH43mFYVSCsd3KLgFdo6M8lhPD6POKPGIZKjgohRYwiJkhAm8xXWpr4lDPCwwDTDE+M2AQhkGCqMIa7qPk53ehBnfihkeBcAiymnN53N83VkzvKAOhkD6VGQZV5bxpIdAYRlh0qE6GiPLiRq1uB5s3dfN7mefpHfro/Rse4KRgf7q6jIzhGkaxMI2rU31bDxqFRuPWs1x61bR3tK45H/MSdfDyxUAKD29HUtJ7Ob6aY1tzdxWQj0/xyhXU28V9+AtCKa3UtmPch2C4UFkZgSrqYnIKadhrToakWyGg/D50mg0LwxL/q10XZczzjjjhZiLRvOKwZMeA8UBunJdZMpZukaz9GRK2KZFfSxB2IhiG7WIKSaQ6agEvLkHHefPTrJZ2TSzZmf3oOSng7P5OFUwzcrk9ksbPs6axsWJNanAC2S1v56sLoKrtpSRuEEFV5YpB2WkUggMbBEmZMSJmWmiVvV1OsMlHtn5GHu3PUPXc09SHOnHlmUM5WMIg1gsxhHL2zhu3SqOXbeKjStqqItMXQmYg9Hc/oeRGog3zJyr6yGLDsFwN3K4D7/o4Ls+6boVhMwx7LANlRLKSkDgEOq5Ays/3qNPxBjadzSjf+jlYFrMzCDwwC0QZDMEjo9Z30rs9IsJHXkMIj4z5ajRaF48LFlAvec97+G73/0un/jEJ16I+Wg0L2u8wKO/2M/u7G5GyiMgTUYKBtlCnPZEHbHQ3KmwTHHhL+4DPZQmcPwildA2cI5ARXZVW70csJtSBmL4jazeMNMP6kB8qcg5Hp6UhC2DQPp4qkJAGV/5mAgiVpSacJyaUAepcIq4nSAZiuPmHbY9+xTPbfk9W558gqHBfgwkZlDB8MukjYA1RyzjuGM2cMy61RyzdhXJxLigCzz48dVQzsw9uUgt/Pl/oZQgKDgEhRJ+JoefyaFKRVID/4ohS5O7nzd0wHUQNigPAShhUhQnM/BrB7d334LXZVEELrhFlOsgyxLpGYi6lUROPprwmqMxErq2SaN5KbAoAXXddddN/iyl5Bvf+Ab33HMPxx577AxX8i996UuHdoYazcuASlCpCqfMbkYro5jCRvg1DOY8xkoVGuIR7DlWeiml+O2zAfc/M722abYi8AkbgUD69Dld7Ck8R1fhOfqdbkBBdGbzkwlKe67hz49fMa8NgRdUhZNEEQ8r6qJlwrYiZIaIWmnqoitoiNaTDCVIhBLErBi5XI7HH3+cxx67j8cff5yurq79A0qfKB5r2+s4fvVqjj/mKI4+ZiOR6BwizrAg3gjlLDDTj0ohUKE0zrN7CLJ5ZLkCXgC2iRGNYDbUozL1KMdBzHo8CFWN8nnJYxjasYzsb5+CQCKiYVLnn0b2lw8sqgh8GhOiySsjywEysCBch2huIbz8COzOlVi1tXOPqdFoXnQsSkA99thj0x5v3LgRgKeffnradl1QrtFMp+yX6S32sie7h0w5gyXCKL+WvqxLtlwkZBo0JqPMZaAdSMWdm302765Gn85ca9JWJ/jl4z6V1P4i8JBo55xjMlSi27mt6zm6izvwZGXaWPXhFjoTaykVa3m2fPsMH6eLjjHntCFwA0nO8QFFKgahsEM6YtGW7KA90U4ylCRmx7ANG8dxeOKJJ9i0aRObN29m165d+wdSCqECVq9o5fhVrRy/qoljVzYSq2kaL5Ce2y5gsgHu0W/B+M1nZ91HoCiYpxD0D2FEI1i1KYQ1/c+c13YJkZ3fnON4CMIN5O1XM/w/z+D1VevEoutXUXfFhZipBPFj1sxbBG7EotU6p6miqSKRvokK1WA0NhNatgq7tQWzvh4jog0uNZqXIosSUPfff/8LPQ+N5mVFySvRW+hlT24P2UoWiyjSq6E751EoF4nYJo2JyJzCCaDiK378oM/2/qp4es3xFuuWZ3GCIm89H368+wlcBZG6h4k2PcVv83nI7z8+aiZYkVhDZ2ItyxNrJm0B8l6Grh33EhI1tFqn0Oc/jKsyHN0+s+am7Afkyz5CCGriEA6XSYZNWpMddKY6aYw1IhBs27aNRx99lEcffZSnn34a35/iNaUkK5e1cvy6FWzsrGfjygaSURusCMqKI6WJ70sYy09rgqv8AOV6yIpbvfc88CUqEMTtVkyvf1oUSQEIm1j5Qaj8ccKdYAZeXuLkoqBm+mEFZoqxsZMoPPwbkAojHqX2z84nduzayX8gzlUEXh1gXDTl+lCeIvAMlF2DUdeEvWwldlsbVl0dRmxxNWYajebFy0Ev7cjlctx3332sW7eOdevWHYo5aTQvWYpekX35fezN7SXn5jCJ4Zdr6Ml7lNwSsZBFYyqCAfQ7e/lt/x2c0/I6WqLLp42TLyu++4BH35jCMuANpxo0NgzwzW03zjinxKfo71dOZze/lhWJtTRF2qYVoU+QtGt479pPYgoTIQRKnUmgAixj/58DxwvIV3wsIahPCkIhh0TYpCXeTme6Ewqw+bebeeSRR9i0aRO5XG7aOVoa6zjpmLWceGQbG1fUUhMeFzrhBISTBOVqLze3dzfSKaOCAAIJimmSSBgGmMZ4c1wDYRjY7j6E8Gak4ASA8jCd7jnfH69osufOJpScL132JACx49ZS+/rzMRMLiJ1x0YRfQXqSwDNRVg1GTRN2Wyd2WytmXT1m4tD0wdNoNC8Oliyg3vSmN3HOOefw/ve/H8dxOOmkk9izZw9KKb7//e9z5ZVXvhDz1Ghe1OTdPD2FHrqyXeS9PJaKUynXMJR3KfsO8ZBFcyoyrf5oy9ijdBd3sCXz6DQBNZSTfOeBHAW6iTd30drSzb25LtxMZeaJp2BgcMmyt3FUzYkLzneqWBJCYAkLBZTcgELFI2wZNCct7HCBWMikxqinuLfII08/wtc2fW16HRMQi0Y5/uh1nHz0ak5aWUdb2kD4ZTDsyfYiKlD4Y1ncXV34w2OosouIhjHi0apAMgzEPCE5o9hFqPcXmIXtQLXeaep/Vaget/318/okVfqzKPmHBa9PzWXnkDrn5Pl3CnxwRpGuj/QtpJnGSDdit3RgL1tWTc/F47q0QaN5mbJkAfXb3/6Wj33sYwDcdtttKKXIZDLceuut/OM//qMWUJpXFNlKln35fXTnuyl6RYSM4Tg1DBdcPFkmEbJIRe1J4ZRzR3GCIgBbs9Xawq2Zx1gWW81QuZd9uUG6c73QMUhsvL/cgFs91jbCtEaXk7breSrzxxlzeduqa2mOdiz5NUwVThHLpK3Gxg4VKYyM0vPoIPu27GPb09sI/GoNFEoigKPWrOKk4zZw8vqVrGsKY/mFamNfy4RICqwWFBDki/i9vbj9IwSFIkIIzFQcUZtalLgQTh+hvruxstWaSyVM/IbTCWKdRLqqDcwFikrHFQSp+aPgsjAALCygIquWz/2kUlDOodwCfjmESK/EbF9JpL0dq74eI5nUokmjeQWwZAGVzWapq6sD4O677+bKK68kFotx2WWX8ZGPfOSQT1CjeTGSrWTZm9tLd6GbkutgyAT5UoqRokcgy6QiNrX2zILsb26bWfzsBAXu6P7W5GMxbmCdsutpj3XSFltJW6yThkgrhjAYcLrHBVQ19jJx7/oSxwsm02ATCS41bvikGPd+mvIY6eN5FWIWtIdcunc+yzNbdrD36X3khwvYGAglQQW01Ndw8oYjOHnDSjYeuYxkNFQ9tyiDsKrtRcbbuciKi98/jDcwgj+aQboeRjyK3Vi36L5yojKC3fdLrLHNCBQKgV93Ik7kTAI/DCVFUFyGURlAhptxczWQH9hfxD0LgTN/FG9B/DI4GaS08P0G7DUbiGzYgNnQoEWTRvMKY8kCqqOjgwcffJC6ujruvvtuvv/97wMwNjZGRK8m0bzMybk5unPd7M3vJVMuYKskOSfFaKEaJkpFbULzCIRL29/GL3q+x6xL8BUEhbU0GqfyhuNWUROZXQTErCQxK0nCTHOacQJ/CDZTDLKYxPACiRCiGvESVWk18b1uIhBGNWUnhMAKSng9TzD03DYe3Lqb3Tv6EZ4iYtjYwiRmmRy7ZgWnHbeO0447imVtzQjTrloJGBYY0wWikpJgLIc3PIY7MIwsOgjbwkzGsab0lBPuGMIvznudrZGHsEYeQqiqXYCfPga39RK8cozeL/zXATYCjVTNLf+/8YNN2j78bqzaFEpK3O5+nG17KD+3B7e7b97zzomU4IxWX6NMoqJNRNYdTXjNGozwzJYtGo3m5c+SBdS1117LX/zFX5BIJFixYgXnnXceUE3tHXPMMYd6fgdNd3c373jHOxgcHMSyLD7xiU/wxje+8XBPS/MSI+fm2DnaxbbRPYw6eaQXI/ATOH6AKSTpaAjbnDsCoZRiT2Erv+//DbOJJ4DSng+wMr2MvzjbnteLKWnX8BedH8NzJatzkouOeQ3SlIQnmvkKEFRFVFVAiXHjTIFSiq4dXTz2u9/x2B8eZN++QTAMQoZN1IjT0lLHaRs3cNrG9Zx4zFpi0YX/USSdcrUgvG8IP5sHP8BIxLCbG2bWNEkfc/NXkMXynOOZYYkdrwqkILkGt/VSZLyaUpOjA/N7MAH4AYVHnsIfHKW8Yy/Smftci6JSgEoOaafxgxhmayex9eux2tp01EmjeQWzZAH1N3/zN5x66qns3buXiy66CMOo/mv7iCOO4B//8R8P+QQPFsuyuOmmm9i4cSP9/f2ceOKJvOY1ryEe1ytiNPNT8QN6cxm2jezmueHdjDh5bBKEjBS2aRCxDRIRe14rAoCe4i5+N3AnPaWqH5IKbITpoVQ1OjThwwQwlJtdXE2l6Aa4PqxsSEAuRzRkYVhzR718z+e5p59j80ObeeyhzWSGhiAoYyCI2DGOXnMErzpxI6dv3MDqzmWLFgWyXKHS3YfbN4QslTHCIcyaJMYB5rrT5pIt0v3zJCpIzrmPMBSdV1qota9FJlcvai4Hkrt3f42YEY0QOXI5kTWdGMkEw9/66eIGCTwojYAVJgi3I4kTWreKyFFHYWq3cI3mFc/zsjE48cQTOfHE6St9LrvsskMyoUNNa2srra2tALS0tNDQ0MDo6KgWUJoZeIEk53hkHY/uzCjbR7vYV9hLOSiRstM0RdqqYmWRQYdBp4cHBu5kd+FZAAwsyiOn4WVPJLr8P1FeDV7mZOyaRxB2BuUnyPnQNaRY2TT7SQoVn7IXsKoxQWsqzAC5WfdzSg5PPfoUmx7axFObn8IpOQjAkj61tsGpJ53Aq04/nTM3HkM6tTQxoKTEGxqlvGsfQTaPmU5gty6uma8slVELBJCUFDgtbyGUbEF6HrLgVHvYFUpU9i0uBWc1NxA75kiiazoJdbRU7RAAt2dgUcdTzoEDKtaM70UR8Voi69YRXrFihjGnRqN5ZXLY/xL89re/5cYbb2TTpk309fVx2223cfnll0/b5+abb+bGG2+kv7+f4447jq9+9auccsopSz7Xpk2bCIKAjo6lr1TSvPxQSpEpVQXTSNFlKF9mpJRnuNxD1u8DUaE+XkPCalpSqmasMsTvB3/Bc+Or7AQGR9eeQq13IXc+WxUrxR0fBWUCAi9zCogAVPXXsVCePQpVFU+S1Y0J2mqjqGD6fpmRDJsf3symP25i29Pb8AMfU5hYwmJZYytnHdPJ+etaOPnEU7GfZ6PaoFiivLsHt3cQI2RjtzTOaz0wc4DFFXEP3fozZLmCchdunjwbDW++hFB784ztRixaXSU4XxrQNDCSSWRqNb4jsNvbiBx1FFZ9/fOai0ajeXly2AVUsVjkuOOO493vfjdveMMbZjz/gx/8gOuuu46vfe1rnHrqqdx0001cfPHFPPfcczQ1NQHV1jLTnI/H+dWvfkVbWxsAo6OjvPOd7+Sb35y9hYPmlYUfSLYN5Nk+UKDsS3zlUFaD5IM+XNOhIZwkas4fVTnQCDPvZfjj4K94auwhFFX38LXp4zmj6RKcYgN3PjtFDKipv3pi2uNEZOY5c2UfL5Ac2ZygNR2p1jON11Ldc+c9PPT7h9i1bRcCgSlMbMPmyFVHcs5Z53DBySdwVDKPKA5Bqn1ypdxSUEGA2zdMZfszUBglVJPEsC0o56fvZyVQoZrpBwcOVvYZzLEnMLp2AgsLkSBX2P/ANDDjMYxE1S/K7e5f8vwnsGpTtH343ZOtWHwEm6jhxGAEq5IBw0Q0dUKihSAwiKw/kvCRq3WhuEajmcFhF1CXXnopl1566ZzPf+lLX+K9730vV199NQBf+9rXuPPOO/mv//ovPvrRjwLw+OOPz3uOSqXC5Zdfzkc/+lHOOOOMBfetVPb/K3nCYdnzPDxv/xfgxM9Tt2mWxuG6hiXXZ0tvjq6RErFIgLCGyTg9OEGRmJUkbbVUhdOUJf+zsWXsEbqLO3hy5EG2Go/xxNgD+OPtQVYmjuKspteA28b/PurzbO/iXmMqCivqAbn/vHnHI1CKIxsTNCfCDPQP8OgfH+WZTc/wjte9g7t+dBeBH1AXr+Ooo47i7DPO5uwzz6attRWy+6D/SfxiCRLLABOCheuspuJn87h7e/H6B6kb/jpGUITR2feVVpL8hk+A9LCzT2NnnsDKPwdBQKEvzPCWxaUL039+MeGVyzDiMUQkNClk3Z4Bhv/l2wvPOfAxgjmueSqKkao2+zUQVMxWjHwWI74WGWvGy3uY8SSRtWsxW1oIhCDQv+ezov8OHjz6Gh4c812/F/qaCqXm+YY4AN/3+dznPse73/1uli1bdugnI8S0FJ7rusRiMX784x9PS+tdddVVZDIZfvazny04plKKt73tbaxdu5ZPfepTC+7/qU99ik9/+tMztn/3u98lpvtXveIZk2OUZAmF4FuFW6hQmvZ8u9HOpbFLSfqd/GKfwaNDAoVAoDipUbEiofjx7omC76mRpuqv4bvXSI6rX5rAWQoRd4Swn5/z+YqVohyqm/1JpTjnuU9R4+yZ0UYFqm7gpVAD+XAbTYWnMVRA4Aoyu2KM7EwTzH3aGXR98ANU2ttnbA/39LDiX776vI/XaDSvHEqlEm9729vIZrOkUnP0rzwIlhSBsiyLG2+8kXe+852HfCKzMTw8TBAENDdPr2Vobm5m69atixrj97//PT/4wQ849thjuf322wH49re/Paflwj/8wz9w3XXXTT7O5XJ0dHTw6le/etob4Hke//u//8tFF12EPc+qI83c/CmvoZSK7jGHZ/qyjJVH8c0+spUhwmaMuLU4R2yAL275+OTPE6voptIje3hgZA2bdsvJINJRbYJXbbBoSlWFk9EsufsJn5yz/7hUVHDJcRYdbYIh5VIOyvQMDLDniWcZ27aHTM8wpllNzVmGxdEbjubcc87FMIyZ18+rwMBTMLIdInVVV3CAwMO67YOIcmbO16ciNXiX/yd+tkilqxd/NIuZjFf7wQkgfhblnn1zHh8Kj9ISH6KcsRjd1UJul4nyqxdCRCOE162k/NizC17nE8kQYmbazI9VGFyohsmyOLm1Eat24WiXrxQPZIqcEgSEwmHCa9YQ6uiotpbRLIj+O3jw6Gt4cMx3/Q7s0XmoWXIK7/zzz+c3v/kNnZ2dL8B0Dj1nnXUWUspF7x8OhwnPUu9g2/asH+65tmsWzwt9DSt+wNbBHM/0DZMPeinRh/QDaiJNmMbifwWUUnSGz2V3+TfjvkoHPm9Q6Xsjj2Srn7dVzYLzj7Zor5tuMbC+w2TdMoOuIUXekUTDAU11Dp4q05sr0/XkDp794xYGd3aTDIeJ2jZRM8pxxx7Heeedx9lnn019fT2e53HXXXdNv35OBvoeg0w3pFrBnuLjZNgQb4Ryltm9qARE6wl29+Du68eQBeIJgREMIoZz+CPDdN/6HCponPsiGYpwY5TKwIT3ksJubSR5xkZiG4/CHxqlfxECykJhHThHKbFCLm1/83okCUi2QGimSDKSyUUVfCvXxS9Uw2LRhkYSR2/Aqpsj+qaZF/138ODR1/DgmO36vdDXc8kC6tJLL+WjH/0oTz31FCeeeOIMO4DXv/71h2xyDQ0NmKbJwMD0pccDAwO0tLQcsvNoXr5kHY8n943yzOBeKmIfrsqRsGqIWkuzsRhw9vGb/p/TXdk+Z6/a0p5rkOV22uvgwmNsVjbN7c0kgMbaPIlUEUOa7HtqH7s3b2Pnk8/iugGGMKmPpTjhuGO44IILOPfccydbKM1Jrhd6NkM5AzUdVbfwaScVcPzb4Z4b5hhAIQtjhB/5ByKyNCNNJ0ft+cUTgBRV8WQIYhuOJHHG8YRXtk9G+Ba1Cs4yq/tNTktBJQ9eAaL1WGvXV4WgWFxLmP3DKFS5jCwUkGUHYdsYiQR4LtETT8DS1iYajWYJPC8jTagWdx+IEIIgWMDkZQmEQiFOPPFE7r333skaKCkl9957L+9///sP2Xk0L0/6sg5/3LOPHWM7UNYwYSNEQ6gVsYQv3ryX4fcDd/FM5lFAoaSFlz2WUO3mSQPMqUaYABcebc0rnspBiZw7xujuYfoe72bb5qeojPdo83xobe/k8ssu4crXXTLpYTYvUsLwjmrkSUpIL58ZHpug7QSoPxJGdjBbFMr09leHKwTKSqLsFMpO4ssIsLCPUvzko0lfeAZWzUyzzANXwc3GtF52XrkqCO0YNK6vRp3M0JzHHoiSElkqIfN5lO9jRCKYNTVE2o7CrKlBxmLwy19ihBY/pkaj0cDzEFBLSYcthkKhwI4dOyYf7969m8cff5y6ujqWL1/Oddddx1VXXcVJJ53EKaecwk033USxWJxclafRHEggFVv7R/n9nq0MlPcSCXnUhuuxjf2pWakUXUOKQlmRiAhWNIpp7VPcoMzDw/exafjX+Kq6kiMtN9Kz69WgTKzktlmNMAEKc1gdedKlu28X2x96mj2PbqeccTDGxVxNbR2rN57OqWedy2VnHU9LOjr7ILMx8DSMPAuhJCQWiFIJAavOr9ZHHYBbdyay5iiUPS6arMS0KI/fMwB8Z8HpJE/fOKt4msCqTcEczX4nCXxwRqvnr1kO6WWzputmQ/k+slAgKBZAKYx4HLu9Hbu5CbO2FiORmIyI6ZVPGo3m+XJQNgblcvmgGwg/+uijvOpVr5p8PFHAfdVVV3HLLbfw5je/maGhIT75yU/S39/Pxo0bufvuu2cUlh9qbr75Zm6++eZDGlHTvPA4rs8Du3fxSM8zeGKMhlgNcXt62mnLvoC7Hz+wiBsu2Wixrh2eGnuIPwz8glJQ9SKyvJXke15D3tlvwDqfEeaBPk6VcpnHHvkDWx7czNDOfkJmBEtYxOIJTjj1TE48/RzibatIRmxOWFFLU3KB3ykZVGudcoPVx4NPQ7IZQnOnoKTrIQslZPcm7Ce+haAaf6reC2R0Gd7yK+aOXP2pULJao+VXINFUFU/RWqavWJyJrFSqqblSEWGaGMkkkSOPxGpowKypwYguQZBqNBrNIliygAqCgM997nN87WtfY2BggG3btnHEEUfwiU98gs7OTv7yL/9ySeOdd955LOSk8P73v/9PnrK75ppruOaaa8jlcqTTz8+1WfOnpTeb5Z4dT/Lc6E6SEYtl0XZMMX011ZZ9AT98sOrVZET2EW66i8rga8g57fzkyaepHfsFFVFNU8lKA5XBS/EL6wFBXQIKZXB95jTCTEVhRWO1ae++HbvZ/MADbN38JLIiCZsRYnaCdUdv5LRzLuDYE0/FDoXozTokI/8/e/cdJ2V1L37887TpbXtfysLSpauoiEaxRlGTaCxXE41GYzQ2ctUUjfEmuTGKKZj7izfRJKaZGxOjsRt7QaoNBKQtu7B1ZnZ2+jzl98fAwrJtZtkVgfN+vfbFzlPPPLswX875nu/RmD2qgGJPPwUbM8lsj0ysHSJNkOgEPQ34wVsN+wxBmelMdvmTWBw9FEEPd6EG38UVfhwJA8NWhpJu2dV6i0zlaYMGT8mtO3L6OQxZOpYNnhx+KB4P7jKQFSzTBD2DZRhYhgG6jrXXl2SZSDYbst+PfVwdakEBSiCAJBJyBUEYQXkHUP/1X//Fb3/7W3784x9z5ZVXdm+fOnUq999/f94BlCDsL93QWbVjC69seZdgKkyNrwyX2rvHwbQsnlmzp2K95l+F6t6MVfgakhpDdX9MCjB1F+n2k7A6j2J0qY3x42XGl8sUeqQeAVhfPjNB551n32DN62/R1tKMLCnYZQdVlTUcs+AUjjr+RAqLsj1iumnSFE7gd2rMGV1IoXuvIGh34nQiCF2tEN2ZfQ2gucFdDJINmkKgaFgZHSMWx4gm0EOd6J1dWIkUlmkiaSr21Ps4wv9EwkL3TyM16iIcGx9ASWzHcNZgeCf0+57MTIbwU68SfXNNXj+XXFiGgRmLQTyIZSlYrlKgCDoN6NwVsEkSkqJmk89VFUlVUTxuJIcD2elEcbmyvUw+X/ead4IgCCMt7wDqd7/7Hb/61a846aSTuPrqq7u3T58+PefaTIIwXNriQV7e9B5rWjbjVBzUF9T2myS+rc2iKxNCdsQACdW3BgDV9y6SBJYpk+mcwyj5DOZO8TC6VEZTevbKTK5WOH8evYYA3ZpOaXgZzy15hnQmCZKE2+HjyHkncPyJZzBu4pTuvBvLsgjFM3Ql0lSlwkx0OHC3xEmZRnZplFQndDVne2MyCZCU7PCczQ2yDGSAINnySnbiazchdUYwk0nQTdAUZKcDpSiApMhoLf/G1voUAJmio0jXfB4kmXTlGdgb/0668ox+e5/STS20//kp9NZ+So8PkZlOY7R3YCW6kJ02pEA5SkkdUqAU2elAttuRNK3PLzQtr7UJBUEQRkLeAVRTUxPjxo3rtd00TZGQKQwby7LQTQvD3PWnYaGbZvfrWDpBQ1cDH7ZtZEekkypPOV77wLlD0aSFZ/x/73WP7J+7P4sl2cRW8A7TfOczvqL/QoqTqxUmVsls3J5g3QdbaHx/DV2bV9NoZTAti9qxYznx5EUcd+ypOF0985KiKZ1gNIHfrjDHFiXQ8BHq9hiJZFd2tlkmAaaeLUGgObMzziQJiANtPa6lSzKUTSDT1oHNYUMtDCCpe7XbMrE1PYHW9goA6bLPkKnYEyyZvnoSk/+z7+dvmkReWU7n82+CYSJ73QROP57gY8/lV4JgH2Y8itHWmi3qWVKMfdZxKGOmIhXWIqkHfGUpQRCEnOX9L9bkyZN57bXXGDVqVI/t//d//8fMmTOHrWHCoS+Wzg6FbWyJolsSKcMko5vdfxqWhbkriDJMC8PKDteFM820phqI6524VB91gVG9eor64nFIJNcvwl7+eL+FMJM7voCntP9rWZbFjs3bWP3qW3y0cg1mKoFp6ciqxIw5Uzh9wWeYPmYCKiB1rYWIgWQZGJkMnbEEHtlknNdGqQnGuk1YyQyqTwO7BW4P2EpzXuxX2pVYrRUXoOxbksAysDU8ihZcAUCq8iz0shNyuq4e7KTj0adJbWkCwDl1PIXnnYziduEYW517CYLdTBOzswOjox3JZkOrqcU2cRbqqHokV0FObRIEQfi0yTuA+u53v8tll11GU1MTpmny2GOPsX79en73u9/x5JNPjkQbDwgxC29kRZIZVm0LAfDBjk5kWUWWQZEkFFlCliUUSUJVZRRJQpYgqnfQnNhGlFYCTic12qi8ajpt6FyDreT5AQtheqQqRpX0PkDXddYtX83Kf79OS0PTro1xCos15sydxMLZRzDGU4Zd0rAiWwAZJAnDkoimdNImlLjtVBS48dkU4h9tw+hKoZUXZ6uFD2fujpnBvuV3qJG1WMika89HL5qbbXIo0m8AZFkWqS1NdD7/JlYqjWTTKDj7M7jn7Bl+zKkEQfZiWOkYZrgDI5pA9vixTT8GW/00lKo6sVSKIAgHvbwDqEWLFvHEE09w11134Xa7+e53v8usWbN44oknWLhw4Ui08YAQs/BGTmciGzy1d6WxA1UBJ7LS/69iLBOhKb6N1mQTkiRRYMtvCZaEHucv6/9Gh7UKWQUjVYxib++zEOZpM9Qe9aCinRFWv/Ima159m3hXtqyBoqnUTa1k5hF+po87gkr3aDxKdqHpvUtAxVI6XSmdgFdjXKGLIo8NRZJINuwk055ArawY/pliegLH5t+gxDZjSSqpMZdi+Kdkd4Ui7PjJbwYegtvFNqqS4gtORy0K5Hn/FFYyghnpwkiBXFiO44ip2MZPQykapIq5IAjCQWRISQfz58/n+eefH+62CIeBzniGlduCtMfSVPgdBJv7PzZlJGhJNNISbyBlpvBrhdiUfqb592NLZD3/3PYndKkTy5Io4zNMLD6SV0M/x9yrEKaihTlzup/J1dmekZ1bG1j579dZt+JdzF29kN4CP1Pmz2b8zDJG00WtvRK/q6a7GOZuad0knEhjVxXGlXioCDiwKdlj9HAXqc2NyF4X8hCCJykdQtJjAMhI+IkiE0bGAj2GrelxlGQLluwgWXcFpmds97lmPJFT8OSZN52Csz6DpOTYK2bokI5hpWMYsQymZUcpm4SzfiramPEontwKYAqCIBxMhpy1uWLFCtatyy4KOnnyZGbPnj1sjRIOTeF4mpXbQnREU1QVuLIFIfugmzodqWZ2xLYQ0ztxq358tvwWec2YaV7Z+STvhl4DCcx0ETPcF7JwQh0A06u/S2O7TKwM3PZjqS42USWFj1a+y/IXXmXH5m3d16ocO4qZn5lHyaRy3JLJ+HiYKrkWyV3V456GZRKOZbCwqPA7qC5w4bHv+StmpjMkNzVgptPYCovzej/ZC+g41t+PrEe7N53Q12GKh9S4r2K6KvO/B+CZO61n8GSZ2Z+VaWQT3Lu/DLLL25gYSQVTLUAZVYtrwlS0ykpRvFIQhENa3gFUY2MjF154IW+88QaBQACAcDjMMcccw5///Geqq6uHu43CISAcT7Nia4hQPE1VgQtZkth3USDTMgmn29kR20o43YZddlJsz2/tOoDmeAP/2v4Hwplspe5M6GjOGH0WR9S4uo+xKRpjdxWzz6TTfPD6Ct55/hXCbR0AyIrCpDnTmXXisXiqvKStFKVKgAmxIEWyh9RewYllWXSldBJpg0K3jZpCJ4VuW3eS9+5jUtt2kty0HdnlIN3U95pyfSZh7yYppFMBrM5+1ooBFAfos7+O5eg9XDZYwdpuiTBE2TNNEQlkZdeXlp0dqDqwVAdGZxwTBXX8aJx141DLy8W6coIgHBbyDqC+8pWvkMlkWLduHRMmZIvvrV+/ni9/+ct85Stf4Zlnnhn2RgoHt1AszYptIcLxNJUBZ48co926MmF2xrfRkcyO6RXmmecEYFgGy1qf5+2257EwMTNezLYvcNGsKdQW9w7CErE4a159ixUvvtad3+RwOZl5wrHMWnAMqlclkgmjKXbGOOoY3bkdZyZOyl3dPYUvkTGIJDO4bQoTyj2Uep19zgjU20PEP9hA2+8fH7QMQOUtl/cZROnhLrY/BpbRfy6RpMhUTLaj7qroYMQTJDc2kNywhcTaTQM9vj2chVA4JltCQVGzf8pqdnagbMtWB9d19J07kMvKcU+YiFZWKip/C4JwWMk7gHrllVd48803u4MngAkTJvDzn/+c+fPnD2vjhINfMJZm5bYg4Xim3+CpMfYxzckmMmYav62gx6K/A2lONPBq8xMcX34Wmmzn6cY/0JLYDkCmczq2yCK+dKyfEl/P4CkSDLHixddY89rbZFJpALyFAY48eQFHHHskik0hnOkgY8jUusdR7qikKLgeZ2wHSVclKcMikU6TNkzsikxtgZOqAhdOre+ZZWYiSXLTdsxkavAcJN3I5ir1EUCZ8QSWMfBi3pZhktzciBHqJLF+C+ntzXv1JOWoqA4KR/e724zF0IMd2KqrcUyZguLtf+FgQRCEQ1XeAVRNTU2fBTMNw6Cycmg5F59GoozB/uuIpli5LUQkmaEq4OyeCq+bGaJ6hEiyHQewPboJt82PP488J9OyeHvHcrYnPuaZhscJ6w0Ylo5lOEk2n0OxPIOLT9DwOvcEbOH2Dt56+t988NZyzF2BSElVBUedcgIT58xAVmSieifJdJxCeylV7rH4tQKcHR8iBzfSrBSRjhvYFQufU6XYY8fn0HrkOe3LMk2SWxrRQxEU334mU+v9D93tLfjo0z1ea2VFOOpHoxYFCP3jxf1rQkcHViqJY+IkHPXjkcRwnSAIh6m8A6h77rmH6667jqVLlzJnzhwgm1D+jW98g5/85CfD3sADRZQx2D/tu4KnaFKn0u9Et9JE051E0iGCqVYSehRMi3H4KLKX5zzjK5IO8uGOLt7cYGCWZssSdGQ2A6DHa0m1fJYx/lGcP0/DrmWDp1BbO2899SIfLlvZHTjV1tdx5KknMHbKRCRJIm0k6Uh14FI8jPcfQZGtnGRGoqtxHXLwPZKuQgIeL0UeO16nitum9Mhx6k+muZ1UYwtqSQF6W27LoYSefBnZuWsMzjKRMhGkTCdmPArk0DunqTgnjMFZPxrHhNGogWxvVn95V7mwTJPMzh3ITheu2bPRamrEciqCIBzW8g6gvvSlLxGPxznqqKNQdy29oOs6qqpy+eWXc/nll3cfGwwO7/pZwsGhrSsbPIUSUTzOJFu6QoTSbSSNOAAO2YnPVkxjm8TK9hSSZjGq1OpzeG9fD274fvabSthVugnLyqYkqa4G1DEPcNHk+1BkiVBrO28+9QIfLluJZWYPHj25nuM+ewpVdaMBMC2DcCqIiUmFczR+tZp0ys6ORJpivYXazEb8VRV4AsU4bQpSrB26OvtvoCOQXegXMLpiJDY1IDvsyDat31mH+0ptbuxnT25Dm2VXnY+9tqLXdtlpB0WGgYYBNQ15nyE5M5VCb2lGLSvDOXUqamF+MyIFQRAORXkHUPfff/8INEM4VGwNdvDGlm20xFpRtShNnXEkScGpuCi0lSBLCmsbjb0W41Vgo47PmS1iubsOU19My4Lg6VgFT/dYimX3n5YlI7V/gVBrO28//QIfLlvVnf8zZsoEjv3sKVSN3bMEUUKPEUmHsUsFFKg1aHohiqoxqshOpRqjqL0Bh8cPnl3T9YwMPHljds26/jgK4PO/wbIkkpsasOJJ1PJdJQtynE1YNDmG5tozTG5pHkxnDalMIZHXPhz0/D5780wTVUtQefNlmPZyurPM9yF7vahFRd2vjUgEM9KJva4Ox6RJojSBIAjCLnkHUJdddtlItEM4SFmWRVemi3AyzEdt21nZ2EAsHafA7UCTPXi18h5lCNY2Gjz6lt7rOpEEPPqWzvnzsov1GqZFMgOJtEUiDbFUhhXtL2IF/j3gUixmsooHf/pr5GB2WG/s1Ikcd9YpVIyu7dHmSCZENJ3CQy1jAmOpCvgo89kpcttxmlHY9iGQAk/NnhvIKrhLINkJ+649B4CU7X2SVVJbm0g3t6OVFu4Z6spxyMtbHcde5kEvmIFRMAPTWQWShNLUklMA1YtlQrwNXIWooyaDzZ3DKSZ6WxuSBI7p07GPGSOWXxEEQdhLTgFULBbD7R78H92hHi8cnDoSHWwIbSCUDNES7aIpmEa2nIwtqO1zOM60LJ5Z0zt42ttf39axKTqpvQ6TndtwlD+G4mhBAvT4KFTXtj6XYgEwNQ/j+gicIFvqIJRqxbIclNkmcdzo8Ywu9uDYPYMuk4CmVRBrh0DPc5EkmHkJvHBHP623QFYxn/4WaqQTHwZSpw5mBqwMcrsJDL6OXGrUFzHrpucccA3IMiHWBg4/lEzKLXjKZNBbmpEDAZxTp6KVle1/OwRBEA4xOQVQ48aN4xvf+AaXXXYZFRW9cysg+7/6F154gfvuu4/jjz+e2267bVgbKny6pI00azvW0p5oRza8RCI+XLJFobv/WVnb2qxdw3b9syz2BE9yElfZsyj+t0GykAw38eazMeKjcI35BdZeS7FIWhhLz85yW3jOZzhyVu+CrikjSWemA6dUjF8dw1Gjqqkv8+7pITIysGM1dG4Hf03fQ26Vs6BoPHR8TJ+9UG3rkIG+ButUVQG8MFDyuaogFY3tM3iSXU5QlUHrSMmuXcNslpUNnuw+KJ0EtsFnAfYoUTB1qliGRRAEoR85BVAvv/wyt99+O3feeSfTp09nzpw5VFZW4nA4CIVCrF27lrfeegtVVbntttv46le/OtLtFg6wrZGttMZbcUjFbOqIY1oDB08A0WRu9YgWHqHgL/6IN9r+RlQPAzAlcCTzy87i/23XiOgQ+/hWsBRAIhM+EiQDLAWfE+bMrOp1za5MmJSRpFAbjZsaZtUW9wyeTBNaPoT2jeCryg7X9UWSYMp58Op/99pljT+VTMZPJhhFKSgExYYladnq3bJG/ONW4CWQoHw+OBxt3eea9jLSoy9Edrv6rUSuFviovOXybJ0oQEdiJQFmE0bdFcx1VzLfHTzZPLuCp8FrNekdHVjplChRIAiCkIOcAqgJEybwt7/9jYaGBv7617/y2muv8eabb5JIJCguLmbmzJk8+OCDnH766SiHSJ6EqAPVv1AyxKbwJizdyaZgHMOyKHAN/mHrcQw+JCUpXWyXn+Ttne8C4NeKWFj1BUZ5soVbZ5c08dK2omzw1N1LI4GV/VU+bYbaY/jQtExC6TY02U6lYxKqWcL0mkDP4AmgfQO0fJBNGFcHmO1mmfDxPgtpSzIU1pEZ+0Xi729EqfKAo+c1zHSGjqey9Zm8x83GOb8cx6YHu/cn607H5isf9PmoBb7uIpsyEimKsWHvDqCybbSyQ5A2N5ROzvZADcAyDDLNO5Fdu0oUVFeLEgWCIAiDyCuJvLa2lptvvpmbb755pNrzqSHqQPXNMA02hjbS0tVFJOLNOXgCSOk9p8/LjkbspU+Raj0DM1mF6l+Bs+xfNKWSSMjMKT6BeaWnosk2gi1tvPS3J/n43Q+xlUwmM/EsrL0Cg75m8WXMFKF0BwFbEcVaHYbuZmqVv3fwFNoGO98Fu3/wHKEPHoMdq7K9SuaumXKWiTHpfJKbG5E0FdnROwCLvPgWRiiCEvDiX3gMhk3DcNagJLZjOGswvBN6nTNksQ7QHFAyMZv7NAAzmURvbUGrqMAxZQpqQcHwtUMQBOEQlvcsPOHw1hRtYm3bFoKdTiRyD56agiZ/e7tnb57mX4Xq3oxZ8CayFkZ1Z2fOlTmqWVh1AWXOapLxBK899QQr//06pmEgyRJzpxZwzJkuWhMa0aSFxyExqkTq0fMU07tI6F1UOEdRqI4mnpaZWulnQvk+wVNXCzStzA7ZOQMDv4nWdbD6d9nvj7oaNjwDHRuxisaRjBViRNrQKop7nZbe2Ubk1ZUAFJ5zErI9+8zSlWdgb/w76cozhidhHLLBk2rLDts5+w6GzGQSs6sLM5FAsmnZEgWTJyM7+i5tIAiCIPQmAighZ7FMjOVNH7AzZGGXVAoGyXnaLRi1+OPrGTIGjK4IM746ydsbDExfdphO86/K1nVC5ciSEzim9DQkZD54ewUv/d+T3Qv9jp06kRM/fxbFFdlZYWP6SOuxLJNwugNJkhnjnYJHriCSNLqDJ1neK1CJdWSDJyOdzXsaSKoLXv1xdghvzAIYf0p2uO+d/0em+iwyO9tRSwK9hr4s0yL42PNgmjinjsc5qa57n+mrJzH5P3N6hjmJB0FWoHRidkHg3W2wLKx4HCMaxUqlkJ0OlEAAx6SJKAUFKIEAkpxbjSpBEAQhSwRQQk4sy2LFjo/4oLkZt1RGoSe34CmesvjDaxliKSgPSHQEfkRHFKjcM1OtuxAmOsvaXmCCPovn/vQYjRu3AFBUUcpnPn82Y6dOHPBeupkhmG7FpxUyylOPagUIJdJMrfT1Dp66mqFxOSQj2Rl3A795eOP+bFK2rxLmXZttdOUM9BN+TOLdj5A9CrKm9To1+s57pBt2ItltFJx9Yk7PbEgSoWybSieBqxjLNDHjccyuLixdR3Y60EpK0CrKUQoKkH0+keckCIKwH0QAJeTko7btvLb1Q2xSgCJvbkuKZAyLP72RoSNq4XPpzJvxMe93VtOS7HupEgmZUTsm8vADSzANE9WmcdxnT2HOScejqANPTkjoMaJ6J2XOamrd9eiGrTt4mlju6xk8hRugcQXo6V3lCgYJJNb9E7Yvy+Y9LbgVNBdmIoneGSXd2IyZSmMr6D10Z3TFCD/9GgCBU49F9Q8+E25IEtnCnlZhPaZuw2hqRLIsJJcbrboKrawsGzS53SJoEgRBGCYigBIGtaMzwrMb15DWYUzAl8MSutmimX9blmZHfAuuytVogfd5oWXgIlC2pzx8vGk9APUzp3LS+YvwFQ6c1JytKp5dy26UZwIVrtEkMxCK9xE8WRYEN2eH7SQF/IMM20F2dt7Kh7Lvafql6EkPmffWo4cjmIkUkiKjlfTdxtCTL2MlU9iqyvDMm9F3+w0TK8c18vZlWoAN9EgEy1GBFTVRPBaOsXWopSXZoEksvSIIgjAi8g6gRo8ezeWXX86XvvQlamtrBz9BOKiFYmme3fA+rfFW6gpqegRPzYkGXm1+guPLz6Lcued3oSPZwpPrl9PqWIVrdAiAtAUeNcCkwCzKHNU82fg7sgUlrWw9SglikSj+4iIWXngudVMnDdo2w9QJpdtxqR5qPfUU2kuJpQ2CsT6CJ9OE9vWwYw1oTnAVDXhtACsZgZd+hGTq6P5pxDoqMXdsQNIUZLcTzedFkvsOJxPrtxJf8xFIEoWfW9hnjpGZyaC3hbILDefD0CETwzQNqK1EKhmPvX4GanFxNmgS9ZsEQRBGXN4B1A033MDDDz/MXXfdxYknnsgVV1zBueeei92e27COcPAIx9O8/PEWtnZuocpXjCL1HEZbG1rB9tjHrA2vwKcV8FHnataGV9CS2A5KNp9Zwc7EwHQmB+ZQ465DkmS6MmFcihctbWOB51j+ue0JLLfF7KOOY8GpZ6LlEADsHrIrcpRT66nHrXqJpfTu4GlSxV7Bk6Fni2S2vA+OwIBT+y3DxIjGMMJdKKt+jhpvxVD8xLynIbucKIX+QYfBzEyG0D9eAMB77ExsVX0vhWIEI9jKS3DU5TCMaJmQimRztmQVXEVkfDXwQQOeU8/F5nINfL4gCIIwrIYUQN1www2sWrWKhx9+mOuuu46vfe1rXHTRRVx++eXMmjVrJNopfMI64xne2drOxtBGPE4Lt5pd0iOSDpIwYgB81LkKgHeDb7K643V2L21iWTJGtJ5JgdmcPuEINLlnQGR1WRS9WE3T+q0c+Z9H8s6KD/jMhYuoOGrwHs3ds+yQoNZTT6VrNKqs9R886WnYuQbaPsouBNzHciaWYWBEYujhCJnWIEY0jtb5Dvau97FQSNd9CdU9eJHL3SIvLkMPdqL4PfhPObbPY8xkCmQZe20FineA2lOZBCSC2ZmCbj9UTcgmsruKMQ0DPmhA6iN5XRAEQRhZQ86BmjVrFrNmzeLee+/lgQce4D//8z/55S9/ybRp07j++uv58pe/fFAnrB7Olcg7ExlWbguyKbgN1CAFtpLufQ9u+H6v402r5zOKbbyduWP8nD5R6fE7YFkW773xDv/+6z9JJ1O4dq3ZdtGN1yBpg/8qZsw0oXQ7Pq2AWs84ArYSJEkiltLpiKWYUunvGTxlEtm17do3grcCNGd2Sn86g5lIYSZTGNE4mbYgZjSOZZjITjuaPYIr+m8A0lVnYrpzH6pON7cTeWU5AAWLPtNd82lfRiiCraYcpa9lW0wDkuFs6QTFBt5yCIzK/qntldN0GP5uCoIgfFoMOYDKZDL8/e9/56GHHuL555/n6KOP5oorrqCxsZHbb7+dF154gT/+8Y/D2dZP1OFaiTySzLBqW4jGzhC6uhMnLlR5Tw/HGdWX8EzjHzExe51rWTLJHV9gQrmP02b0DJ7iXVGe/t2jfPzeWgAqx47izEsvAAOkHJb/iWY6SRhxKpy1VHvqcCjZIat4up/gKRXFangHs3kjplaM2RLBjO5E74phJlJY6TSWYWXrTzntqEV+JFUFI4lz/R+RLB3dPwW95Picn51lWoT+vqvm0+Q6XFPG93mcEUsg2W3Yayp6/icjHcv2NplGtghmxYxdvU2Fw1doUxAEQRgWeQdQq1at4qGHHuJPf/oTsixz6aWXsmTJEiZO3FOj59xzz2Xu3LnD2lBh5HUlM6zcFqI1kkTSWkgmoxTbK3ocMykwm65MJ6+1PNHr/PjWa6l0V/O5o3quR7fp/bU89dtHiXdFkRWFBeeewZyT5iMjwY54v+2xgIyh05FqQ8VGuXMSAaWcrrhEyEigmxYWFpPLfUwosGF1hknH4pjBnRgfv4PR2oSl+TEzQQAkWUaya8g2G5LHhbRvaQTLwr79/5BT7ZhagFTtF/MKXGIr3ie1dQeSTaNg0Wf6fk+WhdHZhaNuFIrHCUYm29uUjmZ7lwKjIFAz+Jp8giAIwgGVdwA1d+5cFi5cyC9/+UvOOecctD7yL8aMGcMXv/jFYWmg8MmIpnRWbQvRGknhckVpijTh1wp7DcMalsHy1mxtI8vKxheWJSFJFi4bXHishqZkz8mk0vz7/55gzatvAVBcWc5ZV1xMaXU2KDONbC9WOJHGsCQMy8quC2xZSEikzQRxM0yhVkqNZxx+ewGqLOGwqTg0GWcmhX1nIyWbthD/MIGVTGHFQ0ihrWAkkQNlyA47iqb1O1tub2rwHdTQaixkUqMvAXWQxGzLgkwcDB0jGiP8r1cA8C+YjqomoGvv4DB7f7MrjgzY3Ano3J4tp+AMZAtgesuzSe6it0kQBOFTL+8AavPmzYwaNWrAY9xuNw899NCQGyV8smK7gqfmSJIyn8r6yGYkJGxK77XRnt/8JkkrjGWBmawkEz4KLbAcSQsTj3vY1mYyuVqhtXEnj//qdwRb2gCYe/LxHH/O6ai7Am4T6IilKAL8ThuaJmNTZGyqjCxBRA+BJVFXMJfxBePw2ByosoSqZMsBWJkM8VUbSe/cBh4vkt2OIqeR0kEI2MBdCVLuy5NIiZ3Ytv8dgEzl6ZieMYOflOoCSwfNTeiF1zGTabTKUrwnnwSaLTsNUVKyAZEkY1lgGK04j5iKUjc22z5Zyc4KVEQiuCAIwsEk7wDqxBNPZPny5RQV9ayjEw6HmTVrFps3bx62xgkjL57WWdUQYkdnguqAi6b4x3SmO3oN3QEk9SQfRp8DBVItZ5AJzQckMuEjQTLAUnlmjU56ywpe+MvfMTI6noCPM798IaMn9swHCsfSeGwakGJyhQ9ZzQY7aSNNS6yFCq+fSUWTqHBX9F5fzrJIbthAumE7WmVVdhZatBmC67P5Q+6SfntxpHQISY/13GiksTf8CcnKoLvHkik9od/npYcimPFENoE7GYLCsaRaItmaT4D//IuQyif3ea7R3o5aMx7b5Dkgyn4IgiAc1PIOoLZu3drnzLRUKkVTU9OwNEr4ZCTSBqsbQjSFElQVOInpYZrjDXhUP3IfvTcvbX8FlChmupBM6BjoLqspgZX9VYok4KnXV6BkdMZOnchnv3whTk/PafqxdPb3Z4zPJNUOhLeDptJpJIgYSWq9tUwsnIzHXrBnnHAvmcZGUhs3ohYVZWfvdTZmK4bLCrh7L6nSzdRxrL8fWY/2e4icas3WXOrj/euhCDt+8hvQ+5/91r50KZX//d+o+/wHw9J1rGQC+7SpyCJ4EgRBOOjlHED985//7P7+2Wef7TEzzTAMXnzxRUaPHj2sjRNGTkc0xQdNnTRHklQVOJEkk6b4ZjJWGr9a2Ov4uB5lfewlAFJtpzLgr47Dx4Jzz+CoU0/s1XuUMSyiqQzjil0UpLbSTBFG+3qa9QiarDDdXsIo3YbaFcyuPSer2WRqzQU2N3o0TeLdtUjIyLIDgq0Q3JRNwLYPstacpGBpBVh6DGlXzaq9WYClFWSH3fpgxhMDBk/ZN5jB7OqCfQIovb0dtawcraJ3z54gCIJw8Mk5gDrnnHMAkCSJyy67rMc+TdMYPXo0995777A2Thh+pmnREIzzQVMniYxBVcCFIku0JJroSDZTYCvt87y3257DIIWRqEKPTBvwHicv+gxHzuy9zpwJBOMpyn0OqrRoNvihiJ2qRql3DJM8NRRrXjD1nl/JCMSDmIkkyY+2Yoa6sJUEoHE7WEY2h8g2QDHK3SSJTOVpODY92PduIFN52rAncZupFJgG9rqxouilIAjCISLnAMo0szOmxowZw/LlyykuHmCoRPhUSmYMPtoZYWNrFJdNpbpgVy0lPUpjbDMOxYUq9/6VCKfbeTf4JgDpttOBfpKzLQuvE+bMqOxzdyiWxu/QGFOgkWnZRFDPzlIb56lggqcSh7Kr6KSi9UqqtgyTZONmMgkNbVQ9KHJ2eA8rr2RxwzsBw1mDnGjs0QtlIWE6qzG8E3K+Vs73bG9Hq65CLet7SRdBEATh4JP7J88uW7ZsEcHTQSgUS/POliDrmrsodNsodGeDFcuy2BHbSlzvwqP2XTD0jZanMS0DLT0ePTZu19Z9h8CyuUqnz9R61IDaLZY2kDAp9pu0d7xHZ7SZUm8NAJPctXuCp36kGneS3t6CWlyAtGsm3u7ZbXmRJDLlC3sN4UlYA/Y+WaZFauv2/O4FmPE4kqpgHzu2zwWFBUEQhINTTj1QP/vZz7jqqqtwOBz87Gc/G/DY66+/flgadqAdKku5WNbuIbsI8bROTUF2yG63YKqV1mQjAa24z6V3WhLbu9e8Czeejk2Fo2oSvLFex7TtyTnyOSVOm6Eyubp3/lAik2JntJ2qAhW/7KJKh/KSGXhclTy9Izzokj+ZthCpTduRvS5k2/4NgemhENaGN0hEe17HtJeRjgSQjQjqXsurZNqCxFatJbZqLUa4K//7dbRjHzcOZZ+cKEEQBOHgllMAtWTJEi6++GIcDgdLlizp9zhJkg6ZAOpQWMolpRusb+5iQ0sXDlXpHrLbLW2kaIptQkHBpvQ9M+zV5icByHTOwExVcvzoNlY88j/YEikctVOZffoZVFcXMapE6tHzZFkWSSNONBMhlMgwrqiCE8dOpDy4DactCr5qMkbvRO59GbE4iY1bsSQJ1TNIYctB6KEwO+/5Ddml+0r22WsCfwBVoezrF5HeuoPYyrWkt+/cc4hNhbSe8/2MSATZ5cI+ZsxBvS6kIAiC0FtOAdSWLVv6/F749ArH07zf1EljKEGp147LtudHbVoG4XQHrYlGOjMhiu3lfV5ja3Q9DbENWKZCqu0UpvlbeOuhpZiGQdXYUZx3zXm4fT1nvhmmTkyPkDSTOBQXNio4srSKkyaMxZtshc4d4On7fvuyMjrJjdswu2Ko5fs5bGxZyFuewxqsQ1E3aPnZH2BXzh+yhGNcLe6ptSijp9F63wM53s7CCIdwTJ2KcpAG4IIgCEL/hryYsPDpZFkWjaEEHzR10pXMUF3gRN2Ve6ObGcLpdprj24mkO0CSKbAV91nzybJMXtqRXe8uEzqaMlNn499+hgRMmD2dz375i91VxQGSRoKYHsGyLLyan2rPOCTDj4KDo8cW4VWB1nXZWk1a7wrnfb2P5JZG0s3taKVF+92Do7W8iBFaRe+epz6YJlplCe5ZU3BPn4BCF/hr0JUS0DTIZAa4kYbs9WKEQih+P/ZBqvYLgiAIB6ecAqibbrop5wved999Q26MsH/SurlryC6CbdeQnSRJpI0UoXQrLfHtdGVCqJINv624zxl3u70fXEUw3YRl2FHbZhF+cSkScOQpJ3DCeWciSRKmZWZ7m4w4NtlBsaOCEkcFXq0Q3ZBoTaaYXeuj1OuA1o+ga2d2sdwcZHa2kdq2A7XQ32PR3+5K4P2QXc4eOUwAavub2HY+TdzMLX+q6KIzcU/ftTh2ohMkNxTUoto8VP73f2frPPV3f68XJRAg09SEc9ZMZNf+DTsKgiAIn045BVCrV6/O6WIiz+PA6Uxk+KApzPZggmKPHbddJWnE6Ui20JpoJKp34pCdFNjLUPopFLlb2sjw76anQAa9/Rh49REky2Dhhecx64Rjuo8LpdtxKi5GeyZR4CjBpXiygZVp0RKJMa7Uy5gSDyQ7oe2j7EK58sD3BtDDERIbtyE5bMiOPblZuVQCR1WovOVyFL8XvT1I5qNl6OtXkAwWkwwNPNNvN624IPuNoYMeh9KpYPNkL19U1KtIZq/2t7WhFhdhq6nJ6X6CIAjCwSenAOqll14a6XYIQ2RZFk3h7JBdJKlTFXCSsmI0RJtpTTSR0KM4VTcl9gqkHKf8P7b2dQw5hJnxYr3wMZoZZ9E1X2L89Cndx+hmBrAY7Z1Agb1n8c3sosROplT6USSgbX22GGbB6EHvbSZTJDZsxUpn0Mp6Bio5VQLXDdofeYJMewgrmdq1MYcim31JdICnDLy55WxBdpFjM5XEOf0IZFtuAZsgCIJw8BE5UAexjGGyobmLj1q6UCXwu1M0xLbSntxJykziUb2UOCrz6hlctS3KduMFZBWMdwuwx9r4/HVfoXbCuB7HdWXCBGxF+G09g5xgLI1NlZla5cdpUyCyAzo2ZQORQdphGQaJjdvQg51o+5E0nm5sBkBSLBwFaeyVAZQpJyLZbLT/9h85XiQGig0KxuTUa7ab3t6OVi6WbBEEQTjU5RRAnXfeeTz88MP4fD7OO++8AY997LHHhqVhwsAsy+KDpk4+2tmJZo8RNlsIhlswTAO36sVv672e3WCagibPbf03WlEcM+rG8V4HF9x0NRWja3scZ1gGhqVT6qxG3ms4MJkxiKd1Zo8qoMRrByOTTRyXJLANnAtkWRapbTtI72hFLSnYr6KTvvmTKfS8jcMbxfBPJDX2yyCrpJtacruAaUKqE4omZJeJyZGZSgEW9ro6JFX830QQBOFQltO/8n6/v7sX42CtiXSoCcbSfNC8nS6riUQ8iIWFTw1gsw0+w60vXQmLP73VjlrzOgC2d+Cim6+lpKp3T0o004lXCxCw7ZnRZpgWLV1J6ku9jC7aNWQW2gaRJvBVD3p/vS1IcksTis+DvJ/rxRV4luP0RzHco0mNuTS7IDHZBHNUZdAcKllJgasK/L3X8xuI0d6GVlOLWtr3eoKCIAjCoSOnAOqhhx7q83vhwLAsiw2tQbZGP8JpT+G3FaHJ+eXbmJbFtjaLaNLCaYMX3k2T8b2ITc4gtWn8xwXfoLCs95R/0zJJmQlGeSf0mMW3szNBhc/B5EofsixBqgta14LN23Ndu1hbNqkcwLDwx7swG5vIfLwNRTdQtHIsnEN6LrtJRhzTUUFy7BWwV4FQtcBH5S2XDzyLzyahuuRsvtYgy8vszYzFkDQtu2CwWLJFEAThkDfkcYbW1lbWr18PwIQJEygV/+v+xARjaVbv/AhJiVFkr8o5OXy3tY0Gz6zRiewVR8i2dlyVKwA4vf7CPoMngJgewaP6Kdir9ykYS+OyKUyt8uPQdg3ptW2ERLhn4riRgSdvhGQYAA04AWA97A5zzHYviSnf7u41GgpL85McdxWovYcN1QIf7FPmYM+JJkRbwD8KXLkPgVqWhR4M4qgfj1qY/9CpIAiCcPDJ+7/KkUiE//iP/6CqqooFCxawYMECqqqquOSSS+js7ByJNgp7sSyLd3c0sjOxnSJH4ZCCp0ff6hk8AdhKnkWSTAqpZ1LVzH7vndBjlDqru5d+iad14mmdKZV+ijy7wqBoK3RsBE9Jz8RxWQV3CdDPgr1IWFoA+imzYETjOb3HVM3nsLR+gqSBJMJgD0Cgpt829sXs6kJ2u7CNHp3/PQVBEISDUt4B1JVXXsmyZct48sknCYfDhMNhnnzySVasWMFXv/rVkWijsJfWrjirW9bhtIFTzW96vmlZPLOm91pusnMbmu9DLEsi2HQmptX3GnUJI4pT9VBkLwNAN03aulKML/VQW7irt8fQs0N3pt5dO2k3yzAwJnwe6Pv6EhaZytP6nK1nWRaR11YM+h4l2UL2D2EGn54CMwOFo0DNPY/MMk2McAj72LEoviEEbYIgCMJBKe9xkieffJJnn32W4447rnvbqaeeyoMPPshpp502rI0TerIsixVNm2hPtlAXyC/BGWBbm9Wr5wks7KVPA5DpnE0qUsa2Nosxpb2DmKjexSjPeBy7hsaaO5NUBpxMrNiV9wTQ2QDh7eCrxEylMWMJjHgCPdyF0dmFlZBxq+UoegvSXoGUBSCpaC0vo4TWYNkCWFoAS/Nj2gLE1rWR2tgAQMW8EHZv34v6Sv4yjIKC/B6MZUE8CP4acOc3FG2EwyiBALba2sEPFgRBEA4ZeQdQRUVFfc7E8/v9FOT7wSXkpamzk3dbPqLQ6R5wGZb+RJO9e34UzzpU11YsUyXdtrDf45JGHLvsoMiRnZUXjqexazJTKn04NAXLNDHD7ZgfvoXRGUHfEseIxrGSKSzLQlIVZIcdpcCH7jgLddODPa4vAVg6SnQj+w7g6UmZ8NMlgELREWkCo/pPAk/WnT5ovaneJ0XAnl2uhRyHRC3LwuzqwoxGcc2Zjezcv8R3QRAE4eCS96fwt7/9bW666SZ+//vfU16erdDc3NzM4sWL+c53vjPsDTxQli5dytKlSzGMQSpff0Isy+Kt7WvpSndS7xnaArUeR8/AQnZsw1n1JwDSweOwdH+fxwFEMxHKXbW4VS8ZwySSzDCzzIk31EpiSxi9vR2zcR1m6yYkdxGS3Y7ksKF43UhKz6DESmZnt1lkAycLCdNRRrrqbORMBCnTiZQOI2XCSJlOmt9MY6QU7IEMJRPa+34+SJjOagzvhPweipEBPQGlU3oNOfZ5H13HCIcxE3FkjwfH5EnYqvLvDRQEQRAObjkFUDNnzuxRzXrjxo3U1tZSu2vYoqGhAbvdTltb2yGTB3Xttddy7bXXEolEPhW1rzZ27ODD1o8p95TknTi+WyxlsidsAXvJc0hyJtv71LEAAJ8TRpX0DKDSRhJFVihxVALZpVpq3ArljR8Ta2oCRUaWdWQzhFJTg2QfOBDRWv8N7EnTlrDIVJ2F6ZuAuc+x8Q820tXwT5AlCi44h2SJitK5Dlvbyz2OGyh/akCJYE7LtZiJBEYohGVZqAUBHJMmoZWXicWCBUEQDlM5BVDnnHPOCDdDGEjGyPDW9g/IGDr+QYKT/qzcbPDkSh1JDSMpMZB0FPfm7E5LRrYFAYsFR/iQpZ4lDLr0Tood5Xi1AMFYGrcMdaFGzB1NaJWV2R6mlg9BAQZpnxzfgRpZhwWYjgqU5E50Z02fPUdGLEHw7y8A4FswF9vYiZiA6alDiW5CTjQiYQ299ykZ2bVcy+g+l2vpHqaLdCJpGlpVJbbqatSSEqT9LPYpCIIgHNxyCqDuuOOOkW6HMIAPW7eysWM7lb6hra/2+kc6L7xvABLe8f/d+wA5jXvMzwF4OQKzWdK9K7toMJQ4qsgYFrFEipnJFmxt21HKy7NLlkSbs1+uwXPgtJYXATAC00kWzcNs/Cdy5Zl9rtcXeuIlzGgctbQQ/0nz9uyQJDKVp+HYlUc1pN4nPQWZBJRO6rVcy77DdPYJE9GqKlECgbzWFRQEQRAOXWLBrk+5aDrK240foODErdkHP2EvlmXx/PsGb67P5nFpzU+jVTjJBHomYe+OCWRkTqu+qMe+3YsG+7QCmkJx6rqaKQxuRy0tRbbZwEhnl2yRtUErd0updpTwuwBkyk7CcFXz8uQfcQLtqPuUNkis20R8dXYdvaIvnIak9fxVNbwTMJw1KIntGP30YPXLNLOz7gpqwVe5Z7MYphMEQRBylHcAZRgGS5Ys4dFHH6WhoYF0Ot1jfzAYHLbGHe4sy2JN83q2d3ZQ7Rl8Pbm9GabFkyt1Vm81QU7gkH+Ndnwjmb5rVAJwUd0NlDlr9lzDMtB3LRociukUdeygKtKIraR4z6yzyI5sAUpP2aBt0lpeQsJC903EdPWfeG0mkgQfyw7deY+bhb22j543SSJdeQb2xr+Trjwjv96neBu4i6FwbHb4LxIRw3SCIAhCXvLORv7e977HfffdxwUXXEBnZyc33XQT5513HrIsc+edd45AEw9frfFWVu7YgFMO4NRyj3UzhsVf39ZZvTWNFngDz+j/QhvfCArUusdzRvV/7DpS2ufPnqKZTny2QpxSIWZTI2M6tuMuLEB2u0BPZte1Czdk854GWf9NynSiBpdn21d20oDHhp58BSMSRS0uwH/qsf0eZ/rqSUz+T0xf/YDX6yERxsKGoZWSaQ2SaWzEMnTsEybinj8f19y52bwuETwJgiAIA8i7B+oPf/gDDz74IGeeeSZ33nknF154IXV1dRxxxBG8/fbbXH/99SPRzsNOxsyweudHdERTVHpzX18tlbH405tpGhMf4B77NLK9AwAvBSwc9QVGeyYS1TtxqV68WoBpBUfzfuhtujJhXKq3+zqmZZI2k9Q46ols2U7djrUUBRQUvQ2aNkI6DkYSkMEZGLRdWusrSJaB4R6D6Rnb73GJ9VuJrfgAJCj8/CnIwxDIWLqOmUhhdnVCogvKJiDbfWjFRWhFRaglJWKYThAEQchL3gFUc3Mz06ZNA8Dj8XSvf/fZz372kKoDdaBt79zOh23bcKkFONQBxt32EktZ/O7tzUScT+Is2gqAFYe65DQWzb8Medcac14twJX130WRFCRJ4oiCeRiW0V2cUzJSpJItFBgZCja8R+HHH1HpBM3phJQMqg0UB9i9g/Y8AaDHUdvfAgbufTKTKYJ/ew4AzzEzcYzJb9hyNyujYyZTmMkU6AaoCrJNRfPLaLM/g1x3JIrPJ3qZBEEQhCHLO4Cqrq5m586d1NbWUldXx3PPPcesWbNYvnw5dnt+Sc5C37rSXaxq/ohEwkaJu3eFa9OyWLOjgTWRJ5jhO4sZlbXsiAT56/onMIvezf5QdQlzFYxOT+Kcr3651+yx7krmloGqJ7DpCWQ9jpoKI2VixDNtjE748G1JUui046quziaKD2EWmtb2GpKZxnBWYvgm9ntc+OnXMDq7UAr9BE6bn/P1uwOmRBJLN5A0Fdlhx1ZeghrwIrudKJk2pOJZUHtMNgAUBEEQhP2QdwB17rnn8uKLL3LUUUdx3XXXcckll/DrX/+ahoYGbrzxxpFo42HFsiw2hTexLdyOTS7Ervbs4VnbaPDMGp2U7x1shZt4dvOb/HvLKvC/geQywJJwtpXS9WQbfmcRZ33rkn6n3mvxZhxd25HNFJKpAxKmYiMimdgpQtkh47FpBMZW5rzESS9GCq3tdQAyZZ/pNwBLftxA9O3sDL2iz5+CbBu8d8hMpTE6OkFTkZ02bBWlqAW+bMDkdmZLLAB0NYOjGCpmiOBJEARBGBZ5B1A/+tGPur+/4IILqK2t5a233mL8+PGcddZZw9q4w1FLvIUPWjehp7wEnD0/7Fc2tPGvdyOAhNOXDTa0wDvdMYmVHMX0xBRW/eVZZEXlnBsuxeHqe402yUjjiDYimyl0zYe119p6sVgLNVt0CtMapfXVyEMNngC1420kI45pL8YITO/zGDOVpmP30N3R03HUDb4wr2VZ6B1h7KMqsVWW9gyY9pbsBMuEiuk55WoJgiAIQi72uw7UvHnzmDdv3uAHCoPKGBk2hjbSEUshS/4evU+mZfFy5Ae4x2RfW7vKJu3doSM5tvHub1sBOP6c0ymv7T+HSEu0oWS6SDtL2XsWXjIdI9DQSWGnndL6Gmx5zP7rxdTRWl/OvrfSE0GS0UMRzHi2DpWOhJ0U4Zefwwh2IntceI6ZmdulYwlklwN7TQWKp58EcD2VXaqlchYEavo+RhAEQRCGYEifjuvXr+fnP/8569atA2DSpElcd911TJiQ51IaQg8NkQY2B3eQSXrxOXoOYW1rs0g0XYCj8q9IktlrJMyyZJI7voDsXsnYsQpHLlzQ730kI409vgNDcdKjhIFhYm1rwteSoaxuPF7P/uW0qcEVyJkIpuZDL5yDHoqw4ye/ySZ27zIKSO763ozGaf7Z76m85XLUAl+/17VMC6MzimPC6P6DJ8uErp1QWAcl/eddCYIgCMJQ5D0287e//Y2pU6eycuVKpk+fzvTp01m1ahVTp07lb3/720i08bAQSUfYGN5ILKlhIffKfYomLfTITOJbr+3z/PjWa9EjM9G8RZz55QsHXHIk2/sUxbDtKVuAaSE37sTe2ElxRRWlASdSP/WhcmKZaK0vAZApPQFkNdvztFfw1Cfd6O6h6o8RiaL4PdgrS/s/KLIzWyyzYjooouC+IAiCMLzy/mT55je/yW233cZdd93VY/sdd9zBN7/5TT73uc8NW+MOF5ZlsTm0mdZoF/GEq1fvE4DHkQ1mJDm2z7kSkrRnGZSjT5iDN9Bzbbe97el9ctHd+2RZ2JuDJLftwO4vYkxJCaoy9LwnACX8LnKqHUtxoRcdvV/X2ptlmJiJJK4p45Ed/fSQJUKgKFA5c9DFjQVBEARhKPIOoHbu3Mmll17aa/sll1zCPffcMyyNOty0xFvYFtlGOuXCgl69TwCjSiR8Tkj5PgTAMmykWs9AC6xA0sJYGTeaGefYY+oGvJdtV+9TNvdp17a2TtSGZuIOjQmlFXj7COB22zuHqS+yy4ka8KK1/BuATMlxoGQDHcu0+j0vV3o4glrox1ZW1PcBmWQ2cbzmSPCW7/f9BEEQBKEveQdQJ5xwAq+99hrjxo3rsf31119n/vzca/cIWWkjzYbQBmJpk864hN/Z949EliQ+c0SKF8KrAUg0XYgRm0QmfBSgg6Vy5iwDeYChO8lIY9un90nriODc1koLKYoDJYz2F/R7fl85TL2oCjVfPR4lsQNLtpF0zia5ai2J9VtIfLRl0OcxECujY2V07LUVvRYXBsA0oGsHlE6ConG99wuCIAjCMMkpgPrnP//Z/f3ZZ5/Nf/7nf7Jy5UqOPjo7NPP222/z17/+le9973sj08pD2LbINtribaSSHkxLxzbA0FnU/hqSnMZIVGHEdidGS5CMcUxNFzPGDxw07Nv7pEbiuLa1kjRNdLeD+kAp2gD3zzWHKbXmNeJBL9H2YlJtvx34+DzowU5spYVoxf0sbRNpAl8llE8DObfq7YIgCIIwFDkFUOecc06vbQ888AAPPPBAj23XXnstV1999bA07HDQmepkc3gzmC6CMQO/s/+hs6QRZ3XHawCk2z/D1BqZ1hXPE27cSn2tm4ULLhvwXr16nwwDR2M7VjpDhwuq3D7KXf3nTuWj9Q0d8AIpALSqUpz1Y1AKfIQee35I1zRTaZAlbDUVSH0FebF20FzZvCet79pXgiAIgjBccgqgTNMc6XYclrZGthLLxIjGfZhWasDep1Udr5I2UxjJcvToJCpda9n0/ks47DZOu+jWAWfdQe/eJ1swihqO0uG2Y9PS1PlLUHNZ1y4HsmbgGu3FPmsBjvGjULxuANJNLUO+phGKoFWWohb2EeSlY5CJw6h52Zl3giAIgjDCxPzufixdupSlS5diGIMMWe2HpJ4kpSu0R9MD9j6ljCSr2l8Fsr1PNYUSK/75dwCOO+tUPIH+ayZB794nKa1j3xEkoagYikmlx0ux3TvgNfJRc0IQ5l+OZe8ZzMguJ6jKwMOAioxMPDuTTlZB1jCSOpJNw15T3jtQNDIQbc0O2xWMGbb3IAiCIAgDGVIA9corr/CTn/yku5Dm5MmTWbx48SGVRH7ttddy7bXXEolE8PuHZ2irFwtaI0lMSx2w92lN8HVSZgIyJehdU7Eb79IejVFUUcrsE48b9Da2RBtKOkratav3qb0TqytO0ufC4chQ4ypCk4cvljb9E5DsvXuC1AIflbdcns2lskz0WIiVnnHM9rpQrQwYOrJTQ/U4IBODTAIrE8dobcMxqgTV7IBwEGQbKBqo9myl8YJaKJs8pIWOBUEQBGEo8v7UfOSRR/jyl7/Meeedx/XXXw/AG2+8wUknncTDDz/MRRddNOyNPFSFE2mCsQxV3v57nzJmipXtLwOQaP0MNgUaX3ocCVj4xfNQ1IGTpSUjjS3WhKG6AQk5kULdESRu03C6JHwuF0W2gXuw8pUpnEt/S/aqBT4o8EE6hmy4STmrsJWW9T18aBmYHW3IrrHY5kwDh5odrktGIBUBIw3OwmyxTHX/qqYLgiAIQj7yDqD+67/+ix//+MfceOON3duuv/567rvvPr7//e+LACoPrZEUlmUN2Pv0bvBNEkYM1SxCjxyBv2s9aSPNxDnTGTVx8Kn6tkQrSiaW7X2yLNSdIdLRJFKFA5vdpMJeiF3pP4DbmzXYDLzdHCWDH5OOgq8GBkivsywJI5HGOX06StX4fXdm17oD0By5tUsQBEEQhkneWcObN2/mrLPO6rX97LPPZsuW/avzc7jJGBaq3P+wU8ZMs7w9uxxKrOUEQCG59iUUVeHEz3120Otne5927Ol9iibI7GwjWWBR7HYz0VNDlaOfkgB9iL7z/uAHKXI212kg5q5AzN1PMcxdjGAQpaAQW00fCwFLUjZwEsGTIAiCcADk3QNVU1PDiy++2KuQ5gsvvEBNXx90wpC9H3qbuN6FnQK6wrPQkm1IXU3MPuUEfIX9F7zcbe/eJ9MwiW7ZhpcU9WV1jHaX4FD6G2jrLbFuM7EVHwAQOOtEHGOquvepLS+jhlZjuqrQJ1424ELAAKSiYPOC3Q9dHX0eYuk6ViKOc+oUZIcIkgRBEIRPl7wDqJtvvpnrr7+eNWvWcMwxxwDZHKiHH36Yn/70p8PewMOVbuosb8suh2J1ngAosG0ZTpeTeaefNOj5kpHq7n1KmzrtzY2M6kozccxEarzFSFLunY9GJErHX58BwHvcLHzHzdqroTFc7WuQCjMk6xaCL4d8Kj0OgfrsLLv+DmlvRy0vR6uszLmdgiAIgvBJyTuAuuaaaygvL+fee+/l0UcfBWDSpEn85S9/YdGiRcPewMPVh+F3iOqdOGU/rTtng6mjNK/hmHNOxjHYEBnZmXdyJkq7zU1nNMS4oMz0klGUBkoHPXdvlmnR8ZenMWMJtMoSCk6ahhxv7N6vtr+FZKYx7CVYihspHcayBfq/oJ4CWcsmf/fDTKXAMLCPHYuk5ZafJQiCIAifpLwCKF3X+cEPfsDll1/O66+/PlJtOuwZlsE7bS8C4E0voNVSUVrfI+BzMPOEYwc9XzJSEG1gJzqSAROjfqbJGkUVZXm3pevV5SQ/bkDSVIovOA3npp8j69FexympNpwb7sdUvSSmfLv/3qVUFJwF4PBBP4sL6+1t2KqrUcvFYsCCIAjCp1NeSeSqqvLjH/8YXddHqj0CsC68gkgmiEvx0rRtLgDKjhUcc+ZCVHXgmNeyLJJdm4ik2gnYqhhrVDE1LREIeJGU/NaHS23fSfjZNwAoOPszaGUlWFoBFn0nvltIWFoApH7uY1lgpsFTCv1cw4zHkVU12/s0TJXRBUEQBGG45f0JddJJJ/HKK6+MRFsEwLQMlrW9AECVuoBkWkNKhCiQQ0w5avaA52bMNB3xbTgSbdQ56iilkjrdwK+nUfz5VRo3kyk6/vgvME1cR9TjnjsVJIlM5WlI9N1zJGGRqTyt/4KWmTiorgGH7/SOdrTaWpSigWfoCYIgCMKBlHcO1Omnn86tt97K+++/z+zZs3G73T32n3322cPWuMPR+s41hNPtOBQ3HY27ep92ruKY00/qt2imZVlE9U5SZoJqS6OeAkJUUm2TKWrtRPG6kXaVS5DSISQ91u/9LdWDZQsQ/MeL6MFOlAIfhectRJIkpFQHUrINS3aAmezRh2QhYTqrMbwT+n9z6Sj4q/td7NeIRJBdLuxjxgy6tp8gCIIgHEh5B1Bf+9rXALjvvvt67ZMkaUTXjjvUWZbJ223PAzDZu4BXPrCDZRKIb2Lq0af2eU7GTBNOt+NUPdS76qlrX0/I8FMecFDR2YERTyJX7Cpsaeo41t/fZw7TbqbqpT31OeKr14EsUXr2VBwdz6BEPkJOtfV73qC9T7trP7n6XuzXsiyMcAjH1KkoI7V0jiAIgiAMk7wDKNMcoHS0sF82RN4jmGrBLjtJB48CQA5u4riT5/bZ+xTTu4jrUUqd1VS7x1IYaSIe6cBdNJZRmoXR3IZa4NvTmyMp2RwmPdbnMJyFRCruIfhEdgixeEqUQOr/oG33fhnTMwbDOwEltBI52YqElVvv0+7aT45An7uNUAjF78c+alTuD0wQBEEQDpC8AqitW7fy/PPPk8lkWLBgAVOmTBmpdh12LMtk2a7ep5lF83n9jWzQ4w6vZeq88/o8Pq53MdY7mXJXLaqeItW8HrurkHElHqSNW7AMA9m5VxHKXTlMjk0P9t0Iw6L55QxWRsJVkqJ4Uiem5sPwTcLwTcTw1oOSvZ7pquq+zqC9TwB6AgLV2UWA930vhoEVjeKcNRPZ5crlcQmCIAjCAZVzAPXSSy/x2c9+lkQikT1RVfnNb37DJZdcMmKNO5xs6vqQtuQObLIdf+Y4EoYN0nGOPqK4z5l3cSOGU/VQ7KhElhTirZsoNLuorZ6Co6uLWEsHSkHvoTDDOwHDWYOcaOzVC9X2vpdk0IZsh5JFM0lUT8dyVPQZGO2+jpLYjuGsGbj3SU9nyxr0kzxuhELYiov6XrJFEARBED6Fcp6F953vfIeFCxfS1NRER0cHV155Jd/85jdHsm2HDcuyeLv1OQBmFM5n+YcZALS295i14Og+z4nrUYrt5dgUO9GuMM7IZqrKKwnYFVINO7Nr0tn6KELZz0y66E47HR9lZ+oVnn821vjTsZyV/fcqSRLpyjMw7aWkK88YuPcp1QXOANj7ngloZtLYx49HtuW+tIwgCIIgHEg5B1AffPABP/jBD6ioqKCgoIB77rmH1tZWOjr6XstMyN3W6Ee0JBtRJRuTvMezrTM7TDalPIPT3XtIK2OmUSSFAnsJ8bSOGdzGGHeG4pIyMi0dZDrCA65HZ7hG96jllEkq7HgnWzbAc/R0XFPH59Ru01dPYvJ/Yvrq+z/IssBMgacM+lk+RispQRNFMwVBEISDSM5DeJFIhOLiPTOoXC4XTqeTzs5OikTNniGzLIu3dvU+TS88htXrDJBsSJFGFpw9o89z4noXXi2AJnkIhcLM0VooKSjDTKVJbtuB7LT3WzRTD0Vg52qSwV0/eguaV/swEqAW+vHsvc7dcOin9pNlWRjR7GxA29ixSIMUCBUEQRCET5O8PrWeffZZ/HtNMTdNkxdffJEPPvige5uoA5Wf1tQ2dia2okoac4pO4IHXMiBBpbyTgpK6XsdblkXKTDHKOYH2qM4ke5AqLYXsqiK5pRGjM4q2u2zBPvRQhB0/+Q3oBtD7GD3YSfP9v6PylssH7MHKSzoKvirQnFiWhZVIYEQiWJkM1q4Ed7Wk7/YKgiAIwqdVXgHUZZdd1mvbV7/61e7vRR2o/K2LvAnAtIKjaQ86iEsOMNIcP6fvRX+TRhyH4sKtFmDpcWq1RlRXIUYsQaqxGcXv6S6auS8zntgVPA1AN7LHDUcAtav2k6n4MFtbMZNJZKcTrawUrbIS0+eHV14WRTMFQRCEg07OAZSo/zS8Pmz/kEc23UtbqglFUphb8hn+9lwHUISjcyP1U2d2HytZBphpZEMnlWii0laCo2Mb3kwYtxLDspeS3rAVM57CVjlMPUf7yUxnMNtbMHUT2S2hFBfgqKpELSpC9nqRJIlMJnOgmykIgiAIQyISTw6Qf276J23JJgCmBubgMGxsiyogw8yyCI5oA4qeQDKSyEYayTIwjDROI0KtLYmSbqbE50b116B3RknvaB2+YbchsjI6RjSOmUgiaRqK3cIx6xjUCUcj+/2ip0kQBEE4ZIgA6hO0I7qDUCqEhMSTm5/s3j7ZsPHK8tfANh25M8wZR6dwRrZiyQqmpIKsYso2OmVw2qtxuMYTjOmMKvFjKRqphg2YuoHqtA/cgOTwz5i0dAMjFseKJ0GRUbwe7KMqUT02FDWFVD8H3IFhv68gCIIgHEgigPoEnfq3vtez+1PkNSgAT8Ez+Jctwl5aQ7qP4xKZLqq1QgxTwq7KeOwKenuITGsQtWjw9ePUrnX7+Q560sNdWKk0sseFbfwotAI/is+dnQHY1Qzusn6LZwqCIAjCwSznOlDC/vvh/B+iSH2XF7AsmUTj+Zwwse9cs6SZxi7bKFB9JNIGHoeKQ7JIbtuRLZqp9VE0s8cNTJTOj/b3Ley5XEbHTKZwThqLd+5UnGNrsuvuKUq29pMeh8AokMWvmCAIgnDoyevTzTAMXn31VcLh8Ag159D22bGf5Y9n/rHPffGt16JsczF1Qt+z76JmnALFh1t2kjZMit02Mi1B9GBnTrlPcnQLkt61X+3fmx7sxFZaiK2ipHcNp/SuhYM9fb8XQRAEQTjY5RVAKYrCKaecQigUGqn2HDYkeidUT3DvQO6jx8a0TExMirUAhmWhSBKuTIbklkZkp6Pfopl7U0MrUO0mfdx2nwMVZJdzwEPMZApkGVttRd/3ToaztZ/6WbpFEARBEA52eedATZ06lc2bNzNmzJiRaM8hr9BRSJGjiHJ3ObUZP6+F1hGxMhC3OPEId5/nxMwkLslJQPGSyBi4FFAad2ImkqhlOVSBNzOoofcwbSYoMugmBectxF5d1utQ2eUcsEfLsiz0YAT7qArUPhYrxjTANMFfNXi7BEEQBOEglXcAdffdd3PLLbfw/e9/n9mzZ+N29/zQ9/k+HXWIPq3K3eU89/nn0GSNR5+7n38vO4KYVI2/7R0qT+57yCtuJhlrr8Qma3Smk1TGwxgt7WilBTmVBlA61yKZScLbi0E3UUsL8Rw5bUhlBcxoHNllx15T0ff5yXB24WC3GL4TBEEQDl15B1BnnHEGkF2yZe8PUMuyRCXyHCmSxtubg7zV6KfdKgYUZpdHkKTePUIZU0eVFApUP6ZlQVcUZ3tbdrZbjuvHqcEVWBaEPvYAabzzZgwpeLJME6MrhnPiWBRP70WOAUhGoHImqLa8ry8IgiAIB4u8A6iXXnppJNoxYsLhMCeffDK6rqPrOt/4xje48sorD1h7nvlgJ997Yi07O5NAWTYnydQJ1NUDVq/ju8w4AdWLV3GRSqRw7mzBoVn9BzD7ykRRIh8Rb7WRCaaRbBrumZOH1HYj3IUa8GLrZ6099CQoNvBVDOn6giAIgnCwyDuAWrBgwUi0Y8R4vV5effVVXC4XsViMqVOnct5551FUlEPu0DB75oOdXPPIqt5hkqTw2JYxuD0tTCuNdW+2LIuMpVOqFiAjkWnYiScawTmxNud7quE1SJgEtxQD4J41GXmwgpt9sHQdK53BPmEMsr2f3qVEGNzFovaTIAiCcMgbUiHNcDjMr3/9a9atyxZmnDJlCpdffjl+/+DFHD9piqLgcmV7a1KpFJZlYVm9e3pGmmFafO+JtX30MQGSBFj8c0MRU0pi7F4LOG4mccl2AqoPQp1YO5rxVhQgKblPnlSDK8kkZKIN2Xt4jp4+pPbrHZ1opYVopf0ER5YFmUR2+E7UfhIEQRAOcXl/0q1YsYK6ujqWLFlCMBgkGAxy3333UVdXx6pVq/JuwKuvvspZZ51FZWUlkiTxj3/8o9cxS5cuZfTo0TgcDo466ijeeeedvO4RDoeZPn061dXVLF68mOLi4rzbub/e2RLcNWzXH4nOlMaWsKN7S9xKUqQFcGQs9K2NKIqM2+/J+Z5Ssg0l3kB4kxtMC/voqv6H3wbQXbagpp+yBbCr9pNb1H4SBEEQDgt5B1A33ngjZ599Nlu3buWxxx7jscceY8uWLXz2s5/lhhtuyLsBsViM6dOns3Tp0j73/+Uvf+Gmm27ijjvuYNWqVUyfPp1TTz2V1tbW7mNmzJjB1KlTe33t2LEDgEAgwLvvvsuWLVv44x//SEtLS97t3F+tXQMFT3tEUtlOQd0ykJAokv2wvZlMOIJW6Meh5tH7FFqJZUJoc3ZmpGfeEHufghFslSWohQP0MCbD4KsEh5iFKQiCIBz68h7CW7FiBQ8++CDqXjPAVFXlm9/8JnPmzMm7Aaeffjqnn356v/vvu+8+rrzySr785S8D8D//8z/861//4je/+Q233norAGvWrMnpXmVlZUyfPp3XXnuNz3/+830ek0qlSKVS3a8jkQgAmUyGTCbTvX3393tvG0iRK7dH7bMZYEnE9CRe2YM3lMJsbSfh9lLqcmDKMn0v9rIPy8IRXEVXkwMjbmXXq5tajz5oJc2ejGgcy+VArixDN6GvRHdMA3QT3BWQ4/OA/J+h0JN4fvtPPMP9I57f/hPPcP8M9PxG+pnmHUD5fD4aGhqYOHFij+3bt2/H6x3eytPpdJqVK1dy2223dW+TZZmTTz6Zt956K6drtLS04HK58Hq9dHZ28uqrr3LNNdf0e/wPf/hDvve97/Xa/txzz3XnUu3t+eefz6kdpgUBm0I4DX2XA7cI2GCivRQ5AbsHwrYpQH027ygI5LqaXWFsA/PTHQQ/zg7Ztc09io/U8hzP3svuEcNtaehziePdvND0LvBu3rfI9RkKfRPPb/+JZ7h/xPPbf+IZ7p++nl88Hh/Re+YdQF1wwQVcccUV/OQnP+GYY44B4I033mDx4sVceOGFw9q49vZ2DMOgrKxnfaSysjI++ii3UGLbtm1cddVV3cnj1113HdOmTev3+Ntuu42bbrqp+3UkEqGmpoZTTjmlR5HQTCbD888/z8KFC9EGW8h3F210C9f9ORtg9OzHyb46q76FjCtO0kyT0pNMb3bgDEZJ+X0YFtSVetByTCB3hP5NqlMl0aKBJDHpqPGotOd07m56KJItezB9Yv8z7wDC26B8GpRNyev6Q3mGwh7i+e0/8Qz3j3h++088w/0z0PPbPYI0UvIOoH7yk58gSRKXXnopuq4DoGka11xzDT/60Y+GvYH768gjj8x5iA/Abrdjt/ee5q9pWp+/3P1t78tnZ1SjqspedaCy/Hads+s7uksYRK0Y1UELd3sECnxkdAO/U8OpZGfSDcrUsYVW07Ip22PmnDQWR4E3t3N3sXQdK5nCNb4Wm2uAsgd6ElQNAlUwxL/8+TxDoTfx/PafeIb7Rzy//See4f7p6/mN9PPMK4AyDIO3336bO++8kx/+8Ids2rQJgLq6uj6Ht/ZXcXExiqL0SvpuaWmhvHwIw1GfAqdNrWDh5HLe2RLkn2/8HUPfyaxqf3fpAtMyUboSlLYALh+oKkY6jcee+y+CElmHlUrSuSUAgGfejLzbqQc7UUsK0AZba2937SfXJ19XSxAEQRAOlLxm4SmKwimnnEI4HMblcjFt2jSmTZs2IsETgM1mY/bs2bz44ovd20zT5MUXX2TevHkjcs9PgiJLzKsrYkZZFzW+cHfwBBBLRynZEcdlquB2oZsWqizhtPVTPqAPanAlnducmBkJtSiAY9yovNpnptIgSdhHVfZftgD21H4qGC1qPwmCIAiHlbyH8KZOncrmzZsZM2bMsDQgGo3y8ccfd7/esmULa9asobCwkNraWm666SYuu+wy5syZw5FHHsn9999PLBbrnpU3UpYuXcrSpUs/2bX9LAtlRxvFEROlvACAdMbErik4tBwDFD2O3LmW0MZs4rnn6OlIcp4z74Kd2GrKBy5bAKL2kyAIgnDYyjuAuvvuu7nlllv4/ve/z+zZs3G73T32751onYsVK1Zw4okndr/encB92WWX8fDDD3PBBRfQ1tbGd7/7XZqbm5kxYwbPPPNMr8Ty4Xbttddy7bXXEolEPrEK61aoE19LBGdgDOzq+UkbBgUeJ3KOi/+q4XdJtsukwhqSpuKZMzWvNhjROJLDjr2mou8Fhy0LUhFIdmZfF40XtZ8EQRCEw07eAdQZZ5wBwNlnn93jA9ayLCRJyrvH5oQTThh0aZWvf/3rfP3rX8+3qQcVKZXBamjCpThxurIB2+7H4slz+K59YzaodU2fiOxyDHLGHpZpYXRGcUwYjeLtGRiTSUIiBEYSbF4oqQdfFbhF75MgCIJw+Mk7gHrppZdGoh2HN9PCvqOdTCSOp2o8u+PSlGFg05Sc85+kVAdWxza6tmd757x5Jo8bnV0ofi/2yl1BkWlkK4wnI6DawVMCgVHgKQN77kvKCIIgCMKhJq8AKpPJcNddd/E///M/jB8/fqTadNjRgl1IO9sg4Mej7un5SWVMCtwaao61n9TQKsKbXVimhK2mHFt17sOclm5gJdM4x9UiSxnobAXTBGcgu0CwrwKchSJZXBAEQRDIM4DSNI333ntvpNpyWFKSGZzN7URUkwJXAE3a8yMxLSv38gWWhdK+kvDH2RmR+ZYu0DuCqB4JzR6FjJSdWeevySaIqwPUgRIEQRCEw1De3QmXXHIJv/71r0eiLYcfw8S7MwKxBLrXgU/ZMyymGxaqIuHUchu+k+PbiW+NkImryE47riPqBz/JMiEVxQw2QqITe91YpDHHwviTYdQxEKgRwZMgCIIg9CHvHChd1/nNb37DCy+80OcsvPvuu2/YGncgfRJlDGztnSjBOJ2lLlyKE7e8J+E7pZs4VTXn8gVqcAVtH2d/Fu4jpyHnUoE11gGaHcPwYZs9H/XIBaDk/SshCIIgCIedvD8tP/jgA2bNmgXAhg0beuzrc9r7QeqTKGOgdsbJKDJpxaJC9fd4fhnDoMRry+2ZWgbm9veI7cwu5uw5anoO51hg6RhaLVJFAPvU2UgieBIEQRCEnIhZeAeQBGQkHbuk4VGc3dstCySJnGffKZH1hNdnAy3HhNFoRYHBTzIyWLKGEddxTKpDCeRwjiAIgiAIwBByoAbS2to6nJc7LOiWiU9xY5ds3dtSuoFNVXLPf2pdTufmbPJ4zqULMgmMuIlSUoF9VH5LvQiCIAjC4S7nAMrlctHW1tb9+swzz2Tnzp3dr1taWqioqBje1h0GbJKKX/X22JbKmHjsam7lC4wEsfc3Y6RlFL8Lx4Qcl9gxkpiWA3tdHbLTOfjxgiAIgiB0yzmASiaTPSqGv/rqqyQSiR7HDFZRXOjNLtlwyz2H70xyL1+ght8jvDGbfO6dNwsplzpNloWZTiO5/SiFhUNqtyAIgiAczoZ1CO9QSiL/JMiSgk9yokh7fgwZ00RTZJy23H40+vrlJIM2UCTcc6fldmMjg5m2UApLUfJcu1AQBEEQhCEkkR8uPokyBqVqAEtO9diW1k0cmoK9j/IFUjqEpMf2bMhECL0XAly4J1Wg2tJYuAa/cSaBpSuoNWORlNzX2RMEQRAEISvnAEqSpB49TPu+PtR8EmUMHLKdjNQzUMoYJqVeOxL7PFtTR1n1U8xYcs+mDHRuKwbA6/oQZdUG9CO/BfLAP1YrE8eyeVGLi4fnjQiCIAjCYSbnAMqyLOrr67uDpmg0ysyZM5F35dyI/Kf9Z1oWsgROe+9eIb0zxvZ/erEMbx9nQvM7BUgKVEyIoRYMEPBZFmY8iVwyRpQuEARBEIQhyjmAeuihh0ayHYeHzkaItXe/dKR3olrtaOlswnjUdGJXfTjV3j8WM57EGmQ00TKyxzFQAGVkMNMmWkUNsl0s0yIIgiAIQ5FzAHXZZZeNZDsOfXoKfnUixPbUyhq3+5uW7B9pyc222ltQlb2G7ywTKR1E7vp4WJphpeNYkg2tUtR+EgRBEIShEknknxTFBv6qXT1QZq/dFhJp2UPAaEJtfRc5uRM5sRM52YxkpkkENaBkv5thxbuQ/aUoRSL/SRAEQRCGSgRQnxRJgs98Gx75XN+7sfAYLXga/7fXPktSMe2lwH7mme3Kf1KqKpD3WQRaEATh08YwDDKZzIFuxojKZDKoqkoymRzRWd+HIk3LrV7iSBEB1Cep7iSonAk736O/hCbTVojprMB0VGA6KzGd5Vj2YtI72oFH9u/+RgbTkHDUjjmkZ1AKgnBwsyyL5uZmwuHwgW7KiLMsi/LycrZv3y7+XR4Cr7fviVWfBBFA9WNE6kAN0Au12bUQteIYikawsKUV70Kyu1BKa0bsHoIgCPtrd/BUWlqKy+U6pAML0zSJRqN4PJ7uWe3C4CzLIh6P09LScsCCKBFA9WPE6kDt0wtlIZHQKmh2HsU4ew5FMPeDEY0gF4vyBYIgfHoZhtEdPBUVFR3o5ow40zRJp9M4HA4RQOXJ6XRimiaxWAzDMD7xIb2cAqibbrop5wved999Q27MYWGfXigJi+3uE3HYFJxa/1XBZZcTFAUG6hFTlexxfbEsrEQSW80YpD7KJAiCIHwa7M55crlG9j+UwqHB5XIhyzK6rn/i987pk3T16tU5XexQ7mYdVrt7oXasJkYx7fJoShwqstz/81MLfHiOPoLoG6tRSwop+uLpvZ637HKiFvQ9BGhlkliKDbVcDN8JgvDpJz5PhFzs/j05EMW8cwqgXnrppZFux+FFkuCkO0j+6SvsNOZgSRJu+8Bdj2Y6Q3z1OgACpxyDvbo8r1uakQiy149SWj3kZguCIAiCkCUGXA+UuhP5uPRaOsxKbMrAw3cA0Xfex4wnUYsCOKeOz/t2ZrQTtWoMsugWFwRB+MSccMIJ3HDDDYd9G/ry8MMPEziIc3KHlAyzYsUKHn30URoaGkin0z32PfbYY8PSsMOFYRr4bAp2tf9Y1jIMul5bAYD3+DlIeSYaWqaJZRhoVaL6uCAIhw/DtHhnS5DWriSlXgdHjilEGSBV4tOmo6ODiy++mPfee4+Ojg5KS0tZtGgRP/jBD/CN4IxtITd5B1B//vOfufTSSzn11FN57rnnOOWUU9iwYQMtLS2ce+65I9HGQ5oiS3idA/8Y4u+uxwh3IXtceGZPyfseVjyG7HCK4TtBEA4bz3ywk+89sZadncnubRV+B3ecNZnTplYcwJblTpZlFi1axN13301JSQkff/wx1157LcFgkD/+8Y8HunmHvbyH8H7wgx+wZMkSnnjiCWw2Gz/96U/56KOPOP/886mtrR2JNh7SNFnGZes/gLJMi8jL7wDgPW4WkpZ/p6EZ6UQpLEYuOjj+0RAEQdgfz3ywk2seWdUjeAJo7kxyzSOreOaDnSNy31gsxqWXXorH46GiooJ77713v65XUFDANddcw5w5cxg1ahQnnXQSX/va13jttdfyvpau63z961/H7/dTXFzMd77znR6J16NHj+b73/8+F154IW63m6qqKpYuXdrjGg0NDSxatAiPx4PP5+P888+npaWle/+7777LiSeeiNfrxefzMXv2bFasWNG9/+GHH6a2thaXy8W5555LR0fHEJ7Kp0feAdSmTZs488wzAbDZbMRiMSRJ4sYbb+RXv/rVsDfwQFm6dCmTJ09m7ty5I3ofTZVxaP3/GJLrN5Np6UCy2/AePX1I9zATUbRR45GUgfOsBEEQPo0syyKe1nP66kpmuOOfH/a58NXubXf+cy1dyUxO18tndtfixYt55ZVXePzxx3nuued4+eWXWbVqVY9jrr76ajweT/eXz+ejuroan8/Xva0/O3bs4LHHHmPBggU5t2m33/72t6iqyjvvvMNPf/pT7rvvPv73f3suHXbPPfcwffp0Vq9eza233so3vvENnn/+eSBbr2rRokUEg0FeeeUVnn/+eTZv3swFF1zQff7FF19MdXU1y5cvZ+XKldx6663dtZmWLVvGFVdcwde//nXWrFnDiSeeyN133533+/g0ybs7o6CggK6uLgCqqqr44IMPmDZtGuFwmHg8PuwNPFBGrJDmXiRJwmlTkQeYrht5eTkAnqOOQHY68r6Hlc4gybIYvhME4aCVyBhM/u6zw3ItC2iOJJl253M5Hb/2rlMHHCXYLRqN8utf/5pHHnmEk046CcgGLdXVPf/tveuuu7jlllu6X+dSifzCCy/k8ccfJ5FIcNZZZ/UKfHJRU1PDkiVLkCSJCRMm8P7777NkyRKuvPLK7mOOPfZYbr31VgDq6+t54403WLJkCQsXLuTFF1/k/fffZ8uWLdTUZMvh/O53v2PKlCksX76cuXPn0tDQwOLFi5k4cSIA48fvmfD005/+lNNOO41vfvOb3dd/8803eeaZZ/J+L58WefdAHX/88d0R6Re+8AW+8Y1vcOWVV3LhhRd2/9IIufE4VNz2/v9iprY2kdraBIqCd/7sId3DiEaQvW6U0qqhNlMQBEEYxKZNm0in0xx11FHd2woLC5kwYUKP40pLSxk3blyPr7Fjx/Z4va8lS5awatUqHn/8cTZt2pRXcevdjj766B61tebNm8fGjRt7LFc2b968HufMmzePdeuy5XPWrVtHTU1Nd/AEMHnyZAKBQPcxN910E1/5ylc4+eST+dGPfsSmTZu6j123bl2PZ9PX/Q42efdA/eIXvyCZzI4rf+tb30LTNN58800+97nP8e1vf3vYG3goK/bY0Lv6j2Ejr2R7n9yzJqH6+u/WHYjVFcFWNxrJXTik8wVBEA40p6aw9q5Tczr2nS1BvvTQ8kGPe/jLczlyzOD/Lg5WYiZfV199NY88MvDC8NFotMfr8vJyysvLmThxIoWFhcyfP5/vfOc7VFR8uvJa77zzTi666CL+9a9/8fTTT3PHHXfw5z//+ZCdYJZ3AFVYuOcXTpbl7u4+YXhlWjpIrN0EEvgWDC0PyzJNLD2FWj0WxBpLgiAcpCRJymkYDWD++BIq/A6aO5N95kFJQLnfwfzxJcNa0qCurg5N01i2bFn3hKpQKMSGDRt65CwNZQhvb6ZpApBKpfJq37Jly3q8fvvttxk/fjzKXrmxb7/9dq9jJk2aBMCkSZPYvn0727dv7+6FWrt2LeFwmMmTJ3efU19fT319PTfeeCMXXnghDz30EOeeey6TJk3qsw0Hs7wDqKeeegpFUTj11J7/G3juuecwDIPTTz992Bp3ONvd++ScPA6tZGi9R2Y8iezQUErF8i2CIBweFFnijrMmc80jq5CgRxC1O1y646zJw14PyuPxcMUVV7B48WKKioooLS3lW9/6Vq+gqLS0lNLS0u7XpmkSiUTw+Xy9jn3qqadoaWlh7ty5eDwePvzwQxYvXsyxxx7L6NGj82pfQ0MDN910E1/96ldZtWoVP//5z3vNEnzjjTf48Y9/zDnnnMPzzz/PX//6V/71r38BcPLJJzNt2jQuvvhi7r//fnRd52tf+xoLFixgzpw5JBIJFi9ezOc//3nGjBlDY2Mjy5cv53Ofy677ev3113Psscfyk5/8hEWLFvHss88e1PlPMIQcqFtvvbXHmOlupmmK3qhhooe7iK3Jjin7TjhyyNcxuyKoRQXIgdLBDxYEQThEnDa1gl9eMotyf8+JN+V+B7+8ZNaI1YG65557mD9/PmeddRYnn3wyxx13HLNnDy1/FcDpdPLggw9y3HHHMWnSJG688UbOPvtsnnzyye5jtm7diiRJvPzyywNe69JLLyWRSHDkkUdy7bXX8o1vfIOrrrqqxzE333wzK1asYObMmdx9993cd9993Z0lkiTx+OOPU1BQwPHHH8/JJ5/M2LFj+ctf/gKAoih0dHRw6aWXUl9fz/nnn8/pp5/O9773PSCbg/Xggw/y05/+lOnTp/Pcc88d9Gk/efdAbdy4sUd33W4TJ07k448/HpZGHe66Xl8Jhol9bDX22qH9RbcsCysVRysbBXZRsVYQhMPLaVMrWDi5/BOtRO7xePj973/P73//++5tixcvHvL1TjzxRN58880Bj9myZQuBQIDp0/svc7N3cPXLX/6y3+N8Ph+PPvpov/tra2t5/PHH+9xns9n405/+NGBbL7/8ci6//PIe226++eYBz/k0yzuA8vv9bN68uVf34ccff4zb7R6udh22zHiS6LL3APAtGHrvk5XOICsWSqXIfxIE4fCkyBLz6ooOdDNG1FNPPcXtt99OQUHBgW7KYSfvAGrRokXccMMN/P3vf6eurg7IBk8333wzZ5999rA38HDT9fYarHQGraIEx4TRQ76OGY2juO3IxaJ8gSAIwqHqnnvuOdBNOGzlHUD9+Mc/5rTTTmPixIndBcIaGxuZP38+P/nJT4a9gYcTM5Oh6/Vs1Vrfgrk9anbkfa1EHPvoIiRnYJhaJwiCIByqtm7deqCbcNAZ0hDem2++yfPPP8+7776L0+nkiCOO4Pjjjx+J9h1WYis+xIwlUAp8uI6YMPgJ/bB0HclKoxaXifwnQRAEQRgB+a9MSzYb/5RTTuGUU04Z7vZ8aixdupSlS5f2OeNwJFiGSeTV7KKLvvmzkZSh5y0Z8SSyXUKprBP5T4IgCIIwAnIKoH72s59x1VVX4XA4+NnPfjbgsddff/2wNOxA+yTWwttb/P0NGMFOZJcD99xp+3UtK5bAVuJB8hQPU+sEQRAEQdhbTgHUkiVLuPjii3E4HCxZsqTf4yRJOmQCqE+SZVlEXnkHAO8xM5Ft2tCvZZpYRga1oAIcIx/4CYIgCMLhKKcAasuWLX1+LwyP5MZtZHa0IWkqnmNm7te1zEQKWQOluFTkPwmCIAjCCBEJMp8CkZd3LRp85DQUt3O/rmXGE6geFbl4lMh/EgRBEIQRkncS+U033dTndkmScDgcjBs3jkWLFvVYdFjoX7olSGpTA8gSvvlz9vt6VkZHC7jAKYqqCYIgHGgnnHACM2bM4P777z/QTRGGWd4B1OrVq1m1ahWGYTBhQnaq/YYNG1AUhYkTJ/LAAw9w88038/rrr/e55MvhLLNjB3oo1P063dRK5I33AXDUj97v65upNLIKSkGByH8SBOHw1dkIsfb+97tLwP/pLzLc0dHBxRdfzHvvvUdHRwelpaUsWrSIH/zgB/h8h36Kxpe+9CXC4TD/+Mc/DnRT+jSkSuSFhYU89NBD3T/Azs5OvvKVr3Dcccdx5ZVXctFFF3HjjTfy7LPPDnuDD1aZHTvYdNrpWOl0n/uTH21hx09+Q+Utl6MWDO0vhhlLoDgU5IISkf8kCMLhSU/Br06EWGv/x3hK4YYPQLV/cu0aAlmWWbRoEXfffTclJSV8/PHHXHvttQSDQf74xz8e6OYd9vJOkrnnnnv4/ve/3yP69fv93Hnnnfz4xz/G5XLx3e9+l5UrVw5rQw92eijUb/C05yADM54Y8j3MVBrVryH5KkX+kyAIhyfFtqt3qb9/A2XwVWWPG2axWIxLL70Uj8dDRUUF9957735dr6CggGuuuYY5c+YwatQoTjrpJL72ta/x2muv5XWdE044geuuu44bbriBgoICysrKePDBB4nFYnz5y1/G6/Uybtw4nn766e5zDMPgiiuuYMyYMTidTiZMmMBPf/rT7v3JZJIpU6Zw1VVXdW/btGkTXq+X3/zmNwBs27aNs846i4KCAtxuN1OmTOGpp57K6fp33nknv/3tb3n88ceRJAlJknosivxpkHcPVGdnJ62trb2G59ra2ohEIgAEAgHSgwULwrCydB1JllG9TpH/JAjCocWyIBPP/fjjF8OfL+pnp5ndn+v1NBfkuKzW4sWLeeWVV3j88ccpLS3l9ttvZ9WqVcyYMaP7mKuvvppHHnlkwOtEo9E+t+/YsYPHHnuMBQsW5Nb2vfz2t7/lm9/8Ju+88w5/+ctfuOaaa/j73//Oueeey+23386SJUv4j//4DxoaGnC5XJimSXV1NX/9618pKirizTff5KqrrqKiooLzzz8fh8PBH/7wB4466ijOPPNMPvvZz3LJJZewcOFCLr/8ciBbTzGdTvPqq6/idrtZu3YtHo8HYNDr33LLLaxbt45IJMJDDz0E8KnLrR7SEN7ll1/Ovffey9y5cwFYvnw5t9xyC+eccw4A77zzDvX19cPaUGFgZjyJ7FBR/AGR/yQIwqElE4cfVA7f9foNrvpw+w6wuQc9LBqN8utf/5pHHnmEk046CcgGLbvXjN3trrvu4pZbbul+bZom0WgUj8eD3M/IwYUXXsjjjz9OIpHgrLPO4n//939zb/8u06dP59vf/jYAt912Gz/60Y8oLi7myiuvBOC73/0uv/zlL3nvvfc4+uij0TSN733ve93njxkzhrfeeotHH32U888/H4AZM2Zw991385WvfIUvfvGLbNu2jSeffLL7nIaGBj73uc8xbVq2OPTYsWO79w12fY/Hg9PpJJVKUV5envf7/STkHUD9v//3/7jxxhv54he/iK7r2YuoKpdddll3kc2JEycO6QcsDJ0RT+IocyG5AyL/SRAE4RO2adMm0uk0Rx11VPe2wsLC7slWu5WWllJaWtr92jRNIpEIPp+v3wBqyZIl3HHHHWzYsIHbbruNm266iQce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3++nuLiY73znOz3e2+jRo/n+97/PhRdeiNvtpqqqiqVLl/a4RkNDA4sWLcLj8eDz+Tj//PNpaWnp3v/uu+9y4okn4vV68fl8zJ49mxUrVnTvf/jhh6mtrcXlcnHuuefS0dEx5PfzaTCkQprCJ0BPQyYOehKQsrWe3MWYphPZb0OZdTq4PQe6lYIgCCMuoSc46o9H7dc1QqkQlz1zWd7nLbtoGS7NldOxixcv5pVXXuHxxx+ntLSU22+/nVWrVjFjxozuY66++moeeeSRAa8TjUa7v1+7di133XUXy5YtY/PmzXm3f7ff/va3XHHFFbzzzjusWLGCq666itraWq688sruY+655x5uv/12vve97/Hss8/yjW98g/r6ehYuXIhpmt3B0yuvvIKu61x77bVccMEFvPzyywBcfPHFzJw5k1/+8pcoisKaNWvQNA2AZcuWccUVV/DDH/6Qc845h2eeeYY77rhjyO/n00AEUJ8Wpgl6AtIJsHSQVbC5wV+VrfFk94LqwGxuRqusQBbBkyAIwqdGNBrl17/+NY888ggnnXQSkA1aqqurexx311139ehJMk2TaDSKx+NB3icdI5VKceGFF3LPPfdQW1u7XwFUTU0NS5YsQZIkJkyYwPvvv8+SJUt6BFDHHnsst956KwD19fW88cYbLFmyhIULF/Liiy/y/vvvs2XLFmpqagD43e9+x5QpU1i+fDlz586loaGBxYsXM3HiRADGjx/ffe2f/vSnnHbaaXzzm9/svv6bb77JM888M+T3dKCJAOpA05PQ1QySBKoTPKXZsgR2bzaAkpQeh1uZNFpJyQFqrCAIwifPqTpZdtGyvM75KPhRnz1Ovz3tt0wsnJjXvXOxadMm0uk0Rx21p6essLCQCRMm9DiutLSU0tLS7temaRKJRPD5fL0CqNtuu41JkyZxySWX5Nze/hx99NFIktT9et68edx7770YhoGiKN3b9jZv3rzumXvr1q2jpqamO3gCmDx5MoFAgHXr1jF37lxuuukmvvKVr/D73/+ek08+mS984QvU1dV1n3/uuef2uv7BHECJHKgDSXWAsxCKxkPlLKiZC+VTwber12mf4MlMpZBtNpRA4MC0VxAE4QCQJAmX5srry6E6suci9fjToTryus7eQcdwuPrqq/F4PN1fPp+P6upqfD5f97bd/v3vf/PXv/4VVVVRVbW7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" - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ - "\n", "# Render a matplotlib plot of the data.\n", "fig, ax = plt.subplots(1, 1)\n", "sinter.plot_error_rate(\n", " ax=ax,\n", " stats=samples,\n", " group_func=lambda stat: f\"d={stat.json_metadata['d']}, {stat.decoder}\",\n", - " x_func=lambda stat: stat.json_metadata['p'],\n", - " failure_units_per_shot_func=lambda stats: stats.json_metadata['rounds'],\n", - " filter_func=lambda stat: stat.json_metadata['d'] < 5,\n", + " x_func=lambda stat: stat.json_metadata[\"p\"],\n", + " failure_units_per_shot_func=lambda stats: stats.json_metadata[\"rounds\"],\n", + " filter_func=lambda stat: stat.json_metadata[\"d\"] < 5,\n", ")\n", "x_s = np.linspace(0.001, 0.029, 1000000)\n", "y_s = np.linspace(0.001, 0.029, 1000000)\n", - "ax.set_yscale('log')\n", - "ax.plot(x_s, y_s, 'k-', alpha=0.75, zorder=0, label='x=y')\n", + "ax.set_yscale(\"log\")\n", + "ax.plot(x_s, y_s, \"k-\", alpha=0.75, zorder=0, label=\"x=y\")\n", "ax.grid()\n", - "ax.set_title('Phenomenological Noise')\n", - "ax.set_ylabel('Logical Error Probability (per shot)')\n", - "ax.set_xlabel('Physical Error Rate')\n", - "ax.legend(loc='lower right')\n", - "fig.savefig('pseudoth.svg')" + "ax.set_title(\"Phenomenological Noise\")\n", + "ax.set_ylabel(\"Logical Error Probability (per shot)\")\n", + "ax.set_xlabel(\"Physical Error Rate\")\n", + "ax.legend(loc=\"lower right\")\n", + "fig.savefig(\"pseudoth.svg\")" ] }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "ExecuteTime": { - "end_time": "2024-04-23T17:01:30.231605Z", - "start_time": "2024-04-23T17:01:29.029721Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": "
", - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlAAAAHHCAYAAABwaWYjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAADR3klEQVR4nOzdd3xb5fX48Y+2LMmWRxyPxI6zByGbhIQVRqCUUaCDUSBAofxadigte7albSCkpSl0fBmlpdBSoC1QCgkb0gIJYWWQPT3ioWFt3Xt/fzy2bMdLiu3YDuf9egnZV1dXj4VjHz/Pec4xGYZhIIQQQggh0mbu7wEIIYQQQgw2EkAJIYQQQmRIAighhBBCiAxJACWEEEIIkSEJoIQQQgghMiQBlBBCCCFEhiSAEkIIIYTIkARQQgghhBAZkgBKCCGEECJDEkAJMQA99thjmEwmPvzww/4eykFr/vz5zJ8/v09f484778RkMvXZ9S+66CIqKir67Prd2bZtGyaTiccee6zfxiBEf5EASogDqDkwar45nU7GjRvHlVdeSXV1dX8PTxyk5s+fj8lk4rTTTmv3WHMQdN999/XDyIQYvKz9PQAhvozuvvtuRo4cSTQa5Z133uGhhx7ipZde4rPPPsPlcvX38EQvufXWW7nxxhv7exgpL7zwAqtWrWLmzJm9cr0RI0YQiUSw2Wy9cj0hBhOZgRKiH5x88smcf/75XHrppTz22GNce+21bN26lX/84x/9PTTRi6xWK06ns7+HAUB5eTl5eXncddddvXbN5llUi8XSa9cUYrCQAEqIAeC4444DYOvWrW2Ox2IxFi1aRGFhIW63mzPPPJO9e/e2e/6///1vjjrqKNxuN9nZ2Zxyyil8/vnnbc656KKL8Hg87N69mzPOOAOPx0NhYSE/+MEP0DStzbmhUIjrr7+esrIyHA4H48eP57777sMwjDbnmUwmrrzySv72t78xadIksrKymDt3Lp9++ikAv/3tbxkzZgxOp5P58+ezbdu2dmP/3//+x1e+8hW8Xi8ul4tjjjmGd999t805zblEmzZt4qKLLiI3Nxev18vFF19MOBxuc24ymeSee+5h9OjROBwOKioquPnmm4nFYl38H1Bqamr4zne+Q1FREU6nk6lTp/L444+3O6+uro4LLriAnJwccnNzWbhwIR9//HG7fKDOcqD+9Kc/MXv2bFwuF3l5eRx99NG88sorqcf/8Y9/cMopp1BaWorD4WD06NHcc8897f4/ZSI7O5vrrruOf/3rX6xevbrb87ds2cI3v/lN8vPzcblcHH744bz44ottzukoB6qqqoqLL76Y4cOH43A4KCkp4Wtf+1q7//fpfM8KMZBJACXEALB582YACgoK2hy/6qqr+Pjjj7njjjv43ve+x7/+9S+uvPLKNuc88cQTnHLKKXg8Hn7+859z2223sXbtWo488sh2v7Q0TeOkk06ioKCA++67j2OOOYb777+f3/3ud6lzDMPg9NNP54EHHuArX/kKS5YsYfz48dxwww0sWrSo3djffvttrr/+ehYuXMidd97JunXrOPXUU1m2bBm/+tWv+P73v88NN9zAypUrueSSS9o897XXXuPoo48mEAhwxx138NOf/hSfz8dxxx3H+++/3+61vvWtbxEMBrn33nv51re+xWOPPdZuRuXSSy/l9ttvZ8aMGTzwwAMcc8wx3HvvvZxzzjld/j+IRCLMnz+fJ554gm9/+9ssXrwYr9fLRRddxC9/+cvUebquc9ppp/GXv/yFhQsX8pOf/ITKykoWLlzY5fWb3XXXXVxwwQXYbDbuvvtu7rrrLsrKynjttddS5zz22GN4PB4WLVrEL3/5S2bOnMntt9/e4+XAa665hry8PO68884uz6uurmbevHn85z//4fvf/z4/+clPiEajnH766Tz33HNdPvfrX/86zz33HBdffDG/+c1vuPrqqwkGg+zYsSN1Tibfs0IMWIYQ4oB59NFHDcBYvny5sXfvXmPnzp3GU089ZRQUFBhZWVnGrl272px3wgknGLqup55/3XXXGRaLxfD5fIZhGEYwGDRyc3ONyy67rM3rVFVVGV6vt83xhQsXGoBx9913tzl3+vTpxsyZM1OfP//88wZg/PjHP25z3je+8Q3DZDIZmzZtSh0DDIfDYWzdujV17Le//a0BGMXFxUYgEEgdv+mmmwwgda6u68bYsWONk046qc3XGA6HjZEjRxoLFixIHbvjjjsMwLjkkkvajOnMM880CgoKUp+vWbPGAIxLL720zXk/+MEPDMB47bXXUseOOeYY45hjjkl9vnTpUgMw/vSnP6WOxeNxY+7cuYbH40l9LX//+98NwFi6dGnqPE3TjOOOO84AjEcffbTduJtt3LjRMJvNxplnnmlomtZmjPu+B/u6/PLLDZfLZUSj0dSxhQsXGiNGjGh37r6OOeYY45BDDjEMwzDuuusuAzBWrVplGIZhbN261QCMxYsXp86/9tprDcB4++23U8eCwaAxcuRIo6KiIjX25uc2f80NDQ3trrWvTL5nhRjIZAZKiH5wwgknUFhYSFlZGeeccw4ej4fnnnuOYcOGtTnvu9/9bpsloKOOOgpN09i+fTsAr776Kj6fj3PPPZfa2trUzWKxMGfOHF5//fV2r/3//t//a/P5UUcdxZYtW1Kfv/TSS1gsFq6++uo2511//fUYhsG///3vNsePP/74Nlvp58yZA6iZiOzs7HbHm19rzZo1bNy4kfPOO4+6urrU2EOhEMcffzxvvfUWuq53O/a6ujoCgUBq7EC7mbLrr78eoN0SVGsvvfQSxcXFnHvuualjNpuNq6++msbGRt58800AXn75ZWw2G5dddlnqPLPZzBVXXNHptZs9//zz6LrO7bffjtnc9sdv6//PWVlZqY+DwSC1tbUcddRRhMNh1q9f3+3rdKV5FqqrXKiXXnqJ2bNnc+SRR6aOeTwevvvd77Jt2zbWrl3b4fOysrKw2+288cYbNDQ0dHjO/nzPCjEQyS48IfrBsmXLGDduHFarlaKiIsaPH9/uFyqoxN/W8vLyAFK/nDZu3Ai05FDtKycnp83nTqeTwsLCdtds/ctu+/btlJaWtgl+ACZOnJh6vKsxer1eAMrKyjo8vu/Yu1r68vv9qa+5o9dq/X7k5OSwfft2zGYzY8aMaXNecXExubm57cbe2vbt2xk7dmy7/w/7ft3bt2+npKSk3W7JfV+zI5s3b8ZsNjNp0qQuz/v888+59dZbee2111LBYTO/39/t63TF6/Vy7bXXcscdd/DRRx+1eX+bbd++PRXwttb6vZg8eXK7xx0OBz//+c+5/vrrKSoq4vDDD+fUU0/lwgsvpLi4GMj8e1aIgUoCKCH6wezZs5k1a1a353W2u8loSuZunqF54oknUr+gWrNa2/4T74vdUp1dM92xL168mGnTpnV4rsfjyeiazfqyeGVf8/l8HHPMMeTk5HD33XczevRonE4nq1ev5kc/+lG7Wbn9cc011/DAAw9w1113sXTp0p4PupVrr72W0047jeeff57//Oc/3Hbbbdx777289tprTJ8+PePvWSEGKvlOFWIQGz16NABDhw7lhBNO6JVrjhgxguXLlxMMBtvMQjUvHY0YMaJXXqd57Dk5Ob06dl3X2bhxY2q2BFRStM/n63LsI0aM4JNPPkHX9TazUPt+3SNGjOD1118nHA63mYXatGlTt+MbPXo0uq6zdu3aToPGN954g7q6Op599lmOPvro1PF9d2j2RPMs1J133tnhDOCIESPYsGFDu+Ppfg+MHj2a66+/nuuvv56NGzcybdo07r//fv70pz/1yfesEP1BcqCEGMROOukkcnJy+OlPf0oikWj3eEclD7rz1a9+FU3T+PWvf93m+AMPPIDJZOLkk0/e7/G2NnPmTEaPHs19991HY2Nju8f3d+xAu1mVJUuWAHDKKad0+dyqqiqefvrp1LFkMsmDDz6Ix+PhmGOOAdR7nkgk+P3vf586T9d1li1b1u34zjjjDMxmM3fffXe7maTmWbTmWbbWs2rxeJzf/OY33V4/E9deey25ubncfffd7R776le/yvvvv8/KlStTx0KhEL/73e+oqKjodAkyHA4TjUbbHBs9ejTZ2dmpMhJ98T0rRH+QGSghBrGcnBweeughLrjgAmbMmME555xDYWEhO3bs4MUXX+SII45oFwh157TTTuPYY4/llltuYdu2bUydOpVXXnmFf/zjH1x77bWpGYSeMpvN/OEPf+Dkk0/mkEMO4eKLL2bYsGHs3r2b119/nZycHP71r39ldM2pU6eycOFCfve736WWwt5//30ef/xxzjjjDI499thOn/vd736X3/72t1x00UWsWrWKiooKnnnmGd59912WLl2amo0744wzmD17Ntdffz2bNm1iwoQJ/POf/6S+vh7oevlwzJgx3HLLLdxzzz0cddRRnHXWWTgcDj744ANKS0u59957mTdvHnl5eSxcuJCrr74ak8nEE0880W6Zsqe8Xi/XXHNNh8nkN954I3/5y184+eSTufrqq8nPz+fxxx9n69at/P3vf+8wXw/giy++4Pjjj+db3/oWkyZNwmq18txzz1FdXZ0qI9EX37NC9AcJoIQY5M477zxKS0v52c9+xuLFi4nFYgwbNoyjjjqKiy++OOPrmc1m/vnPf3L77bfz9NNP8+ijj1JRUcHixYtTu9l6y/z581m5ciX33HMPv/71r2lsbKS4uJg5c+Zw+eWX79c1//CHPzBq1Cgee+wxnnvuOYqLi7npppu44447unxeVlYWb7zxBjfeeCOPP/44gUCA8ePH8+ijj3LRRRelzrNYLLz44otcc801PP7445jNZs4880zuuOMOjjjiiG4rjze38XnwwQe55ZZbcLlcTJkyhQsuuABQtcBeeOEFrr/+em699Vby8vI4//zzOf744znppJP26z3pzLXXXsvSpUvbJaYXFRXx3nvv8aMf/YgHH3yQaDTKlClT+Ne//tXlLF5ZWRnnnnsuK1as4IknnsBqtTJhwgT++te/8vWvfz11Xm9/zwrRH0xGb/9ZI4QQX0LPP/88Z555Ju+88w5HHHFEfw9HCNHHJIASQogMRSKRNrWaNE3jxBNP5MMPP6SqqqrNY0KIg9OXYgmveTpc13V+9KMfcemll/b3kIQQg9hVV11FJBJh7ty5xGIxnn32Wd577z1++tOfSvAkxJfEQT8DlUwmmTRpEq+//jper5eZM2fy3nvvtes5JoQQ6XryySe5//772bRpE9FolDFjxvC9732vXZ9CIcTB66APoN577z0WL16caoB57bXXMmfOnDbtGoQQQgghMjHg60C99dZbnHbaaZSWlmIymXj++efbnbNs2TIqKipwOp3MmTOnTRf3PXv2tOkv1rxNWgghhBBifw34ACoUCjF16tROi9Q9/fTTLFq0iDvuuIPVq1czdepUTjrpJGpqag7wSIUQQgjxZTHgk8hPPvnkLisfL1myhMsuuyxVO+Thhx/mxRdf5JFHHuHGG2+ktLS0zYzT7t27mT17dqfXi8ViqYq5oCoM19fXU1BQMKj7awkhhBBfJoZhEAwGKS0t7bT4a09fYNAAjOeeey71eSwWMywWS5tjhmEYF154oXH66acbhmEYiUTCGDNmjLFr1y4jGAwa48aNM2prazt9jTvuuMMA5CY3uclNbnKT20Fw27lzZ1+EJMaAn4HqSm1tLZqmUVRU1OZ4UVFRquml1Wrl/vvv59hjj0XXdX74wx92uQPvpptuYtGiRanP/X4/5eXlbN26tU1j1UQiweuvv86xxx6LzWbr5a/sy0Hew56R96/n5D3sGXn/ek7ew57p6v0LBoOMHDmyze/u3jSoA6h0nX766Zx++ulpnetwOHA4HO2O5+fnk5OTk/o8kUjgcrkoKCiQb/r9JO9hz8j713PyHvaMvH89J+9hz3T1/jV/3lfpNwM+ibwrQ4YMwWKxUF1d3eZ4dXU1xcXF/TQqIYQQQhzsBnUAZbfbmTlzJitWrEgd03WdFStWMHfu3B5de9myZUyaNInDDjusp8MUQgghxEFmwC/hNTY2smnTptTnW7duZc2aNeTn51NeXs6iRYtYuHAhs2bNYvbs2SxdupRQKNTjjt5XXHEFV1xxBYFAAK/X29MvQwghhBAHkQEfQH344Ycce+yxqc+bE7wXLlzIY489xtlnn83evXu5/fbbqaqqYtq0abz88svtEsuFEEIIIXrLgA+g5s+fj9FNt5krr7yy13tQLVu2jGXLlqFpWq9eVwghhBCD36DOgepLV1xxBWvXruWDDz7o76EIIYQQYoCRAEoIIYQQIkMSQAkhhBBCZEgCKCGEEEKIDEkA1QmpAyWEEEKIzkgA1QlJIhdCCCFEZySAEkIIIYTIkARQQgghhBAZkgBKCCGEECJDEkB1QpLIhRBCCNEZCaA6IUnkQgghhOiMBFBCCCGEEBmSAEoIIYQQIkMSQAkhhBBCZEgCqE5IErkQQgghOiMBVCckiVwIIYQQnZEASgghhBAiQxJACSGEEEJkSAIoIYQQQogMSQAlhBBCCJEhCaCEEEIIITIkAZQQQgghRIYkgOqE1IESQgghRGckgOqE1IESQgghRGckgBJCCCGEyJAEUEIIIYQQGZIASgghhBAiQxJACSGEEEJkSAIoIYQQQogMSQAlhBBCCJEhCaCEEEIIITIkAVQnpJCmEEIIITojAVQnpJCmEEIIITojAZQQQgghRIYkgBJCCCGEyJAEUEIIIYQQGZIASgghhBAiQxJACSGEEEJkSAIoIYQQQogMSQAlhBBCCJEhCaCEEEIIITIkAZQQQgghRIYkgBJCCCGEyJAEUEIIIYQQGZIAqhPSTFgIIYQQnZEAqhPSTFgIIYQQnZEASgghhBAiQxJACSGEEEJkSAIoIYQQQogMSQAlhBBCCJEhCaCEEEIIITIkAZQQQgghRIYkgBJCCCGEyJAEUEIIIYQQGZIASgghhBAiQxJACSGEEEJkSAIoIYQQQogMSQAlhBBCCJEhCaCEEEIIITIkAZQQQgghRIYyCqDWrVvHHXfcwXHHHcfo0aMpKSlhypQpLFy4kCeffJJYLNZX4+yRM888k7y8PL7xjW/091CEEEIIcRBIK4BavXo1J5xwAtOnT+edd95hzpw5XHvttdxzzz2cf/75GIbBLbfcQmlpKT//+c8HXCB1zTXX8Mc//rG/hyGEEEKIg4Q1nZO+/vWvc8MNN/DMM8+Qm5vb6XkrV67kl7/8Jffffz8333xzb42xx+bPn88bb7zR38MQQgghxEEirRmoL774gu9///tdBk8Ac+fO5amnnuKGG25IewBvvfUWp512GqWlpZhMJp5//vl25yxbtoyKigqcTidz5szh/fffT/v6QgghhBC9La0AymazpT7+4x//2OESXTweTy2TtT6/O6FQiKlTp7Js2bIOH3/66adZtGgRd9xxB6tXr2bq1KmcdNJJ1NTUpM6ZNm0akydPbnfbs2dP2uMQQgghhEhXWkt4rV188cV85StfYejQoW2OB4NBLr74Yi688MKMrnfyySdz8sknd/r4kiVLuOyyy7j44osBePjhh3nxxRd55JFHuPHGGwFYs2ZNZl9EF2KxWJsAMRAIAJBIJEgkEqnjzR+3PiYyI+9hz8j713PyHvaMvH89J+9hz3T1/vX1e5pxAGUYBiaTqd3xXbt24fV6e2VQzeLxOKtWreKmm25KHTObzZxwwgmsXLmyV1+r2b333stdd93V7vgrr7yCy+Vqd/zVV1/tk3F8mch72DPy/vWcvIc9I+9fz8l72DMdvX/hcLhPXzPtAGr69OmYTCZMJhPHH388VmvLUzVNY+vWrXzlK1/p1cHV1taiaRpFRUVtjhcVFbF+/fq0r3PCCSfw8ccfEwqFGD58OH/729+YO3duh+fedNNNLFq0KPV5IBCgrKyME088kZycnNTxRCLBq6++yoIFCzJashQt5D3sGXn/ek7ew56R96/n5D3sma7ev+YVpL6SdgB1xhlnAGq57KSTTsLj8aQes9vtVFRU8PWvf73XB9gbli9fnva5DocDh8PR7rjNZuvwm7uz4yJ98h72jLx/PSfvYc/I+9dz8h72TEfvX1+/n2kHUHfccQcAFRUVnH322Tidzj4bVLMhQ4ZgsViorq5uc7y6upri4uI+fe1ly5axbNkyNE3r09cRQgghxOCTcSuXhQsX4nQ6WbVqFX/605/405/+xEcffdQXY8NutzNz5kxWrFiROqbrOitWrOh0Ca63XHHFFaxdu5YPPvigT19HCCGEEINPxknkNTU1nHPOObzxxhupulA+n49jjz2Wp556isLCwoyu19jYyKZNm1Kfb926lTVr1pCfn095eTmLFi1i4cKFzJo1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" - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ - "\n", "# Render a matplotlib plot of the data.\n", "fig, ax = plt.subplots(1, 1)\n", "sinter.plot_error_rate(\n", " ax=ax,\n", " stats=samples,\n", " group_func=lambda stat: f\"d={stat.json_metadata['d']}, {stat.decoder}\",\n", - " x_func=lambda stat: stat.json_metadata['p'],\n", - " failure_units_per_shot_func=lambda stats: stats.json_metadata['rounds'],\n", - " filter_func=lambda stat: stat.json_metadata['d'] > 4,\n", + " x_func=lambda stat: stat.json_metadata[\"p\"],\n", + " failure_units_per_shot_func=lambda stats: stats.json_metadata[\"rounds\"],\n", + " filter_func=lambda stat: stat.json_metadata[\"d\"] > 4,\n", ")\n", "x_s = np.linspace(0.001, 0.029, 1000000)\n", "y_s = np.linspace(0.001, 0.029, 1000000)\n", - "ax.set_yscale('log')\n", - "ax.plot(x_s, y_s, 'k-', alpha=0.75, zorder=0, label='x=y')\n", + "ax.set_yscale(\"log\")\n", + "ax.plot(x_s, y_s, \"k-\", alpha=0.75, zorder=0, label=\"x=y\")\n", "ax.grid()\n", - "ax.set_title('Phenomenological Noise')\n", - "ax.set_ylabel('Logical Error Probability (per shot)')\n", - "ax.set_xlabel('Physical Error Rate')\n", + "ax.set_title(\"Phenomenological Noise\")\n", + "ax.set_ylabel(\"Logical Error Probability (per shot)\")\n", + "ax.set_xlabel(\"Physical Error Rate\")\n", "ax.set_ylim(0.00001, 1)\n", - "ax.legend(loc='lower right')\n", - "fig.savefig('no-pseudoth.svg')" + "ax.legend(loc=\"lower right\")\n", + "fig.savefig(\"no-pseudoth.svg\")" ] }, { "cell_type": "code", - "execution_count": 22, - "metadata": { - "ExecuteTime": { - "end_time": "2024-04-23T17:43:50.463968Z", - "start_time": "2024-04-23T17:43:47.961663Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": "
", - "image/png": "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" - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ - "\n", "# Render a matplotlib plot of the data.\n", - "fig, ax = plt.subplots(1, 2, sharey=True, figsize=(12,5))\n", + "fig, ax = plt.subplots(1, 2, sharey=True, figsize=(12, 5))\n", "sinter.plot_error_rate(\n", " ax=ax[0],\n", " stats=samples,\n", " group_func=lambda stat: f\"d={stat.json_metadata['d']}, {stat.decoder}\",\n", - " x_func=lambda stat: stat.json_metadata['p'],\n", - " failure_units_per_shot_func=lambda stats: stats.json_metadata['rounds'],\n", - " filter_func=lambda stat: stat.json_metadata['d'] < 5,\n", + " x_func=lambda stat: stat.json_metadata[\"p\"],\n", + " failure_units_per_shot_func=lambda stats: stats.json_metadata[\"rounds\"],\n", + " filter_func=lambda stat: stat.json_metadata[\"d\"] < 5,\n", ")\n", "x_s = np.linspace(0.001, 0.029, 1000000)\n", "y_s = np.linspace(0.001, 0.029, 1000000)\n", - "ax[0].set_yscale('log')\n", - "ax[0].plot(x_s, y_s, 'k-', alpha=0.75, zorder=0, label='x=y')\n", + "ax[0].set_yscale(\"log\")\n", + "ax[0].plot(x_s, y_s, \"k-\", alpha=0.75, zorder=0, label=\"x=y\")\n", "ax[0].grid()\n", - "ax[0].set_ylabel('Logical Error Probability (per shot)')\n", - "ax[0].set_xlabel('Physical Error Rate')\n", - "ax[0].legend(loc='lower right')\n", + "ax[0].set_ylabel(\"Logical Error Probability (per shot)\")\n", + "ax[0].set_xlabel(\"Physical Error Rate\")\n", + "ax[0].legend(loc=\"lower right\")\n", "\n", "# Render a matplotlib plot of the data.\n", "sinter.plot_error_rate(\n", " ax=ax[1],\n", " stats=samples,\n", " group_func=lambda stat: f\"d={stat.json_metadata['d']}, {stat.decoder}\",\n", - " x_func=lambda stat: stat.json_metadata['p'],\n", - " failure_units_per_shot_func=lambda stats: stats.json_metadata['rounds'],\n", - " filter_func=lambda stat: stat.json_metadata['d'] > 4,\n", + " x_func=lambda stat: stat.json_metadata[\"p\"],\n", + " failure_units_per_shot_func=lambda stats: stats.json_metadata[\"rounds\"],\n", + " filter_func=lambda stat: stat.json_metadata[\"d\"] > 4,\n", ")\n", "x_s = np.linspace(0.001, 0.029, 1000000)\n", "y_s = np.linspace(0.001, 0.029, 1000000)\n", - "ax[1].set_yscale('log')\n", - "ax[1].plot(x_s, y_s, 'k-', alpha=0.75, zorder=0, label='x=y')\n", + "ax[1].set_yscale(\"log\")\n", + "ax[1].plot(x_s, y_s, \"k-\", alpha=0.75, zorder=0, label=\"x=y\")\n", "ax[1].grid()\n", - "#ax[1].set_ylabel('Logical Error Probability (per shot)')\n", - "ax[1].set_xlabel('Physical Error Rate')\n", + "# ax[1].set_ylabel('Logical Error Probability (per shot)')\n", + "ax[1].set_xlabel(\"Physical Error Rate\")\n", "ax[1].set_ylim(0.00001, 1)\n", - "ax[1].legend(loc='lower right')\n", + "ax[1].legend(loc=\"lower right\")\n", "\n", - "fig.savefig('pseudoth.svg')" + "fig.savefig(\"pseudoth.svg\")" ] } ], @@ -184,8 +135,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.5" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/src/mqt/qecc/cc_decoder/plotting/plots.py b/src/mqt/qecc/cc_decoder/plotting/plots.py index 19b9d041..d207f756 100644 --- a/src/mqt/qecc/cc_decoder/plotting/plots.py +++ b/src/mqt/qecc/cc_decoder/plotting/plots.py @@ -13,6 +13,9 @@ if TYPE_CHECKING: from matplotlib.axes import Axes +import locale +import operator + from scipy.optimize import curve_fit ler_k = "logical_error_rates" @@ -32,7 +35,7 @@ def plot_ler_vs_distance(code_dict: dict[float, Any], ax: Axes, pers: list[float ax.set_yscale("log") ax.legend() ax.set_ylabel("Logical failure rate") - ax.set_xlabel(r"Code distance $\it{d}$") + ax.set_xlabel(rf"Code distance $\it{d}$") def threshold_fit( @@ -80,7 +83,6 @@ def calculate_threshold( popt, _ = curve_fit(threshold_fit, (per_data, distance_data), ler_data, maxfev=10000) if ax is not None: ax.axvline(x=popt[-1], color="black", linestyle="dashed") - print("threshold: ", popt[-1]) distance_array = [int(distance) for distance in code_dict] distance_array.sort() @@ -209,9 +211,9 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: xys.append((run["physical_error_rate"], run["logical_failure_rate"])) for xys in code_to_xys.values(): - xys.sort(key=lambda xy: xy[0]) + xys.sort(key=operator.itemgetter(0)) - fig, ax = plt.subplots(2, 2, figsize=(12, 10)) + _fig, ax = plt.subplots(2, 2, figsize=(12, 10)) # add data for code, xys in sorted(code_to_xys.items()): ax[0][0].plot(*zip(*xys), "x-", label=f"d={code}") @@ -227,7 +229,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: xys.append((run["error_probability"], (run["wall_time"] / run["n_run"]) * 1e6)) for xys in code_to_xys.values(): - xys.sort(key=lambda xy: xy[0]) + xys.sort(key=operator.itemgetter(0)) for code, xys in sorted(code_to_xys.items()): ax[1][0].plot(*zip(*xys), "x-", label=f"d={code}") @@ -238,10 +240,10 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: ds = [] p_data = {} - pers = [ 0.051, 0.081, 0.111] # 0.001, 0.021, + pers = [0.051, 0.081, 0.111] # 0.001, 0.021, for d, data in sorted(code_to_xys.items()): ds.append(d) - for idx,(p,t) in enumerate(data): + for p, t in data: if p in pers: if p not in p_data: p_data[p] = {"d": [], "t": []} @@ -268,7 +270,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: # save plot as vector graphic for result in data: d = result["n_k_d"][2] - p = result['physical_error_rate'] + p = result["physical_error_rate"] if d not in metrics: metrics[d] = { @@ -280,7 +282,6 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: metrics[d]["p"].append(p) metrics[d]["logical_error_rate"].append(result["logical_failure_rate"]) - print(f"chi = {data[0]['decoder']}") calculate_threshold(code_dict=metrics, ax=ax[0][1], title="Threshold") plt.savefig(results_file, bbox_inches="tight") @@ -313,7 +314,7 @@ def generate_plots_comp(results_dir: Path, results_file: Path) -> None: idx += 1 for f in files: fp = subdir + "/" + f - with Path(fp).open() as ff: + with Path(fp).open(encoding=locale.getpreferredencoding(False)) as ff: data.append(json.loads(ff.read())) metrics: dict[int, dict[str, Any]] = {} diff --git a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py b/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py index 26ff4358..aa0dd26f 100644 --- a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py +++ b/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py @@ -1,44 +1,44 @@ +from __future__ import annotations + +import matplotlib.pyplot as plt import numpy as np import sinter -import matplotlib.pyplot as plt + from mqt.qecc.cc_decoder.stim_interface.color_code_stim import gen_pcm_and_logical, gen_stim_circuit_memory_experiment from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import sinter_decoders def generate_example_tasks(): for p in np.arange(0.001, 0.03, 0.001): - for d in [3,4,5]: + for d in [3, 4, 5]: pcm, l_op = gen_pcm_and_logical(d) cc_circuit = gen_stim_circuit_memory_experiment(pcm, l_op, d, p) yield sinter.Task( circuit=cc_circuit, - detector_error_model=cc_circuit.detector_error_model( - decompose_errors=False), + detector_error_model=cc_circuit.detector_error_model(decompose_errors=False), json_metadata={ - 'p': p, - 'd': d, - 'rounds': d, + "p": p, + "d": d, + "rounds": d, }, ) -def main(): +def main() -> None: samples = sinter.collect( num_workers=10, max_shots=10_000, max_errors=500, tasks=generate_example_tasks(), - decoders=['maxsat', 'bposd'], + decoders=["maxsat", "bposd"], custom_decoders=sinter_decoders(), - print_progress=True, - save_resume_filepath=f'pseudothreshold_plot.csv', + save_resume_filepath="pseudothreshold_plot.csv", ) # Print samples as CSV data. - print(sinter.CSV_HEADER) - for sample in samples: - print(sample.to_csv_line()) + for _sample in samples: + pass # Render a matplotlib plot of the data. fig, ax = plt.subplots(1, 1) @@ -46,25 +46,25 @@ def main(): ax=ax, stats=samples, group_func=lambda stat: f"Color Code d={stat.json_metadata['d']} dec={stat.decoder}", - x_func=lambda stat: stat.json_metadata['p'], - failure_units_per_shot_func=lambda stats: stats.json_metadata['rounds'], - filter_func=lambda stat: stat.json_metadata['d'] > 2, + x_func=lambda stat: stat.json_metadata["p"], + failure_units_per_shot_func=lambda stats: stats.json_metadata["rounds"], + filter_func=lambda stat: stat.json_metadata["d"] > 2, ) x_s = np.linspace(0.001, 0.029, 1000000) y_s = np.linspace(0.001, 0.029, 1000000) - ax.set_yscale('log') - ax.plot(x_s, y_s, 'k-', alpha=0.75, zorder=0, label='x=y') + ax.set_yscale("log") + ax.plot(x_s, y_s, "k-", alpha=0.75, zorder=0, label="x=y") ax.grid() - ax.set_title('Phenomenological Noise') - ax.set_ylabel('Logical Error Probability (per shot)') - ax.set_xlabel('Physical Error Rate') + ax.set_title("Phenomenological Noise") + ax.set_ylabel("Logical Error Probability (per shot)") + ax.set_xlabel("Physical Error Rate") ax.legend() # Save to file and also open in a window. - fig.savefig('plot.png') + fig.savefig("plot.png") plt.show() -if __name__ == '__main__': - main() \ No newline at end of file +if __name__ == "__main__": + main() diff --git a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py index de2cd8b8..96488e83 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py @@ -1,16 +1,18 @@ -import stim +from __future__ import annotations + import itertools as it -import numpy as np +import numpy as np +import stim def neighbors(perm): - node_sw = (perm[0]+1, perm[1], perm[2]-1) - node_se = (perm[0], perm[1]+1, perm[2]-1) - node_e = (perm[0]-1, perm[1]+1, perm[2]) - node_ne = (perm[0]-1, perm[1], perm[2]+1) - node_nw = (perm[0], perm[1]-1, perm[2]+1) - node_w = (perm[0]+1, perm[1]-1, perm[2]) + node_sw = (perm[0] + 1, perm[1], perm[2] - 1) + node_se = (perm[0], perm[1] + 1, perm[2] - 1) + node_e = (perm[0] - 1, perm[1] + 1, perm[2]) + node_ne = (perm[0] - 1, perm[1], perm[2] + 1) + node_nw = (perm[0], perm[1] - 1, perm[2] + 1) + node_w = (perm[0] + 1, perm[1] - 1, perm[2]) return [node_sw, node_se, node_e, node_ne, node_nw, node_w] @@ -18,11 +20,11 @@ def gen_pcm_and_logical(distance): lattice_points_to_qubit_index, ancilla_qubit_to_lattice_points = {}, {} qubit_count, ancilla_qubit_count = 0, 0 logical_operator = set() - t = (distance-1)//2 + t = (distance - 1) // 2 - for comb in it.product(range(3*t+1), repeat=3): + for comb in it.product(range(3 * t + 1), repeat=3): if sum(comb) == 3 * t: - if (comb[1]-comb[0]) % 3 == 1: + if (comb[1] - comb[0]) % 3 == 1: ancilla_qubit_to_lattice_points[ancilla_qubit_count] = comb ancilla_qubit_count += 1 else: @@ -31,36 +33,36 @@ def gen_pcm_and_logical(distance): logical_operator.add(qubit_count) qubit_count += 1 - parity_check_matrix = np.zeros( - (ancilla_qubit_count, qubit_count), dtype=bool) + parity_check_matrix = np.zeros((ancilla_qubit_count, qubit_count), dtype=bool) for ancilla_qubit, lattice_point in ancilla_qubit_to_lattice_points.items(): for neighbor in neighbors(lattice_point): if neighbor in lattice_points_to_qubit_index: qubit = lattice_points_to_qubit_index[neighbor] parity_check_matrix[ancilla_qubit, qubit] = True - print(qubit_count, ancilla_qubit_count) return (parity_check_matrix, logical_operator) def add_checks_one_round(pcm, circuit, detectors, error_probability): for check in pcm: if error_probability == 0: - mpp_X_instruction = f"MPP " - mpp_Z_instruction = f"MPP " + mpp_X_instruction = "MPP " + mpp_Z_instruction = "MPP " else: mpp_X_instruction = f"MPP({error_probability}) " mpp_Z_instruction = f"MPP({error_probability}) " for q in np.where(check)[0]: - mpp_X_instruction += "X"+str(q)+"*" - mpp_Z_instruction += "Z"+str(q)+"*" + mpp_X_instruction += "X" + str(q) + "*" + mpp_Z_instruction += "Z" + str(q) + "*" # circuit.append_from_stim_program_text(mpp_X_instruction[:-1]) circuit.append_from_stim_program_text(mpp_Z_instruction[:-1]) if detectors is True: for q in range(len(pcm)): circuit.append( # "DETECTOR", [stim.target_rec(-1*q-1), stim.target_rec(-1*q-2*len(pcm)-1)]) - "DETECTOR", [stim.target_rec(-1*q-1), stim.target_rec(-1*q-len(pcm)-1)]) + "DETECTOR", + [stim.target_rec(-1 * q - 1), stim.target_rec(-1 * q - len(pcm) - 1)], + ) return circuit @@ -73,7 +75,7 @@ def gen_stim_circuit_memory_experiment(pcm, logical_operator, distance, error_pr circuit = add_checks_one_round(pcm, circuit, False, 0) # rounds of QEC - for i in range(distance): + for _i in range(distance): circuit.append("X_ERROR", data_qubits, error_probability) # circuit.append("DEPOLARIZE1", data_qubits, error_probability) circuit = add_checks_one_round(pcm, circuit, True, error_probability) @@ -84,9 +86,9 @@ def gen_stim_circuit_memory_experiment(pcm, logical_operator, distance, error_pr log_measurement_instruction = "MPP " for q in logical_operator: - log_measurement_instruction += "Z"+str(q)+"*" + log_measurement_instruction += "Z" + str(q) + "*" circuit.append_from_stim_program_text(log_measurement_instruction[:-1]) circuit.append("OBSERVABLE_INCLUDE", [stim.target_rec(-1)], (0)) - return (circuit) + return circuit diff --git a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py index 0c83c68d..57da3a44 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py @@ -1,14 +1,17 @@ # Author: Oscar Higgott https://github.com/oscarhiggott/stimbposd/blob/main/src/stimbposd/dem_to_matrices.py -from typing import List, FrozenSet, Dict, Tuple +from __future__ import annotations + from dataclasses import dataclass +from typing import TYPE_CHECKING -from scipy.sparse import csc_matrix import numpy as np +from scipy.sparse import csc_matrix -import stim +if TYPE_CHECKING: + import stim -def iter_set_xor(set_list: List[List[int]]) -> FrozenSet[int]: +def iter_set_xor(set_list: list[list[int]]) -> frozenset[int]: out = set() for x in set_list: s = set(x) @@ -16,11 +19,8 @@ def iter_set_xor(set_list: List[List[int]]) -> FrozenSet[int]: return frozenset(out) -def dict_to_csc_matrix( - elements_dict: Dict[int, FrozenSet[int]], shape: Tuple[int, int] -) -> csc_matrix: - """ - Constructs a `scipy.sparse.csc_matrix` check matrix from a dictionary `elements_dict` giving the indices of nonzero +def dict_to_csc_matrix(elements_dict: dict[int, frozenset[int]], shape: tuple[int, int]) -> csc_matrix: + """Constructs a `scipy.sparse.csc_matrix` check matrix from a dictionary `elements_dict` giving the indices of nonzero rows in each column. Parameters @@ -31,7 +31,7 @@ def dict_to_csc_matrix( shape : Tuple[int, int] The dimensions of the matrix to be returned - Returns + Returns: ------- scipy.sparse.csc_matrix The `scipy.sparse.csc_matrix` check matrix defined by `elements_dict` and `shape` @@ -60,10 +60,9 @@ class DemMatrices: def detector_error_model_to_check_matrices( - dem: stim.DetectorErrorModel, allow_undecomposed_hyperedges: bool = True + dem: stim.DetectorErrorModel, allow_undecomposed_hyperedges: bool = True ) -> DemMatrices: - """ - Convert a `stim.DetectorErrorModel` into a `DemMatrices` object. + """Convert a `stim.DetectorErrorModel` into a `DemMatrices` object. Parameters ---------- @@ -73,21 +72,20 @@ def detector_error_model_to_check_matrices( If True, don't raise an exception if a hyperedge is not decomposable. Instead, the hyperedge `h` is still added to the `DemMatrices.check_matrix`, `DemMatrices.observables_matrix` and `DemMatrices.priors` but it will not have any edges in its decomposition in `DemMatrices.hyperedge_to_edge_matrix[:, h]`. - Returns + + Returns: ------- DemMatrices A collection of matrices representing the stim DetectorErrorModel """ - hyperedge_ids: Dict[FrozenSet[int], int] = {} - edge_ids: Dict[FrozenSet[int], int] = {} - hyperedge_obs_map: Dict[int, FrozenSet[int]] = {} - edge_obs_map: Dict[int, FrozenSet[int]] = {} - priors_dict: Dict[int, float] = {} - hyperedge_to_edge: Dict[int, FrozenSet[int]] = {} - - def handle_error( - prob: float, detectors: List[List[int]], observables: List[List[int]] - ) -> None: + hyperedge_ids: dict[frozenset[int], int] = {} + edge_ids: dict[frozenset[int], int] = {} + hyperedge_obs_map: dict[int, frozenset[int]] = {} + edge_obs_map: dict[int, frozenset[int]] = {} + priors_dict: dict[int, float] = {} + hyperedge_to_edge: dict[int, frozenset[int]] = {} + + def handle_error(prob: float, detectors: list[list[int]], observables: list[list[int]]) -> None: hyperedge_dets = iter_set_xor(detectors) hyperedge_obs = iter_set_xor(observables) @@ -105,13 +103,13 @@ def handle_error( if len(e_dets) > 2: if not allow_undecomposed_hyperedges: - raise ValueError( + msg = ( "A hyperedge error mechanism was found that was not decomposed into edges. " "This can happen if you do not set `decompose_errors=True` as required when " "calling `circuit.detector_error_model`." ) - else: - continue + raise ValueError(msg) + continue if e_dets not in edge_ids: edge_ids[e_dets] = len(edge_ids) @@ -124,8 +122,8 @@ def handle_error( for instruction in dem.flattened(): if instruction.type == "error": - dets: List[List[int]] = [[]] - frames: List[List[int]] = [[]] + dets: list[list[int]] = [[]] + frames: list[list[int]] = [[]] t: stim.DemTarget p = instruction.args_copy()[0] for t in instruction.targets_copy(): @@ -137,31 +135,23 @@ def handle_error( dets.append([]) frames.append([]) handle_error(p, dets, frames) - elif instruction.type == "detector": - pass - elif instruction.type == "logical_observable": + elif instruction.type in {"detector", "logical_observable"}: pass else: - raise NotImplementedError() + raise NotImplementedError check_matrix = dict_to_csc_matrix( {v: k for k, v in hyperedge_ids.items()}, shape=(dem.num_detectors, len(hyperedge_ids)), ) - observables_matrix = dict_to_csc_matrix( - hyperedge_obs_map, shape=(dem.num_observables, len(hyperedge_ids)) - ) + observables_matrix = dict_to_csc_matrix(hyperedge_obs_map, shape=(dem.num_observables, len(hyperedge_ids))) priors = np.zeros(len(hyperedge_ids)) for i, p in priors_dict.items(): priors[i] = p - hyperedge_to_edge_matrix = dict_to_csc_matrix( - hyperedge_to_edge, shape=(len(edge_ids), len(hyperedge_ids)) - ) + hyperedge_to_edge_matrix = dict_to_csc_matrix(hyperedge_to_edge, shape=(len(edge_ids), len(hyperedge_ids))) edge_check_matrix = dict_to_csc_matrix( {v: k for k, v in edge_ids.items()}, shape=(dem.num_detectors, len(edge_ids)) ) - edge_observables_matrix = dict_to_csc_matrix( - edge_obs_map, shape=(dem.num_observables, len(edge_ids)) - ) + edge_observables_matrix = dict_to_csc_matrix(edge_obs_map, shape=(dem.num_observables, len(edge_ids))) return DemMatrices( check_matrix=check_matrix, observables_matrix=observables_matrix, @@ -169,4 +159,4 @@ def handle_error( edge_observables_matrix=edge_observables_matrix, hyperedge_to_edge_matrix=hyperedge_to_edge_matrix, priors=priors, - ) \ No newline at end of file + ) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 4ce63f25..1ad78490 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -1,20 +1,26 @@ -import pathlib -from typing import Dict -from sinter import Decoder, CompiledDecoder -import numpy as np -from stimbposd import SinterDecoder_BPOSD +from __future__ import annotations + +import locale +from typing import TYPE_CHECKING import stim +from sinter import CompiledDecoder, Decoder +from stimbposd import SinterDecoder_BPOSD from mqt.qecc.cc_decoder.stim_interface.max_sat_stim_decoder import MaxSatStim +if TYPE_CHECKING: + import pathlib + + import numpy as np + class SinterCompiledDecoder_MAXSAT(CompiledDecoder): - def __init__(self, decoder: "MAXSAT", **kwargs): + def __init__(self, decoder: MAXSAT, **kwargs) -> None: self.decoder = decoder if kwargs: - self.convergence_cnt = 0 + self.convergence_cnt = 0 self.not_convergence_cnt = 0 self.d = kwargs["d"] self.p = kwargs["p"] @@ -22,13 +28,12 @@ def __init__(self, decoder: "MAXSAT", **kwargs): else: self.measure_convergence = False - def decode_shots_bit_packed( - self, - *, - bit_packed_detection_event_data: "np.ndarray", - ) -> "np.ndarray": - predictions, converged_cnt, not_converged_cnt =self.decoder.decode_batch( + self, + *, + bit_packed_detection_event_data: np.ndarray, + ) -> np.ndarray: + predictions, converged_cnt, not_converged_cnt = self.decoder.decode_batch( shots=bit_packed_detection_event_data, bit_packed_shots=True, bit_packed_predictions=True, @@ -36,41 +41,48 @@ def decode_shots_bit_packed( if self.measure_convergence: self.convergence_cnt += converged_cnt self.not_convergence_cnt += not_converged_cnt - with open('convergence_rate.txt', 'a') as self.f: - self.f.write(str(self.d) + ' ' + str(self.p) + ' ' + str(self.convergence_cnt) + ' ' + str(self.not_convergence_cnt) + '\n') + with open("convergence_rate.txt", "a", encoding=locale.getpreferredencoding(False)) as self.f: + self.f.write( + str(self.d) + + " " + + str(self.p) + + " " + + str(self.convergence_cnt) + + " " + + str(self.not_convergence_cnt) + + "\n" + ) return predictions class SinterDecoder_MAXSAT(Decoder): def __init__( - self, - **maxsat_kwargs, - ): + self, + **maxsat_kwargs, + ) -> None: self.maxsat_kwargs = maxsat_kwargs - - def compile_decoder_for_dem( - self, *, dem: stim.DetectorErrorModel - ) -> CompiledDecoder: + def compile_decoder_for_dem(self, *, dem: stim.DetectorErrorModel) -> CompiledDecoder: maxsat = MaxSatStim( model=dem, -# **self.maxsat_kwargs, + # **self.maxsat_kwargs, ) return SinterCompiledDecoder_MAXSAT(maxsat, **self.maxsat_kwargs) def decode_via_files( - self, - *, - num_shots: int, - num_dets: int, - num_obs: int, - dem_path: pathlib.Path, - dets_b8_in_path: pathlib.Path, - obs_predictions_b8_out_path: pathlib.Path, - tmp_dir: pathlib.Path, + self, + *, + num_shots: int, + num_dets: int, + num_obs: int, + dem_path: pathlib.Path, + dets_b8_in_path: pathlib.Path, + obs_predictions_b8_out_path: pathlib.Path, + tmp_dir: pathlib.Path, ) -> None: """Performs decoding by reading problems from, and writing solutions to, file paths. + Args: num_shots: The number of times the circuit was sampled. The number of problems to be solved. @@ -110,7 +122,7 @@ def decode_via_files( num_detectors=dem.num_detectors, bit_packed=False, ) - predictions, _, _ = max_sat.decode_batch(shots) + predictions, _, _ = max_sat.decode_batch(shots) stim.write_shot_data_file( data=predictions, path=obs_predictions_b8_out_path, @@ -119,5 +131,5 @@ def decode_via_files( ) -def sinter_decoders(**kwargs) -> Dict[str, Decoder]: - return {"maxsat": SinterDecoder_MAXSAT(**kwargs), "bposd": SinterDecoder_BPOSD()} \ No newline at end of file +def sinter_decoders(**kwargs) -> dict[str, Decoder]: + return {"maxsat": SinterDecoder_MAXSAT(**kwargs), "bposd": SinterDecoder_BPOSD()} diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index 110bbc48..15385a2b 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -1,24 +1,25 @@ -from mqt.qecc.cc_decoder.max_sat_decoder import LightsOut +from __future__ import annotations + +from typing import TYPE_CHECKING + import numpy as np + +from mqt.qecc.cc_decoder.max_sat_decoder import LightsOut from mqt.qecc.cc_decoder.stim_interface.dem_to_matrices import detector_error_model_to_check_matrices -import stim + +if TYPE_CHECKING: + import stim class MaxSatStim: - def __init__( - self, - model: stim.DetectorErrorModel, - timeout=1000 - ): - f"""Class for decoding stim circuits using the LightsOut MaxSAT decoder. - Parameters + def __init__(self, model: stim.DetectorErrorModel, timeout=1000) -> None: + """Class for decoding stim circuits using the LightsOut MaxSAT decoder. + Parameters. ---------- model : stim.DetectorErrorModel The detector error model of the stim circuit to be decoded """ - self._matrices = detector_error_model_to_check_matrices( - model, allow_undecomposed_hyperedges=True - ) + self._matrices = detector_error_model_to_check_matrices(model, allow_undecomposed_hyperedges=True) self.num_detectors = model.num_detectors self.num_errors = model.num_errors qtf, ftq = self.check_matrix_to_adj_lists(self._matrices.check_matrix) @@ -44,8 +45,7 @@ def weight_function(self, x): return np.log((1 - x) / x) def decode(self, syndrome: np.ndarray) -> np.ndarray: - """ - Decode the syndrome and return a prediction of which observables were flipped + """Decode the syndrome and return a prediction of which observables were flipped. Parameters ---------- @@ -54,7 +54,7 @@ def decode(self, syndrome: np.ndarray) -> np.ndarray: number of detectors in the `stim.Circuit` or `stim.DetectorErrorModel`. E.g. the syndrome might be one row of shot data sampled from a `stim.CompiledDetectorSampler`. - Returns + Returns: ------- np.ndarray A binary numpy array `predictions` which predicts which observables were flipped. @@ -63,21 +63,17 @@ def decode(self, syndrome: np.ndarray) -> np.ndarray: """ lights = [bool(b) for b in syndrome] estimate, converge, _ = self.problem.solve(lights) - if converge == False: - convergence_bool = 0 - else: - convergence_bool = 1 + convergence_bool = 0 if converge is False else 1 return (self._matrices.observables_matrix @ estimate) % 2, convergence_bool def decode_batch( - self, - shots: np.ndarray, - *, - bit_packed_shots: bool = False, - bit_packed_predictions: bool = False, + self, + shots: np.ndarray, + *, + bit_packed_shots: bool = False, + bit_packed_predictions: bool = False, ) -> np.ndarray: - """ - Decode a batch of shots of syndrome data. This is just a helper method, equivalent to iterating over each + """Decode a batch of shots of syndrome data. This is just a helper method, equivalent to iterating over each shot and calling `BPOSD.decode` on it. Parameters @@ -86,7 +82,7 @@ def decode_batch( A binary numpy array of dtype `np.uint8` or `bool` with shape `(num_shots, num_detectors)`, where here `num_shots` is the number of shots and `num_detectors` is the number of detectors in the `stim.Circuit` or `stim.DetectorErrorModel`. - Returns + Returns: ------- np.ndarray A 2D numpy array `predictions` of dtype bool, where `predictions[i, :]` is the output of @@ -95,12 +91,8 @@ def decode_batch( not_converged_cnt = 0 converged_cnt = 0 if bit_packed_shots: - shots = np.unpackbits(shots, axis=1, bitorder="little")[ - :, : self.num_detectors - ] - predictions = np.zeros( - (shots.shape[0], self._matrices.observables_matrix.shape[0]), dtype=bool - ) + shots = np.unpackbits(shots, axis=1, bitorder="little")[:, : self.num_detectors] + predictions = np.zeros((shots.shape[0], self._matrices.observables_matrix.shape[0]), dtype=bool) for i in range(shots.shape[0]): predictions[i, :], convergence_bool = self.decode(shots[i, :]) if convergence_bool == 1: From 1bc31bf1aea725d3a66761575bbde33500d636c5 Mon Sep 17 00:00:00 2001 From: lucas Date: Mon, 3 Jun 2024 15:57:43 +0200 Subject: [PATCH 04/79] update ignore to new folder structure, fixes --- pyproject.toml | 3 ++- src/mqt/qecc/cc_decoder/decoder.py | 2 +- .../run_color_code_phenomenological_noise.py | 4 ++++ .../cc_decoder/stim_interface/color_code_stim.py | 13 +++++++------ 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 72a32638..055cc381 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -180,6 +180,7 @@ warn_unreachable = true explicit_package_bases = true pretty = true exclude = [ + "*/cc_decoder/plotting/*", "code_construction*", "^data_utils\\.py$" ] @@ -200,7 +201,7 @@ unsafe-fixes = true [tool.ruff.lint] exclude = [ "scripts/*", - "*/cc_decoder/plots.py", + "*/cc_decoder/plotting/*", "*/analog_information_decoding/code_construction/*", "*/analog_information_decoding/utils/data_utils.py", diff --git a/src/mqt/qecc/cc_decoder/decoder.py b/src/mqt/qecc/cc_decoder/decoder.py index ba7496a3..b8d3ee81 100644 --- a/src/mqt/qecc/cc_decoder/decoder.py +++ b/src/mqt/qecc/cc_decoder/decoder.py @@ -61,7 +61,7 @@ def complete_parity_constraint(self, light: int, indices: list[int], val: bool) constraint = Xor(self.switch_vars[indices[0]], helper_vars[0]) == val self.optimizer.add(simplify(constraint)) - def preconstruct_z3_instance(self, weights) -> None: + def preconstruct_z3_instance(self, weights:np.NDArray[float]) -> None: """Preconstruct the z3 instance for the lights-out problem. Creates all necessary variables, adds the known parts of the parity constraints. diff --git a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py b/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py index 26ff4358..a7780465 100644 --- a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py +++ b/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py @@ -1,3 +1,4 @@ +# This script is used to run the color code phenomenological noise simulation. import numpy as np import sinter import matplotlib.pyplot as plt @@ -6,6 +7,7 @@ def generate_example_tasks(): + """ Generate example stim tasks """ for p in np.arange(0.001, 0.03, 0.001): for d in [3,4,5]: pcm, l_op = gen_pcm_and_logical(d) @@ -23,6 +25,7 @@ def generate_example_tasks(): def main(): + """ Run the simulation """ samples = sinter.collect( num_workers=10, max_shots=10_000, @@ -67,4 +70,5 @@ def main(): if __name__ == '__main__': + """ Run the main function """ main() \ No newline at end of file diff --git a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py index de2cd8b8..9f51124d 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py @@ -1,10 +1,11 @@ +# Generate stim circuit for the 2D color code +from typing import Any + import stim import itertools as it import numpy as np - - -def neighbors(perm): +def neighbors(perm:np.NDArray[int])->list[np.NDArray[int]]: node_sw = (perm[0]+1, perm[1], perm[2]-1) node_se = (perm[0], perm[1]+1, perm[2]-1) node_e = (perm[0]-1, perm[1]+1, perm[2]) @@ -14,7 +15,7 @@ def neighbors(perm): return [node_sw, node_se, node_e, node_ne, node_nw, node_w] -def gen_pcm_and_logical(distance): +def gen_pcm_and_logical(distance:int)->tuple[np.NDArray[bool], set[int] ]: lattice_points_to_qubit_index, ancilla_qubit_to_lattice_points = {}, {} qubit_count, ancilla_qubit_count = 0, 0 logical_operator = set() @@ -43,7 +44,7 @@ def gen_pcm_and_logical(distance): return (parity_check_matrix, logical_operator) -def add_checks_one_round(pcm, circuit, detectors, error_probability): +def add_checks_one_round(pcm:np.NDArray[int], circuit:Any, detectors:bool, error_probability:float)->Any: for check in pcm: if error_probability == 0: mpp_X_instruction = f"MPP " @@ -64,7 +65,7 @@ def add_checks_one_round(pcm, circuit, detectors, error_probability): return circuit -def gen_stim_circuit_memory_experiment(pcm, logical_operator, distance, error_probability): +def gen_stim_circuit_memory_experiment(pcm:np.NDArray[int], logical_operator:np.NDArray[int], distance:int, error_probability:float)->Any: data_qubits = range(len(pcm[0])) circuit = stim.Circuit() circuit.append("R", data_qubits) From 1fa089dc0326e595cc472f85fda2b5d986d00e1b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:01:03 +0000 Subject: [PATCH 05/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mqt/qecc/cc_decoder/decoder.py | 2 +- .../run_color_code_phenomenological_noise.py | 8 ++++---- .../cc_decoder/stim_interface/color_code_stim.py | 16 +++++++++------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/decoder.py b/src/mqt/qecc/cc_decoder/decoder.py index c81b29e1..3246bcbe 100644 --- a/src/mqt/qecc/cc_decoder/decoder.py +++ b/src/mqt/qecc/cc_decoder/decoder.py @@ -62,7 +62,7 @@ def complete_parity_constraint(self, light: int, indices: list[int], val: bool) constraint = Xor(self.switch_vars[indices[0]], helper_vars[0]) == val self.optimizer.add(simplify(constraint)) - def preconstruct_z3_instance(self, weights:np.NDArray[float]) -> None: + def preconstruct_z3_instance(self, weights: np.NDArray[float]) -> None: """Preconstruct the z3 instance for the lights-out problem. Creates all necessary variables, adds the known parts of the parity constraints. diff --git a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py b/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py index 331a4068..1f7c35ab 100644 --- a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py +++ b/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py @@ -9,8 +9,8 @@ from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import sinter_decoders -def generate_example_tasks()->None: - """ Generate example stim tasks """ +def generate_example_tasks() -> None: + """Generate example stim tasks.""" for p in np.arange(0.001, 0.03, 0.001): for d in [3, 4, 5]: pcm, l_op = gen_pcm_and_logical(d) @@ -27,7 +27,7 @@ def generate_example_tasks()->None: def main() -> None: - """ Run the simulation """ + """Run the simulation.""" samples = sinter.collect( num_workers=10, max_shots=10_000, @@ -69,6 +69,6 @@ def main() -> None: plt.show() -if __name__ == '__main__': +if __name__ == "__main__": """ Run the main function """ main() diff --git a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py index d7664109..d1521f83 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py @@ -1,15 +1,14 @@ # Generate stim circuit for the 2D color code -from typing import Any - -import stim from __future__ import annotations import itertools as it +from typing import Any import numpy as np import stim -def neighbors(perm:np.NDArray[int])->list[np.NDArray[int]]: + +def neighbors(perm: np.NDArray[int]) -> list[np.NDArray[int]]: node_sw = (perm[0] + 1, perm[1], perm[2] - 1) node_se = (perm[0], perm[1] + 1, perm[2] - 1) node_e = (perm[0] - 1, perm[1] + 1, perm[2]) @@ -18,7 +17,8 @@ def neighbors(perm:np.NDArray[int])->list[np.NDArray[int]]: node_w = (perm[0] + 1, perm[1] - 1, perm[2]) return [node_sw, node_se, node_e, node_ne, node_nw, node_w] -def gen_pcm_and_logical(distance:int)->tuple[np.NDArray[bool], set[int] ]: + +def gen_pcm_and_logical(distance: int) -> tuple[np.NDArray[bool], set[int]]: lattice_points_to_qubit_index, ancilla_qubit_to_lattice_points = {}, {} qubit_count, ancilla_qubit_count = 0, 0 logical_operator = set() @@ -45,7 +45,7 @@ def gen_pcm_and_logical(distance:int)->tuple[np.NDArray[bool], set[int] ]: return (parity_check_matrix, logical_operator) -def add_checks_one_round(pcm:np.NDArray[int], circuit:Any, detectors:bool, error_probability:float)->Any: +def add_checks_one_round(pcm: np.NDArray[int], circuit: Any, detectors: bool, error_probability: float) -> Any: for check in pcm: if error_probability == 0: mpp_X_instruction = "MPP " @@ -68,7 +68,9 @@ def add_checks_one_round(pcm:np.NDArray[int], circuit:Any, detectors:bool, error return circuit -def gen_stim_circuit_memory_experiment(pcm:np.NDArray[int], logical_operator:np.NDArray[int], distance:int, error_probability:float)->Any: +def gen_stim_circuit_memory_experiment( + pcm: np.NDArray[int], logical_operator: np.NDArray[int], distance: int, error_probability: float +) -> Any: data_qubits = range(len(pcm[0])) circuit = stim.Circuit() circuit.append("R", data_qubits) From 7d645ff98a52853f12ce9cfa7b2730753d6b8989 Mon Sep 17 00:00:00 2001 From: lucas Date: Mon, 3 Jun 2024 16:07:02 +0200 Subject: [PATCH 06/79] more fixes --- .../run_color_code_phenomenological_noise.py | 2 +- .../qecc/cc_decoder/stim_interface/__init__.py | 1 + .../cc_decoder/stim_interface/color_code_stim.py | 16 +++++++++------- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py b/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py index 1f7c35ab..c3cac426 100644 --- a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py +++ b/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py @@ -1,4 +1,4 @@ -# This script is used to run the color code phenomenological noise simulation. +""" This script is used to run the color code phenomenological noise simulation.""" from __future__ import annotations import matplotlib.pyplot as plt diff --git a/src/mqt/qecc/cc_decoder/stim_interface/__init__.py b/src/mqt/qecc/cc_decoder/stim_interface/__init__.py index e69de29b..37ec3dfc 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/__init__.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/__init__.py @@ -0,0 +1 @@ +""" init py file for stim_interface module """ \ No newline at end of file diff --git a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py index d1521f83..97274db7 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py @@ -1,14 +1,14 @@ -# Generate stim circuit for the 2D color code +"""Generate stim circuit for the 2D color code""" from __future__ import annotations - -import itertools as it from typing import Any - +import stim +import itertools as it import numpy as np import stim def neighbors(perm: np.NDArray[int]) -> list[np.NDArray[int]]: + """ Return the neighbors of a lattice point in the 2D color code.""" node_sw = (perm[0] + 1, perm[1], perm[2] - 1) node_se = (perm[0], perm[1] + 1, perm[2] - 1) node_e = (perm[0] - 1, perm[1] + 1, perm[2]) @@ -19,6 +19,7 @@ def neighbors(perm: np.NDArray[int]) -> list[np.NDArray[int]]: def gen_pcm_and_logical(distance: int) -> tuple[np.NDArray[bool], set[int]]: + """Generate the parity check matrix and logical operator for the 2D color code.""" lattice_points_to_qubit_index, ancilla_qubit_to_lattice_points = {}, {} qubit_count, ancilla_qubit_count = 0, 0 logical_operator = set() @@ -46,6 +47,7 @@ def gen_pcm_and_logical(distance: int) -> tuple[np.NDArray[bool], set[int]]: def add_checks_one_round(pcm: np.NDArray[int], circuit: Any, detectors: bool, error_probability: float) -> Any: + """ Add one round of checks to the circuit.""" for check in pcm: if error_probability == 0: mpp_X_instruction = "MPP " @@ -68,9 +70,9 @@ def add_checks_one_round(pcm: np.NDArray[int], circuit: Any, detectors: bool, er return circuit -def gen_stim_circuit_memory_experiment( - pcm: np.NDArray[int], logical_operator: np.NDArray[int], distance: int, error_probability: float -) -> Any: +def gen_stim_circuit_memory_experiment(pcm: np.NDArray[int], logical_operator: np.NDArray[int], + distance: int, error_probability: float) -> Any: + """Generate a stim circuit for a memory experiment on the 2D color code.""" data_qubits = range(len(pcm[0])) circuit = stim.Circuit() circuit.append("R", data_qubits) From dd3297dd3824be44b5c8b7a1630664fef7def42b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:07:22 +0000 Subject: [PATCH 07/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../run_color_code_phenomenological_noise.py | 3 ++- .../qecc/cc_decoder/stim_interface/__init__.py | 2 +- .../stim_interface/color_code_stim.py | 17 ++++++++++------- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py b/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py index c3cac426..13947ffa 100644 --- a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py +++ b/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py @@ -1,4 +1,5 @@ -""" This script is used to run the color code phenomenological noise simulation.""" +"""This script is used to run the color code phenomenological noise simulation.""" + from __future__ import annotations import matplotlib.pyplot as plt diff --git a/src/mqt/qecc/cc_decoder/stim_interface/__init__.py b/src/mqt/qecc/cc_decoder/stim_interface/__init__.py index 37ec3dfc..1acba125 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/__init__.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/__init__.py @@ -1 +1 @@ -""" init py file for stim_interface module """ \ No newline at end of file +"""init py file for stim_interface module.""" diff --git a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py index 97274db7..1ad3db18 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py @@ -1,14 +1,16 @@ -"""Generate stim circuit for the 2D color code""" +"""Generate stim circuit for the 2D color code.""" + from __future__ import annotations -from typing import Any -import stim + import itertools as it +from typing import Any + import numpy as np import stim def neighbors(perm: np.NDArray[int]) -> list[np.NDArray[int]]: - """ Return the neighbors of a lattice point in the 2D color code.""" + """Return the neighbors of a lattice point in the 2D color code.""" node_sw = (perm[0] + 1, perm[1], perm[2] - 1) node_se = (perm[0], perm[1] + 1, perm[2] - 1) node_e = (perm[0] - 1, perm[1] + 1, perm[2]) @@ -47,7 +49,7 @@ def gen_pcm_and_logical(distance: int) -> tuple[np.NDArray[bool], set[int]]: def add_checks_one_round(pcm: np.NDArray[int], circuit: Any, detectors: bool, error_probability: float) -> Any: - """ Add one round of checks to the circuit.""" + """Add one round of checks to the circuit.""" for check in pcm: if error_probability == 0: mpp_X_instruction = "MPP " @@ -70,8 +72,9 @@ def add_checks_one_round(pcm: np.NDArray[int], circuit: Any, detectors: bool, er return circuit -def gen_stim_circuit_memory_experiment(pcm: np.NDArray[int], logical_operator: np.NDArray[int], - distance: int, error_probability: float) -> Any: +def gen_stim_circuit_memory_experiment( + pcm: np.NDArray[int], logical_operator: np.NDArray[int], distance: int, error_probability: float +) -> Any: """Generate a stim circuit for a memory experiment on the 2D color code.""" data_qubits = range(len(pcm[0])) circuit = stim.Circuit() From cbd9e741624bcfa7489804a0a058a484f5d07b79 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 14:30:51 +0000 Subject: [PATCH 08/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mqt/qecc/cc_decoder/decoder.py | 2 +- .../qecc/cc_decoder/plotting/plot_convergence_rate.ipynb | 7 ------- src/mqt/qecc/cc_decoder/plotting/plots.py | 3 ++- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/decoder.py b/src/mqt/qecc/cc_decoder/decoder.py index 4c2517d1..c5526068 100644 --- a/src/mqt/qecc/cc_decoder/decoder.py +++ b/src/mqt/qecc/cc_decoder/decoder.py @@ -110,7 +110,7 @@ def solve(self, lights: list[bool], solver_path: str = "z3") -> tuple[list[int], start = timer() for light, val in enumerate(lights): self.complete_parity_constraint(light, self.lights_to_switches[light], val) - constr_time = timer() - start + timer() - start switches: list[int] = [] if solver_path == "z3": # solve the problem diff --git a/src/mqt/qecc/cc_decoder/plotting/plot_convergence_rate.ipynb b/src/mqt/qecc/cc_decoder/plotting/plot_convergence_rate.ipynb index 3dd183ba..aef9c358 100644 --- a/src/mqt/qecc/cc_decoder/plotting/plot_convergence_rate.ipynb +++ b/src/mqt/qecc/cc_decoder/plotting/plot_convergence_rate.ipynb @@ -49,13 +49,6 @@ "plt.xlabel(\"Physical error rate\")\n", "plt.savefig(\"convergence.svg\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/src/mqt/qecc/cc_decoder/plotting/plots.py b/src/mqt/qecc/cc_decoder/plotting/plots.py index 0019969b..b42eeabc 100644 --- a/src/mqt/qecc/cc_decoder/plotting/plots.py +++ b/src/mqt/qecc/cc_decoder/plotting/plots.py @@ -14,8 +14,9 @@ if TYPE_CHECKING: from matplotlib.axes import Axes import operator -import locale + from scipy.optimize import curve_fit + ler_k = "logical_error_rates" ler_eb_k = "logical_error_rate_ebs" min_wts_k = "min_wts_logical_err" From e44cd86f34ba1215521648510479103354a202ad Mon Sep 17 00:00:00 2001 From: lucas Date: Tue, 15 Oct 2024 16:40:58 +0200 Subject: [PATCH 09/79] try fix some linter warnings --- pyproject.toml | 2 +- .../stim_interface/color_code_stim.py | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 77a85946..a452ce88 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -272,7 +272,7 @@ isort.required-imports = ["from __future__ import annotations"] "E402", # Allow imports to appear anywhere in Jupyter notebooks "I002", # Allow missing `from __future__ import annotations` import ] -"*/cc_decoder/plots.py" = ["T201"] +"*/cc_decoder/plotting/**" = ["T201"] "scripts/*" = ["T201"] [tool.ruff.lint.pydocstyle] diff --git a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py index 1ad3db18..3cc68991 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py @@ -48,20 +48,20 @@ def gen_pcm_and_logical(distance: int) -> tuple[np.NDArray[bool], set[int]]: return (parity_check_matrix, logical_operator) -def add_checks_one_round(pcm: np.NDArray[int], circuit: Any, detectors: bool, error_probability: float) -> Any: +def add_checks_one_round(pcm: np.NDArray[int], circuit: Any, detectors: bool, error_probability: float) -> Any: # noqa: ANN401 """Add one round of checks to the circuit.""" for check in pcm: if error_probability == 0: - mpp_X_instruction = "MPP " - mpp_Z_instruction = "MPP " + mpp_x_instruction = "MPP " + mpp_z_instruction = "MPP " else: - mpp_X_instruction = f"MPP({error_probability}) " - mpp_Z_instruction = f"MPP({error_probability}) " + mpp_x_instruction = f"MPP({error_probability}) " + mpp_z_instruction = f"MPP({error_probability}) " for q in np.where(check)[0]: - mpp_X_instruction += "X" + str(q) + "*" - mpp_Z_instruction += "Z" + str(q) + "*" - # circuit.append_from_stim_program_text(mpp_X_instruction[:-1]) - circuit.append_from_stim_program_text(mpp_Z_instruction[:-1]) + mpp_x_instruction += "X" + str(q) + "*" + mpp_z_instruction += "Z" + str(q) + "*" + # circuit.append_from_stim_program_text(mpp_x_instruction[:-1]) + circuit.append_from_stim_program_text(mpp_z_instruction[:-1]) if detectors is True: for q in range(len(pcm)): circuit.append( @@ -74,7 +74,7 @@ def add_checks_one_round(pcm: np.NDArray[int], circuit: Any, detectors: bool, er def gen_stim_circuit_memory_experiment( pcm: np.NDArray[int], logical_operator: np.NDArray[int], distance: int, error_probability: float -) -> Any: +) -> Any: # noqa: ANN401 """Generate a stim circuit for a memory experiment on the 2D color code.""" data_qubits = range(len(pcm[0])) circuit = stim.Circuit() From 86881a13cb394d5c6578c35a9ba59834363d313c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 14:44:03 +0000 Subject: [PATCH 10/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py index 3cc68991..c893217f 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py @@ -48,7 +48,7 @@ def gen_pcm_and_logical(distance: int) -> tuple[np.NDArray[bool], set[int]]: return (parity_check_matrix, logical_operator) -def add_checks_one_round(pcm: np.NDArray[int], circuit: Any, detectors: bool, error_probability: float) -> Any: # noqa: ANN401 +def add_checks_one_round(pcm: np.NDArray[int], circuit: Any, detectors: bool, error_probability: float) -> Any: # noqa: ANN401 """Add one round of checks to the circuit.""" for check in pcm: if error_probability == 0: @@ -74,7 +74,7 @@ def add_checks_one_round(pcm: np.NDArray[int], circuit: Any, detectors: bool, er def gen_stim_circuit_memory_experiment( pcm: np.NDArray[int], logical_operator: np.NDArray[int], distance: int, error_probability: float -) -> Any: # noqa: ANN401 +) -> Any: # noqa: ANN401 """Generate a stim circuit for a memory experiment on the 2D color code.""" data_qubits = range(len(pcm[0])) circuit = stim.Circuit() From 45239a867a4df2cf86410b22ec09dbccb1974703 Mon Sep 17 00:00:00 2001 From: lucas Date: Tue, 15 Oct 2024 17:05:27 +0200 Subject: [PATCH 11/79] try fix some mypy warnings --- pyproject.toml | 2 +- src/mqt/qecc/cc_decoder/decoder.py | 2 +- .../stim_interface/color_code_stim.py | 13 +++++++------ .../stim_interface/dem_to_matrices.py | 7 ++++--- .../stim_interface/max_sat_stim_decoder.py | 19 +++++++++---------- 5 files changed, 22 insertions(+), 21 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a452ce88..392606a2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -180,7 +180,7 @@ disallow_untyped_defs = false explicit_package_bases = true warn_unreachable = true exclude = [ - "*/cc_decoder/plotting/*", + "*/cc_decoder/plotting/**", "code_construction*", "^data_utils\\.py$" ] diff --git a/src/mqt/qecc/cc_decoder/decoder.py b/src/mqt/qecc/cc_decoder/decoder.py index c5526068..3b7a65bd 100644 --- a/src/mqt/qecc/cc_decoder/decoder.py +++ b/src/mqt/qecc/cc_decoder/decoder.py @@ -98,7 +98,7 @@ def count_switches(self, model: ModelRef) -> int: assert self.switch_vars is not None return sum(1 for var in self.switch_vars if model[var]) - def solve(self, lights: list[bool], solver_path: str = "z3") -> tuple[list[int], bool, float, float]: + def solve(self, lights: list[bool], solver_path: str = "z3") -> tuple[list[int], bool, float]: """Solve the lights-out problem for a given pattern. Assumes that the z3 instance has already been pre-constructed. diff --git a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py index 3cc68991..1d7ded09 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py @@ -3,13 +3,14 @@ from __future__ import annotations import itertools as it -from typing import Any +from typing import Any, TYPE_CHECKING import numpy as np import stim +if TYPE_CHECKING: + from numpy.typing import NDArray - -def neighbors(perm: np.NDArray[int]) -> list[np.NDArray[int]]: +def neighbors(perm: NDArray[int]) -> list[NDArray[int]]: """Return the neighbors of a lattice point in the 2D color code.""" node_sw = (perm[0] + 1, perm[1], perm[2] - 1) node_se = (perm[0], perm[1] + 1, perm[2] - 1) @@ -20,7 +21,7 @@ def neighbors(perm: np.NDArray[int]) -> list[np.NDArray[int]]: return [node_sw, node_se, node_e, node_ne, node_nw, node_w] -def gen_pcm_and_logical(distance: int) -> tuple[np.NDArray[bool], set[int]]: +def gen_pcm_and_logical(distance: int) -> tuple[NDArray[bool], set[int]]: """Generate the parity check matrix and logical operator for the 2D color code.""" lattice_points_to_qubit_index, ancilla_qubit_to_lattice_points = {}, {} qubit_count, ancilla_qubit_count = 0, 0 @@ -48,7 +49,7 @@ def gen_pcm_and_logical(distance: int) -> tuple[np.NDArray[bool], set[int]]: return (parity_check_matrix, logical_operator) -def add_checks_one_round(pcm: np.NDArray[int], circuit: Any, detectors: bool, error_probability: float) -> Any: # noqa: ANN401 +def add_checks_one_round(pcm: NDArray[int], circuit: Any, detectors: bool, error_probability: float) -> Any: # noqa: ANN401 """Add one round of checks to the circuit.""" for check in pcm: if error_probability == 0: @@ -73,7 +74,7 @@ def add_checks_one_round(pcm: np.NDArray[int], circuit: Any, detectors: bool, er def gen_stim_circuit_memory_experiment( - pcm: np.NDArray[int], logical_operator: np.NDArray[int], distance: int, error_probability: float + pcm: NDArray[int], logical_operator: NDArray[int], distance: int, error_probability: float ) -> Any: # noqa: ANN401 """Generate a stim circuit for a memory experiment on the 2D color code.""" data_qubits = range(len(pcm[0])) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py index 57da3a44..776a776f 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py @@ -2,17 +2,18 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Set import numpy as np from scipy.sparse import csc_matrix if TYPE_CHECKING: import stim + from numpy.typing import NDArray def iter_set_xor(set_list: list[list[int]]) -> frozenset[int]: - out = set() + out:Set[int] = set() for x in set_list: s = set(x) out = (out - s) | (s - out) @@ -56,7 +57,7 @@ class DemMatrices: edge_check_matrix: csc_matrix edge_observables_matrix: csc_matrix hyperedge_to_edge_matrix: csc_matrix - priors: np.ndarray + priors: NDarray[np.float64] def detector_error_model_to_check_matrices( diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index 15385a2b..f83cdf00 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any, List import numpy as np @@ -10,9 +10,8 @@ if TYPE_CHECKING: import stim - class MaxSatStim: - def __init__(self, model: stim.DetectorErrorModel, timeout=1000) -> None: + def __init__(self, model: stim.DetectorErrorModel, timeout:int=1000) -> None: """Class for decoding stim circuits using the LightsOut MaxSAT decoder. Parameters. ---------- @@ -27,9 +26,9 @@ def __init__(self, model: stim.DetectorErrorModel, timeout=1000) -> None: self.observables = self._matrices.observables_matrix self.problem.preconstruct_z3_instance(weights=[self.weight_function(p) for p in self._matrices.priors]) - def check_matrix_to_adj_lists(self, check_matrix) -> tuple[dict, dict]: - qtf = {} - ftq = {} + def check_matrix_to_adj_lists(self, check_matrix: Any) -> tuple[dict, dict]: # noqa: ANN401 + qtf:dict[int,List[int]] = {} + ftq:dict[int,List[int]] = {} for row in range(check_matrix.shape[0]): for col in range(check_matrix.shape[1]): if check_matrix[row, col] == 1: @@ -41,10 +40,10 @@ def check_matrix_to_adj_lists(self, check_matrix) -> tuple[dict, dict]: ftq[row].append(col) return qtf, ftq - def weight_function(self, x): + def weight_function(self, x:np.float64) -> np.float64: return np.log((1 - x) / x) - def decode(self, syndrome: np.ndarray) -> np.ndarray: + def decode(self, syndrome: np.ndarray[np.int]) -> (np.ndarray[np.int], bool): """Decode the syndrome and return a prediction of which observables were flipped. Parameters @@ -68,11 +67,11 @@ def decode(self, syndrome: np.ndarray) -> np.ndarray: def decode_batch( self, - shots: np.ndarray, + shots: np.ndarray[np.int], *, bit_packed_shots: bool = False, bit_packed_predictions: bool = False, - ) -> np.ndarray: + ) -> (np.ndarray[np.int], np.int, np.int): """Decode a batch of shots of syndrome data. This is just a helper method, equivalent to iterating over each shot and calling `BPOSD.decode` on it. From 13831f9eccc66d4a0dcc65bd0e005228a3e823c1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 15:06:30 +0000 Subject: [PATCH 12/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stim_interface/color_code_stim.py | 8 +++++--- .../stim_interface/dem_to_matrices.py | 5 ++--- .../stim_interface/max_sat_stim_decoder.py | 19 ++++++++++--------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py index 1d7ded09..fce16542 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py @@ -3,13 +3,15 @@ from __future__ import annotations import itertools as it -from typing import Any, TYPE_CHECKING +from typing import TYPE_CHECKING, Any import numpy as np import stim + if TYPE_CHECKING: from numpy.typing import NDArray + def neighbors(perm: NDArray[int]) -> list[NDArray[int]]: """Return the neighbors of a lattice point in the 2D color code.""" node_sw = (perm[0] + 1, perm[1], perm[2] - 1) @@ -49,7 +51,7 @@ def gen_pcm_and_logical(distance: int) -> tuple[NDArray[bool], set[int]]: return (parity_check_matrix, logical_operator) -def add_checks_one_round(pcm: NDArray[int], circuit: Any, detectors: bool, error_probability: float) -> Any: # noqa: ANN401 +def add_checks_one_round(pcm: NDArray[int], circuit: Any, detectors: bool, error_probability: float) -> Any: # noqa: ANN401 """Add one round of checks to the circuit.""" for check in pcm: if error_probability == 0: @@ -75,7 +77,7 @@ def add_checks_one_round(pcm: NDArray[int], circuit: Any, detectors: bool, error def gen_stim_circuit_memory_experiment( pcm: NDArray[int], logical_operator: NDArray[int], distance: int, error_probability: float -) -> Any: # noqa: ANN401 +) -> Any: # noqa: ANN401 """Generate a stim circuit for a memory experiment on the 2D color code.""" data_qubits = range(len(pcm[0])) circuit = stim.Circuit() diff --git a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py index 776a776f..43a4b2ac 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py @@ -2,18 +2,17 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING, Set +from typing import TYPE_CHECKING import numpy as np from scipy.sparse import csc_matrix if TYPE_CHECKING: import stim - from numpy.typing import NDArray def iter_set_xor(set_list: list[list[int]]) -> frozenset[int]: - out:Set[int] = set() + out: set[int] = set() for x in set_list: s = set(x) out = (out - s) | (s - out) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index f83cdf00..4fd0d5d0 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, List +from typing import TYPE_CHECKING, Any import numpy as np @@ -10,8 +10,9 @@ if TYPE_CHECKING: import stim + class MaxSatStim: - def __init__(self, model: stim.DetectorErrorModel, timeout:int=1000) -> None: + def __init__(self, model: stim.DetectorErrorModel, timeout: int = 1000) -> None: """Class for decoding stim circuits using the LightsOut MaxSAT decoder. Parameters. ---------- @@ -26,9 +27,9 @@ def __init__(self, model: stim.DetectorErrorModel, timeout:int=1000) -> None: self.observables = self._matrices.observables_matrix self.problem.preconstruct_z3_instance(weights=[self.weight_function(p) for p in self._matrices.priors]) - def check_matrix_to_adj_lists(self, check_matrix: Any) -> tuple[dict, dict]: # noqa: ANN401 - qtf:dict[int,List[int]] = {} - ftq:dict[int,List[int]] = {} + def check_matrix_to_adj_lists(self, check_matrix: Any) -> tuple[dict, dict]: # noqa: ANN401 + qtf: dict[int, list[int]] = {} + ftq: dict[int, list[int]] = {} for row in range(check_matrix.shape[0]): for col in range(check_matrix.shape[1]): if check_matrix[row, col] == 1: @@ -40,10 +41,10 @@ def check_matrix_to_adj_lists(self, check_matrix: Any) -> tuple[dict, dict]: # n ftq[row].append(col) return qtf, ftq - def weight_function(self, x:np.float64) -> np.float64: + def weight_function(self, x: np.float64) -> np.float64: return np.log((1 - x) / x) - def decode(self, syndrome: np.ndarray[np.int]) -> (np.ndarray[np.int], bool): + def decode(self, syndrome: np.ndarray[int]) -> (np.ndarray[int], bool): """Decode the syndrome and return a prediction of which observables were flipped. Parameters @@ -67,11 +68,11 @@ def decode(self, syndrome: np.ndarray[np.int]) -> (np.ndarray[np.int], bool): def decode_batch( self, - shots: np.ndarray[np.int], + shots: np.ndarray[int], *, bit_packed_shots: bool = False, bit_packed_predictions: bool = False, - ) -> (np.ndarray[np.int], np.int, np.int): + ) -> (np.ndarray[int], int, int): """Decode a batch of shots of syndrome data. This is just a helper method, equivalent to iterating over each shot and calling `BPOSD.decode` on it. From 58d3678808858705529ad0a6cad900ec3fbd9ad3 Mon Sep 17 00:00:00 2001 From: lucas Date: Tue, 15 Oct 2024 17:15:43 +0200 Subject: [PATCH 13/79] try fix more hints --- pyproject.toml | 2 +- src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py | 7 +++++-- .../cc_decoder/stim_interface/max_sat_sinter_decoder.py | 6 +++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 392606a2..c56fe05b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -272,7 +272,7 @@ isort.required-imports = ["from __future__ import annotations"] "E402", # Allow imports to appear anywhere in Jupyter notebooks "I002", # Allow missing `from __future__ import annotations` import ] -"*/cc_decoder/plotting/**" = ["T201"] +"*/cc_decoder/plotting/**" = ["T20"] "scripts/*" = ["T201"] [tool.ruff.lint.pydocstyle] diff --git a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py index 43a4b2ac..22c2b9d1 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py @@ -1,8 +1,9 @@ +""" contains functionality to convert a detector error model to check matrices. """ # Author: Oscar Higgott https://github.com/oscarhiggott/stimbposd/blob/main/src/stimbposd/dem_to_matrices.py from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Set import numpy as np from scipy.sparse import csc_matrix @@ -11,7 +12,8 @@ import stim -def iter_set_xor(set_list: list[list[int]]) -> frozenset[int]: +def iter_set_xor(set_list: list[Set[int]]) -> frozenset[int]: + """ computes XOR between sets """ out: set[int] = set() for x in set_list: s = set(x) @@ -51,6 +53,7 @@ def dict_to_csc_matrix(elements_dict: dict[int, frozenset[int]], shape: tuple[in @dataclass class DemMatrices: + """ Class capturing the check matrices associated to a DEM. """ check_matrix: csc_matrix observables_matrix: csc_matrix edge_check_matrix: csc_matrix diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 1ad78490..a4faad28 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -1,3 +1,4 @@ +""" Sinter integration of the maxsat decoder. """ from __future__ import annotations import locale @@ -16,7 +17,8 @@ class SinterCompiledDecoder_MAXSAT(CompiledDecoder): - def __init__(self, decoder: MAXSAT, **kwargs) -> None: + """ MaxSAT decoder instantiation as CompiledDecoder. """ + def __init__(self, decoder: MaxSatStim, **kwargs) -> None: self.decoder = decoder if kwargs: @@ -57,6 +59,7 @@ def decode_shots_bit_packed( class SinterDecoder_MAXSAT(Decoder): + """ Sinter implementation of MaxSAT decoder. """ def __init__( self, **maxsat_kwargs, @@ -132,4 +135,5 @@ def decode_via_files( def sinter_decoders(**kwargs) -> dict[str, Decoder]: + """ return a list of available sinter decoders. """ return {"maxsat": SinterDecoder_MAXSAT(**kwargs), "bposd": SinterDecoder_BPOSD()} From 3afaf6c01d7c1e1a68d67c2f96528f7a97fff6bf Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 15:16:03 +0000 Subject: [PATCH 14/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cc_decoder/stim_interface/dem_to_matrices.py | 12 +++++++----- .../stim_interface/max_sat_sinter_decoder.py | 11 +++++++---- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py index 22c2b9d1..18f81deb 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py @@ -1,9 +1,10 @@ -""" contains functionality to convert a detector error model to check matrices. """ +"""contains functionality to convert a detector error model to check matrices.""" + # Author: Oscar Higgott https://github.com/oscarhiggott/stimbposd/blob/main/src/stimbposd/dem_to_matrices.py from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING, Set +from typing import TYPE_CHECKING import numpy as np from scipy.sparse import csc_matrix @@ -12,8 +13,8 @@ import stim -def iter_set_xor(set_list: list[Set[int]]) -> frozenset[int]: - """ computes XOR between sets """ +def iter_set_xor(set_list: list[set[int]]) -> frozenset[int]: + """Computes XOR between sets.""" out: set[int] = set() for x in set_list: s = set(x) @@ -53,7 +54,8 @@ def dict_to_csc_matrix(elements_dict: dict[int, frozenset[int]], shape: tuple[in @dataclass class DemMatrices: - """ Class capturing the check matrices associated to a DEM. """ + """Class capturing the check matrices associated to a DEM.""" + check_matrix: csc_matrix observables_matrix: csc_matrix edge_check_matrix: csc_matrix diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index a4faad28..a7f2d755 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -1,4 +1,5 @@ -""" Sinter integration of the maxsat decoder. """ +"""Sinter integration of the maxsat decoder.""" + from __future__ import annotations import locale @@ -17,7 +18,8 @@ class SinterCompiledDecoder_MAXSAT(CompiledDecoder): - """ MaxSAT decoder instantiation as CompiledDecoder. """ + """MaxSAT decoder instantiation as CompiledDecoder.""" + def __init__(self, decoder: MaxSatStim, **kwargs) -> None: self.decoder = decoder @@ -59,7 +61,8 @@ def decode_shots_bit_packed( class SinterDecoder_MAXSAT(Decoder): - """ Sinter implementation of MaxSAT decoder. """ + """Sinter implementation of MaxSAT decoder.""" + def __init__( self, **maxsat_kwargs, @@ -135,5 +138,5 @@ def decode_via_files( def sinter_decoders(**kwargs) -> dict[str, Decoder]: - """ return a list of available sinter decoders. """ + """Return a list of available sinter decoders.""" return {"maxsat": SinterDecoder_MAXSAT(**kwargs), "bposd": SinterDecoder_BPOSD()} From 8f7203aab5392137929a9b51b92a06646faa9c16 Mon Sep 17 00:00:00 2001 From: lucas Date: Tue, 15 Oct 2024 17:42:48 +0200 Subject: [PATCH 15/79] more fixes --- pyproject.toml | 1 + src/mqt/qecc/cc_decoder/plotting/plots.py | 5 +++-- src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py | 6 ++---- .../cc_decoder/stim_interface/max_sat_sinter_decoder.py | 6 ++++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c56fe05b..4943158e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -273,6 +273,7 @@ isort.required-imports = ["from __future__ import annotations"] "I002", # Allow missing `from __future__ import annotations` import ] "*/cc_decoder/plotting/**" = ["T20"] +"*/cc_decoder/plotting/*.ipynb" = ["T", "PTH", "FURB", "PERF", "D"] "scripts/*" = ["T201"] [tool.ruff.lint.pydocstyle] diff --git a/src/mqt/qecc/cc_decoder/plotting/plots.py b/src/mqt/qecc/cc_decoder/plotting/plots.py index b42eeabc..6f6bcd98 100644 --- a/src/mqt/qecc/cc_decoder/plotting/plots.py +++ b/src/mqt/qecc/cc_decoder/plotting/plots.py @@ -197,6 +197,7 @@ def generate_plots(results_dir: Path, results_file: Path) -> None: def generate_plots_tn(results_dir: Path, results_file: Path) -> None: + """ generate plots for TN decoder """ # read in all generated data data = [] for file in results_dir.glob("*.json"): @@ -233,7 +234,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: for code, xys in sorted(code_to_xys.items()): ax[1][0].plot(*zip(*xys), "x-", label=f"d={code}") ax[1][0].set_xlabel("Physical error rate") - ax[1][0].set_ylabel("Average time per run (µs)") + ax[1][0].set_ylabel("Average time per run (µs)") # noqa: RUF001 ax[1][0].legend() ax[1][0].set_ylim(0, 300000) @@ -253,7 +254,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: ax[1][1].plot(ds, data["t"], label="p=" + str(p)) ax[1][1].set_xlabel("Distance") - ax[1][1].set_ylabel("Average time per run (µs)") + ax[1][1].set_ylabel("Average time per run (µs)") # noqa: RUF001 ax[1][1].legend() ax[1][1].set_yscale("log") ax[1][1].set_xticks(ds) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py index 18f81deb..b49f1960 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py @@ -12,7 +12,6 @@ if TYPE_CHECKING: import stim - def iter_set_xor(set_list: list[set[int]]) -> frozenset[int]: """Computes XOR between sets.""" out: set[int] = set() @@ -23,8 +22,7 @@ def iter_set_xor(set_list: list[set[int]]) -> frozenset[int]: def dict_to_csc_matrix(elements_dict: dict[int, frozenset[int]], shape: tuple[int, int]) -> csc_matrix: - """Constructs a `scipy.sparse.csc_matrix` check matrix from a dictionary `elements_dict` giving the indices of nonzero - rows in each column. + """Constructs a `scipy.sparse.csc_matrix` check matrix from a dictionary `elements_dict`. Parameters ---------- @@ -61,7 +59,7 @@ class DemMatrices: edge_check_matrix: csc_matrix edge_observables_matrix: csc_matrix hyperedge_to_edge_matrix: csc_matrix - priors: NDarray[np.float64] + priors: np.ndarray[np.float64] def detector_error_model_to_check_matrices( diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index a7f2d755..e8c74c40 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -3,7 +3,7 @@ from __future__ import annotations import locale -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any import stim from sinter import CompiledDecoder, Decoder @@ -20,7 +20,8 @@ class SinterCompiledDecoder_MAXSAT(CompiledDecoder): """MaxSAT decoder instantiation as CompiledDecoder.""" - def __init__(self, decoder: MaxSatStim, **kwargs) -> None: + def __init__(self, decoder: MaxSatStim, **kwargs:dict[str, Any]) -> None: # noqa: ANN401 + """ constructor initializing compiled decoder with stim decoder. """ self.decoder = decoder if kwargs: @@ -37,6 +38,7 @@ def decode_shots_bit_packed( *, bit_packed_detection_event_data: np.ndarray, ) -> np.ndarray: + """ deocde bitpacked shots from sinter simulation using batch decoder. """ predictions, converged_cnt, not_converged_cnt = self.decoder.decode_batch( shots=bit_packed_detection_event_data, bit_packed_shots=True, From c37e89ac4f4f5a3632559d29248327fe7d8443be Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 15:43:06 +0000 Subject: [PATCH 16/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mqt/qecc/cc_decoder/plotting/plots.py | 6 +++--- src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py | 1 + .../cc_decoder/stim_interface/max_sat_sinter_decoder.py | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/plotting/plots.py b/src/mqt/qecc/cc_decoder/plotting/plots.py index 6f6bcd98..a812e869 100644 --- a/src/mqt/qecc/cc_decoder/plotting/plots.py +++ b/src/mqt/qecc/cc_decoder/plotting/plots.py @@ -197,7 +197,7 @@ def generate_plots(results_dir: Path, results_file: Path) -> None: def generate_plots_tn(results_dir: Path, results_file: Path) -> None: - """ generate plots for TN decoder """ + """Generate plots for TN decoder.""" # read in all generated data data = [] for file in results_dir.glob("*.json"): @@ -234,7 +234,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: for code, xys in sorted(code_to_xys.items()): ax[1][0].plot(*zip(*xys), "x-", label=f"d={code}") ax[1][0].set_xlabel("Physical error rate") - ax[1][0].set_ylabel("Average time per run (µs)") # noqa: RUF001 + ax[1][0].set_ylabel("Average time per run (µs)") # noqa: RUF001 ax[1][0].legend() ax[1][0].set_ylim(0, 300000) @@ -254,7 +254,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: ax[1][1].plot(ds, data["t"], label="p=" + str(p)) ax[1][1].set_xlabel("Distance") - ax[1][1].set_ylabel("Average time per run (µs)") # noqa: RUF001 + ax[1][1].set_ylabel("Average time per run (µs)") # noqa: RUF001 ax[1][1].legend() ax[1][1].set_yscale("log") ax[1][1].set_xticks(ds) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py index b49f1960..3d65507c 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py @@ -12,6 +12,7 @@ if TYPE_CHECKING: import stim + def iter_set_xor(set_list: list[set[int]]) -> frozenset[int]: """Computes XOR between sets.""" out: set[int] = set() diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index e8c74c40..b9ce47b0 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -20,8 +20,8 @@ class SinterCompiledDecoder_MAXSAT(CompiledDecoder): """MaxSAT decoder instantiation as CompiledDecoder.""" - def __init__(self, decoder: MaxSatStim, **kwargs:dict[str, Any]) -> None: # noqa: ANN401 - """ constructor initializing compiled decoder with stim decoder. """ + def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: + """Constructor initializing compiled decoder with stim decoder.""" self.decoder = decoder if kwargs: @@ -38,7 +38,7 @@ def decode_shots_bit_packed( *, bit_packed_detection_event_data: np.ndarray, ) -> np.ndarray: - """ deocde bitpacked shots from sinter simulation using batch decoder. """ + """Decode bitpacked shots from sinter simulation using batch decoder.""" predictions, converged_cnt, not_converged_cnt = self.decoder.decode_batch( shots=bit_packed_detection_event_data, bit_packed_shots=True, From de44781aae5c3e580f39ffd6a26bba8620b6c7b0 Mon Sep 17 00:00:00 2001 From: lucas Date: Tue, 15 Oct 2024 17:53:14 +0200 Subject: [PATCH 17/79] even more fixes --- .../stim_interface/max_sat_sinter_decoder.py | 24 ++++++++++--------- .../stim_interface/max_sat_stim_decoder.py | 10 ++++++-- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index b9ce47b0..7e625276 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -17,7 +17,7 @@ import numpy as np -class SinterCompiledDecoder_MAXSAT(CompiledDecoder): +class SinterCompiledDecoderMaxSat(CompiledDecoder): """MaxSAT decoder instantiation as CompiledDecoder.""" def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: @@ -47,7 +47,7 @@ def decode_shots_bit_packed( if self.measure_convergence: self.convergence_cnt += converged_cnt self.not_convergence_cnt += not_converged_cnt - with open("convergence_rate.txt", "a", encoding=locale.getpreferredencoding(False)) as self.f: + with pathlib.Path("convergence_rate.txt").open("a", encoding=locale.getpreferredencoding(False)) as self.f: self.f.write( str(self.d) + " " @@ -62,32 +62,34 @@ def decode_shots_bit_packed( return predictions -class SinterDecoder_MAXSAT(Decoder): +class SinterDecoderMaxSat(Decoder): """Sinter implementation of MaxSAT decoder.""" def __init__( self, - **maxsat_kwargs, + **maxsat_kwargs: Any, # noqa: ANN401 ) -> None: + """ init sinter decoder with kwargs. """ self.maxsat_kwargs = maxsat_kwargs def compile_decoder_for_dem(self, *, dem: stim.DetectorErrorModel) -> CompiledDecoder: + """ return sinter comiled decoder initialized with the given DEM. """ maxsat = MaxSatStim( model=dem, # **self.maxsat_kwargs, ) - return SinterCompiledDecoder_MAXSAT(maxsat, **self.maxsat_kwargs) + return SinterCompiledDecoderMaxSat(maxsat, **self.maxsat_kwargs) def decode_via_files( self, *, - num_shots: int, - num_dets: int, - num_obs: int, + num_shots: int, # noqa: ARG002 + num_dets: int, # noqa: ARG002 + num_obs: int, # noqa: ARG002 dem_path: pathlib.Path, dets_b8_in_path: pathlib.Path, obs_predictions_b8_out_path: pathlib.Path, - tmp_dir: pathlib.Path, + tmp_dir: pathlib.Path, # noqa: ARG002 ) -> None: """Performs decoding by reading problems from, and writing solutions to, file paths. @@ -139,6 +141,6 @@ def decode_via_files( ) -def sinter_decoders(**kwargs) -> dict[str, Decoder]: +def sinter_decoders(**kwargs: Any) -> dict[str, Decoder]: # noqa: ANN401 """Return a list of available sinter decoders.""" - return {"maxsat": SinterDecoder_MAXSAT(**kwargs), "bposd": SinterDecoder_BPOSD()} + return {"maxsat": SinterDecoderMaxSat(**kwargs), "bposd": SinterDecoder_BPOSD()} diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index 4fd0d5d0..6ad34984 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -1,3 +1,4 @@ +""" Implementation of the Stim decoder for the MaxSat algorithm. """ from __future__ import annotations from typing import TYPE_CHECKING, Any @@ -12,8 +13,10 @@ class MaxSatStim: - def __init__(self, model: stim.DetectorErrorModel, timeout: int = 1000) -> None: + """ MaxSat stim decoder implementation. """ + def __init__(self, model: stim.DetectorErrorModel) -> None: """Class for decoding stim circuits using the LightsOut MaxSAT decoder. + Parameters. ---------- model : stim.DetectorErrorModel @@ -27,7 +30,9 @@ def __init__(self, model: stim.DetectorErrorModel, timeout: int = 1000) -> None: self.observables = self._matrices.observables_matrix self.problem.preconstruct_z3_instance(weights=[self.weight_function(p) for p in self._matrices.priors]) - def check_matrix_to_adj_lists(self, check_matrix: Any) -> tuple[dict, dict]: # noqa: ANN401 + @staticmethod + def check_matrix_to_adj_lists(check_matrix: Any) -> tuple[dict, dict]: # noqa: ANN401 + """ converts a check matrix to two adjacency lists. """ qtf: dict[int, list[int]] = {} ftq: dict[int, list[int]] = {} for row in range(check_matrix.shape[0]): @@ -42,6 +47,7 @@ def check_matrix_to_adj_lists(self, check_matrix: Any) -> tuple[dict, dict]: # return qtf, ftq def weight_function(self, x: np.float64) -> np.float64: + """ return log likelihood weighting. """ return np.log((1 - x) / x) def decode(self, syndrome: np.ndarray[int]) -> (np.ndarray[int], bool): From c316411cbf5e11718355a0785e1fb6c1eca2efc5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 15:53:34 +0000 Subject: [PATCH 18/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stim_interface/max_sat_sinter_decoder.py | 15 +++++++-------- .../stim_interface/max_sat_stim_decoder.py | 10 ++++++---- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 7e625276..7d1948dd 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -3,6 +3,7 @@ from __future__ import annotations import locale +import pathlib from typing import TYPE_CHECKING, Any import stim @@ -12,8 +13,6 @@ from mqt.qecc.cc_decoder.stim_interface.max_sat_stim_decoder import MaxSatStim if TYPE_CHECKING: - import pathlib - import numpy as np @@ -69,11 +68,11 @@ def __init__( self, **maxsat_kwargs: Any, # noqa: ANN401 ) -> None: - """ init sinter decoder with kwargs. """ + """Init sinter decoder with kwargs.""" self.maxsat_kwargs = maxsat_kwargs def compile_decoder_for_dem(self, *, dem: stim.DetectorErrorModel) -> CompiledDecoder: - """ return sinter comiled decoder initialized with the given DEM. """ + """Return sinter compiled decoder initialized with the given DEM.""" maxsat = MaxSatStim( model=dem, # **self.maxsat_kwargs, @@ -83,13 +82,13 @@ def compile_decoder_for_dem(self, *, dem: stim.DetectorErrorModel) -> CompiledDe def decode_via_files( self, *, - num_shots: int, # noqa: ARG002 - num_dets: int, # noqa: ARG002 - num_obs: int, # noqa: ARG002 + num_shots: int, # noqa: ARG002 + num_dets: int, # noqa: ARG002 + num_obs: int, # noqa: ARG002 dem_path: pathlib.Path, dets_b8_in_path: pathlib.Path, obs_predictions_b8_out_path: pathlib.Path, - tmp_dir: pathlib.Path, # noqa: ARG002 + tmp_dir: pathlib.Path, # noqa: ARG002 ) -> None: """Performs decoding by reading problems from, and writing solutions to, file paths. diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index 6ad34984..48638030 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -1,4 +1,5 @@ -""" Implementation of the Stim decoder for the MaxSat algorithm. """ +"""Implementation of the Stim decoder for the MaxSat algorithm.""" + from __future__ import annotations from typing import TYPE_CHECKING, Any @@ -13,7 +14,8 @@ class MaxSatStim: - """ MaxSat stim decoder implementation. """ + """MaxSat stim decoder implementation.""" + def __init__(self, model: stim.DetectorErrorModel) -> None: """Class for decoding stim circuits using the LightsOut MaxSAT decoder. @@ -32,7 +34,7 @@ def __init__(self, model: stim.DetectorErrorModel) -> None: @staticmethod def check_matrix_to_adj_lists(check_matrix: Any) -> tuple[dict, dict]: # noqa: ANN401 - """ converts a check matrix to two adjacency lists. """ + """Converts a check matrix to two adjacency lists.""" qtf: dict[int, list[int]] = {} ftq: dict[int, list[int]] = {} for row in range(check_matrix.shape[0]): @@ -47,7 +49,7 @@ def check_matrix_to_adj_lists(check_matrix: Any) -> tuple[dict, dict]: # noqa: return qtf, ftq def weight_function(self, x: np.float64) -> np.float64: - """ return log likelihood weighting. """ + """Return log likelihood weighting.""" return np.log((1 - x) / x) def decode(self, syndrome: np.ndarray[int]) -> (np.ndarray[int], bool): From e1b2d04ab3a54da8379de96b6da461522843320f Mon Sep 17 00:00:00 2001 From: lucas Date: Tue, 15 Oct 2024 17:55:47 +0200 Subject: [PATCH 19/79] hopefully make precommit happy now --- .../qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index 48638030..6aa41f9d 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -48,7 +48,8 @@ def check_matrix_to_adj_lists(check_matrix: Any) -> tuple[dict, dict]: # noqa: ftq[row].append(col) return qtf, ftq - def weight_function(self, x: np.float64) -> np.float64: + @staticmethod + def weight_function(x: np.float64) -> np.float64: """Return log likelihood weighting.""" return np.log((1 - x) / x) @@ -81,8 +82,7 @@ def decode_batch( bit_packed_shots: bool = False, bit_packed_predictions: bool = False, ) -> (np.ndarray[int], int, int): - """Decode a batch of shots of syndrome data. This is just a helper method, equivalent to iterating over each - shot and calling `BPOSD.decode` on it. + """Decode a batch of shots of syndrome data by iterating over each shot. Parameters ---------- From 4ead23425a5374add3b022f43c9a6c72fe54c4fd Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 16 Oct 2024 09:55:27 +0200 Subject: [PATCH 20/79] fix missing param --- src/mqt/qecc/cc_decoder/decoder.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/decoder.py b/src/mqt/qecc/cc_decoder/decoder.py index 3b7a65bd..e4bf79b8 100644 --- a/src/mqt/qecc/cc_decoder/decoder.py +++ b/src/mqt/qecc/cc_decoder/decoder.py @@ -62,7 +62,7 @@ def complete_parity_constraint(self, light: int, indices: list[int], val: bool) constraint = Xor(self.switch_vars[indices[0]], helper_vars[0]) == val self.optimizer.add(simplify(constraint)) - def preconstruct_z3_instance(self, weights: np.NDArray[float]) -> None: + def preconstruct_z3_instance(self, weights: np.NDArray[float] = None) -> None: """Preconstruct the z3 instance for the lights-out problem. Creates all necessary variables, adds the known parts of the parity constraints. @@ -79,8 +79,12 @@ def preconstruct_z3_instance(self, weights: np.NDArray[float]) -> None: self.helper_vars[light] = [Bool(f"helper_{light}_{i}") for i in range(len(switches))] self.preconstruct_parity_constraint(light, switches) - for idx, switch in enumerate(self.switch_vars): - self.optimizer.add_soft(Not(switch), weights[idx]) + if weights is not None and len(weights) > 0: + for idx, switch in enumerate(self.switch_vars): + self.optimizer.add_soft(Not(switch), weights[idx]) + else: + for idx, switch in enumerate(self.switch_vars): + self.optimizer.add_soft(Not(switch)) def validate_model(self, model: ModelRef, lights: list[bool]) -> bool: """Validate the model by checking if pressing the switches turns off all lights.""" @@ -136,7 +140,7 @@ def solve(self, lights: list[bool], solver_path: str = "z3") -> tuple[list[int], # Note: This merely calls the solver. It does not interpret the output. # This is just to measure the time it takes to solve the problem. with Path("./solver-out_" + solver_path.split("/")[-1] + ".txt").open( - "a+", encoding=locale.getpreferredencoding(False) + "a+", encoding=locale.getpreferredencoding(False) ) as out: start = timer() subprocess.run([solver_path, wcnf], stdout=out, check=False) # noqa: S603 @@ -204,12 +208,12 @@ def simulate_error_rate(code: ColorCode, error_rate: float, nr_sims: int, solver def run( - lattice_type: str, - distance: int, - error_rate: float, - nr_sims: int = 10000, - results_dir: str = "./results_maxsat", - solver: str = "z3", + lattice_type: str, + distance: int, + error_rate: float, + nr_sims: int = 10000, + results_dir: str = "./results_maxsat", + solver: str = "z3", ) -> None: """Run the decoding simulation for a given distance and error rate.""" code = code_from_string(lattice_type, distance) From 2ac8366706682e10102c8263328c6eace07bbb98 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 07:55:50 +0000 Subject: [PATCH 21/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mqt/qecc/cc_decoder/decoder.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/decoder.py b/src/mqt/qecc/cc_decoder/decoder.py index e4bf79b8..9ecd0a15 100644 --- a/src/mqt/qecc/cc_decoder/decoder.py +++ b/src/mqt/qecc/cc_decoder/decoder.py @@ -140,7 +140,7 @@ def solve(self, lights: list[bool], solver_path: str = "z3") -> tuple[list[int], # Note: This merely calls the solver. It does not interpret the output. # This is just to measure the time it takes to solve the problem. with Path("./solver-out_" + solver_path.split("/")[-1] + ".txt").open( - "a+", encoding=locale.getpreferredencoding(False) + "a+", encoding=locale.getpreferredencoding(False) ) as out: start = timer() subprocess.run([solver_path, wcnf], stdout=out, check=False) # noqa: S603 @@ -208,12 +208,12 @@ def simulate_error_rate(code: ColorCode, error_rate: float, nr_sims: int, solver def run( - lattice_type: str, - distance: int, - error_rate: float, - nr_sims: int = 10000, - results_dir: str = "./results_maxsat", - solver: str = "z3", + lattice_type: str, + distance: int, + error_rate: float, + nr_sims: int = 10000, + results_dir: str = "./results_maxsat", + solver: str = "z3", ) -> None: """Run the decoding simulation for a given distance and error rate.""" code = code_from_string(lattice_type, distance) From f05fed48230beae4941443e3568601294fb9e9de Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 16 Oct 2024 10:22:37 +0200 Subject: [PATCH 22/79] fix warnings --- src/mqt/qecc/cc_decoder/decoder.py | 4 ++-- .../cc_decoder/stim_interface/dem_to_matrices.py | 4 ++-- .../stim_interface/max_sat_sinter_decoder.py | 4 ++-- .../stim_interface/max_sat_stim_decoder.py | 14 +++++++------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/decoder.py b/src/mqt/qecc/cc_decoder/decoder.py index 9ecd0a15..8c5232d7 100644 --- a/src/mqt/qecc/cc_decoder/decoder.py +++ b/src/mqt/qecc/cc_decoder/decoder.py @@ -83,8 +83,8 @@ def preconstruct_z3_instance(self, weights: np.NDArray[float] = None) -> None: for idx, switch in enumerate(self.switch_vars): self.optimizer.add_soft(Not(switch), weights[idx]) else: - for idx, switch in enumerate(self.switch_vars): - self.optimizer.add_soft(Not(switch)) + for _, switchh in enumerate(self.switch_vars): + self.optimizer.add_soft(Not(switchh)) def validate_model(self, model: ModelRef, lights: list[bool]) -> bool: """Validate the model by checking if pressing the switches turns off all lights.""" diff --git a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py index 3d65507c..80ee3fc7 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py @@ -13,7 +13,7 @@ import stim -def iter_set_xor(set_list: list[set[int]]) -> frozenset[int]: +def iter_set_xor(set_list: list[list[int]]) -> frozenset[int]: """Computes XOR between sets.""" out: set[int] = set() for x in set_list: @@ -60,7 +60,7 @@ class DemMatrices: edge_check_matrix: csc_matrix edge_observables_matrix: csc_matrix hyperedge_to_edge_matrix: csc_matrix - priors: np.ndarray[np.float64] + priors: np.NDarray[np.float64] def detector_error_model_to_check_matrices( diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 7d1948dd..208b4681 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -35,8 +35,8 @@ def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: def decode_shots_bit_packed( self, *, - bit_packed_detection_event_data: np.ndarray, - ) -> np.ndarray: + bit_packed_detection_event_data: np.NDarray[np.NDarray[np.uint8]], + ) -> np.NDarray[np.uint8]: """Decode bitpacked shots from sinter simulation using batch decoder.""" predictions, converged_cnt, not_converged_cnt = self.decoder.decode_batch( shots=bit_packed_detection_event_data, diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index 6aa41f9d..0ea18d84 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -53,19 +53,19 @@ def weight_function(x: np.float64) -> np.float64: """Return log likelihood weighting.""" return np.log((1 - x) / x) - def decode(self, syndrome: np.ndarray[int]) -> (np.ndarray[int], bool): + def decode(self, syndrome: np.NDarray[int]) -> (np.NDarray[int], bool): """Decode the syndrome and return a prediction of which observables were flipped. Parameters ---------- - syndrome : np.ndarray + syndrome : np.NDarray A single shot of syndrome data. This should be a binary array with a length equal to the number of detectors in the `stim.Circuit` or `stim.DetectorErrorModel`. E.g. the syndrome might be one row of shot data sampled from a `stim.CompiledDetectorSampler`. Returns: ------- - np.ndarray + np.NDarray A binary numpy array `predictions` which predicts which observables were flipped. Its length is equal to the number of observables in the `stim.Circuit` or `stim.DetectorErrorModel`. `predictions[i]` is 1 if the decoder predicts observable `i` was flipped and 0 otherwise. @@ -77,22 +77,22 @@ def decode(self, syndrome: np.ndarray[int]) -> (np.ndarray[int], bool): def decode_batch( self, - shots: np.ndarray[int], + shots: np.NDarray[int], *, bit_packed_shots: bool = False, bit_packed_predictions: bool = False, - ) -> (np.ndarray[int], int, int): + ) -> (np.NDarray[int], int, int): """Decode a batch of shots of syndrome data by iterating over each shot. Parameters ---------- - shots : np.ndarray + shots : np.NDarray A binary numpy array of dtype `np.uint8` or `bool` with shape `(num_shots, num_detectors)`, where here `num_shots` is the number of shots and `num_detectors` is the number of detectors in the `stim.Circuit` or `stim.DetectorErrorModel`. Returns: ------- - np.ndarray + np.NDarray A 2D numpy array `predictions` of dtype bool, where `predictions[i, :]` is the output of `self.decode(shots[i, :])`. """ From d3dd2505acb758a7435ace79d34a5f19cfe0ba67 Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 16 Oct 2024 10:34:24 +0200 Subject: [PATCH 23/79] mypy fixes --- .../stim_interface/max_sat_sinter_decoder.py | 26 +++++++++---------- .../stim_interface/max_sat_stim_decoder.py | 8 +++--- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 208b4681..688ba7de 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -4,7 +4,7 @@ import locale import pathlib -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, Dict import stim from sinter import CompiledDecoder, Decoder @@ -19,7 +19,7 @@ class SinterCompiledDecoderMaxSat(CompiledDecoder): """MaxSAT decoder instantiation as CompiledDecoder.""" - def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: + def __init__(self, decoder: MaxSatStim, **kwargs: Dict[str, Any]) -> None: """Constructor initializing compiled decoder with stim decoder.""" self.decoder = decoder @@ -38,10 +38,10 @@ def decode_shots_bit_packed( bit_packed_detection_event_data: np.NDarray[np.NDarray[np.uint8]], ) -> np.NDarray[np.uint8]: """Decode bitpacked shots from sinter simulation using batch decoder.""" - predictions, converged_cnt, not_converged_cnt = self.decoder.decode_batch( + preDictions, converged_cnt, not_converged_cnt = self.decoder.decode_batch( shots=bit_packed_detection_event_data, bit_packed_shots=True, - bit_packed_predictions=True, + bit_packed_preDictions=True, ) if self.measure_convergence: self.convergence_cnt += converged_cnt @@ -58,7 +58,7 @@ def decode_shots_bit_packed( + "\n" ) - return predictions + return preDictions class SinterDecoderMaxSat(Decoder): @@ -87,7 +87,7 @@ def decode_via_files( num_obs: int, # noqa: ARG002 dem_path: pathlib.Path, dets_b8_in_path: pathlib.Path, - obs_predictions_b8_out_path: pathlib.Path, + obs_preDictions_b8_out_path: pathlib.Path, tmp_dir: pathlib.Path, # noqa: ARG002 ) -> None: """Performs decoding by reading problems from, and writing solutions to, file paths. @@ -97,7 +97,7 @@ def decode_via_files( to be solved. num_dets: The number of detectors in the circuit. The number of detection event bits in each shot. - num_obs: The number of observables in the circuit. The number of predicted bits + num_obs: The number of observables in the circuit. The number of preDicted bits in each shot. dem_path: The file path where the detector error model should be read from, e.g. using `stim.DetectorErrorModel.from_file`. The error mechanisms @@ -109,8 +109,8 @@ def decode_via_files( https://github.com/quantumlib/Stim/blob/main/doc/result_formats.md ). The number of detection events per shot is available via the `num_dets` argument or via the detector error model at `dem_path`. - obs_predictions_b8_out_path: The file path that decoder predictions must be - written to. The predictions must be written in b8 format (see + obs_preDictions_b8_out_path: The file path that decoder preDictions must be + written to. The preDictions must be written in b8 format (see https://github.com/quantumlib/Stim/blob/main/doc/result_formats.md ). The number of observables per shot is available via the `num_obs` argument or via the detector error model at `dem_path`. @@ -131,15 +131,15 @@ def decode_via_files( num_detectors=dem.num_detectors, bit_packed=False, ) - predictions, _, _ = max_sat.decode_batch(shots) + preDictions, _, _ = max_sat.decode_batch(shots) stim.write_shot_data_file( - data=predictions, - path=obs_predictions_b8_out_path, + data=preDictions, + path=obs_preDictions_b8_out_path, format="b8", num_observables=dem.num_observables, ) -def sinter_decoders(**kwargs: Any) -> dict[str, Decoder]: # noqa: ANN401 +def sinter_decoders(**kwargs: Any) -> Dict[str, Decoder]: # noqa: ANN401 """Return a list of available sinter decoders.""" return {"maxsat": SinterDecoderMaxSat(**kwargs), "bposd": SinterDecoder_BPOSD()} diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index 0ea18d84..1a507445 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, Tuple import numpy as np @@ -33,10 +33,10 @@ def __init__(self, model: stim.DetectorErrorModel) -> None: self.problem.preconstruct_z3_instance(weights=[self.weight_function(p) for p in self._matrices.priors]) @staticmethod - def check_matrix_to_adj_lists(check_matrix: Any) -> tuple[dict, dict]: # noqa: ANN401 + def check_matrix_to_adj_lists(check_matrix: Any) -> Tuple[dict, dict]: # noqa: ANN401 """Converts a check matrix to two adjacency lists.""" - qtf: dict[int, list[int]] = {} - ftq: dict[int, list[int]] = {} + qtf: Dict[int, List[int]] = {} + ftq: Dict[int, List[int]] = {} for row in range(check_matrix.shape[0]): for col in range(check_matrix.shape[1]): if check_matrix[row, col] == 1: From 4711427299c480d9a6022b3abe0495011c5dc867 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 08:36:44 +0000 Subject: [PATCH 24/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cc_decoder/stim_interface/max_sat_sinter_decoder.py | 6 +++--- .../qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 688ba7de..62cfdc0d 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -4,7 +4,7 @@ import locale import pathlib -from typing import TYPE_CHECKING, Any, Dict +from typing import TYPE_CHECKING, Any import stim from sinter import CompiledDecoder, Decoder @@ -19,7 +19,7 @@ class SinterCompiledDecoderMaxSat(CompiledDecoder): """MaxSAT decoder instantiation as CompiledDecoder.""" - def __init__(self, decoder: MaxSatStim, **kwargs: Dict[str, Any]) -> None: + def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: """Constructor initializing compiled decoder with stim decoder.""" self.decoder = decoder @@ -140,6 +140,6 @@ def decode_via_files( ) -def sinter_decoders(**kwargs: Any) -> Dict[str, Decoder]: # noqa: ANN401 +def sinter_decoders(**kwargs: Any) -> dict[str, Decoder]: # noqa: ANN401 """Return a list of available sinter decoders.""" return {"maxsat": SinterDecoderMaxSat(**kwargs), "bposd": SinterDecoder_BPOSD()} diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index 1a507445..b9d84876 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Tuple +from typing import TYPE_CHECKING, Any import numpy as np @@ -33,7 +33,7 @@ def __init__(self, model: stim.DetectorErrorModel) -> None: self.problem.preconstruct_z3_instance(weights=[self.weight_function(p) for p in self._matrices.priors]) @staticmethod - def check_matrix_to_adj_lists(check_matrix: Any) -> Tuple[dict, dict]: # noqa: ANN401 + def check_matrix_to_adj_lists(check_matrix: Any) -> tuple[dict, dict]: # noqa: ANN401 """Converts a check matrix to two adjacency lists.""" qtf: Dict[int, List[int]] = {} ftq: Dict[int, List[int]] = {} From 0d6925c85184decc921dd179762cf871e0036e09 Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 16 Oct 2024 10:49:34 +0200 Subject: [PATCH 25/79] fix replace issues --- .../cc_decoder/stim_interface/max_sat_sinter_decoder.py | 6 +++--- .../qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py | 5 +---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 62cfdc0d..688ba7de 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -4,7 +4,7 @@ import locale import pathlib -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, Dict import stim from sinter import CompiledDecoder, Decoder @@ -19,7 +19,7 @@ class SinterCompiledDecoderMaxSat(CompiledDecoder): """MaxSAT decoder instantiation as CompiledDecoder.""" - def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: + def __init__(self, decoder: MaxSatStim, **kwargs: Dict[str, Any]) -> None: """Constructor initializing compiled decoder with stim decoder.""" self.decoder = decoder @@ -140,6 +140,6 @@ def decode_via_files( ) -def sinter_decoders(**kwargs: Any) -> dict[str, Decoder]: # noqa: ANN401 +def sinter_decoders(**kwargs: Any) -> Dict[str, Decoder]: # noqa: ANN401 """Return a list of available sinter decoders.""" return {"maxsat": SinterDecoderMaxSat(**kwargs), "bposd": SinterDecoder_BPOSD()} diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index b9d84876..81f0d26e 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -1,11 +1,8 @@ """Implementation of the Stim decoder for the MaxSat algorithm.""" from __future__ import annotations - -from typing import TYPE_CHECKING, Any - +from typing import TYPE_CHECKING, Any, Dict, List import numpy as np - from mqt.qecc.cc_decoder.max_sat_decoder import LightsOut from mqt.qecc.cc_decoder.stim_interface.dem_to_matrices import detector_error_model_to_check_matrices From c610f14ade64d68443f3699d3be09c47df362809 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 08:49:52 +0000 Subject: [PATCH 26/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cc_decoder/stim_interface/max_sat_sinter_decoder.py | 6 +++--- .../cc_decoder/stim_interface/max_sat_stim_decoder.py | 9 ++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 688ba7de..62cfdc0d 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -4,7 +4,7 @@ import locale import pathlib -from typing import TYPE_CHECKING, Any, Dict +from typing import TYPE_CHECKING, Any import stim from sinter import CompiledDecoder, Decoder @@ -19,7 +19,7 @@ class SinterCompiledDecoderMaxSat(CompiledDecoder): """MaxSAT decoder instantiation as CompiledDecoder.""" - def __init__(self, decoder: MaxSatStim, **kwargs: Dict[str, Any]) -> None: + def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: """Constructor initializing compiled decoder with stim decoder.""" self.decoder = decoder @@ -140,6 +140,6 @@ def decode_via_files( ) -def sinter_decoders(**kwargs: Any) -> Dict[str, Decoder]: # noqa: ANN401 +def sinter_decoders(**kwargs: Any) -> dict[str, Decoder]: # noqa: ANN401 """Return a list of available sinter decoders.""" return {"maxsat": SinterDecoderMaxSat(**kwargs), "bposd": SinterDecoder_BPOSD()} diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index 81f0d26e..0ea18d84 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -1,8 +1,11 @@ """Implementation of the Stim decoder for the MaxSat algorithm.""" from __future__ import annotations -from typing import TYPE_CHECKING, Any, Dict, List + +from typing import TYPE_CHECKING, Any + import numpy as np + from mqt.qecc.cc_decoder.max_sat_decoder import LightsOut from mqt.qecc.cc_decoder.stim_interface.dem_to_matrices import detector_error_model_to_check_matrices @@ -32,8 +35,8 @@ def __init__(self, model: stim.DetectorErrorModel) -> None: @staticmethod def check_matrix_to_adj_lists(check_matrix: Any) -> tuple[dict, dict]: # noqa: ANN401 """Converts a check matrix to two adjacency lists.""" - qtf: Dict[int, List[int]] = {} - ftq: Dict[int, List[int]] = {} + qtf: dict[int, list[int]] = {} + ftq: dict[int, list[int]] = {} for row in range(check_matrix.shape[0]): for col in range(check_matrix.shape[1]): if check_matrix[row, col] == 1: From e9d384e006cdf5165700175e991c8fa76fa5c997 Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 16 Oct 2024 10:52:12 +0200 Subject: [PATCH 27/79] fix replace issues --- .../stim_interface/max_sat_sinter_decoder.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 62cfdc0d..3c555fa3 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -38,10 +38,10 @@ def decode_shots_bit_packed( bit_packed_detection_event_data: np.NDarray[np.NDarray[np.uint8]], ) -> np.NDarray[np.uint8]: """Decode bitpacked shots from sinter simulation using batch decoder.""" - preDictions, converged_cnt, not_converged_cnt = self.decoder.decode_batch( + predictions, converged_cnt, not_converged_cnt = self.decoder.decode_batch( shots=bit_packed_detection_event_data, bit_packed_shots=True, - bit_packed_preDictions=True, + bit_packed_predictions=True, ) if self.measure_convergence: self.convergence_cnt += converged_cnt @@ -58,7 +58,7 @@ def decode_shots_bit_packed( + "\n" ) - return preDictions + return predictions class SinterDecoderMaxSat(Decoder): @@ -87,7 +87,7 @@ def decode_via_files( num_obs: int, # noqa: ARG002 dem_path: pathlib.Path, dets_b8_in_path: pathlib.Path, - obs_preDictions_b8_out_path: pathlib.Path, + obs_predictions_b8_out_path: pathlib.Path, tmp_dir: pathlib.Path, # noqa: ARG002 ) -> None: """Performs decoding by reading problems from, and writing solutions to, file paths. @@ -109,8 +109,8 @@ def decode_via_files( https://github.com/quantumlib/Stim/blob/main/doc/result_formats.md ). The number of detection events per shot is available via the `num_dets` argument or via the detector error model at `dem_path`. - obs_preDictions_b8_out_path: The file path that decoder preDictions must be - written to. The preDictions must be written in b8 format (see + obs_predictions_b8_out_path: The file path that decoder predictions must be + written to. The predictions must be written in b8 format (see https://github.com/quantumlib/Stim/blob/main/doc/result_formats.md ). The number of observables per shot is available via the `num_obs` argument or via the detector error model at `dem_path`. @@ -131,10 +131,10 @@ def decode_via_files( num_detectors=dem.num_detectors, bit_packed=False, ) - preDictions, _, _ = max_sat.decode_batch(shots) + predictions, _, _ = max_sat.decode_batch(shots) stim.write_shot_data_file( - data=preDictions, - path=obs_preDictions_b8_out_path, + data=predictions, + path=obs_predictions_b8_out_path, format="b8", num_observables=dem.num_observables, ) From a4b42d6313a6660de945297ef10944a853c82031 Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 16 Oct 2024 10:56:22 +0200 Subject: [PATCH 28/79] mypy fixes --- .../stim_interface/dem_to_matrices.py | 34 +++++++++---------- .../stim_interface/max_sat_sinter_decoder.py | 6 ++-- .../stim_interface/max_sat_stim_decoder.py | 8 ++--- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py index 80ee3fc7..b14d93ac 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py @@ -4,7 +4,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, List, FrozenSet, Dict, Set import numpy as np from scipy.sparse import csc_matrix @@ -13,22 +13,22 @@ import stim -def iter_set_xor(set_list: list[list[int]]) -> frozenset[int]: +def iter_set_xor(set_list: List[List[int]]) -> FrozenSet[int]: """Computes XOR between sets.""" - out: set[int] = set() + out: Set[int] = set() for x in set_list: s = set(x) out = (out - s) | (s - out) return frozenset(out) -def dict_to_csc_matrix(elements_dict: dict[int, frozenset[int]], shape: tuple[int, int]) -> csc_matrix: +def dict_to_csc_matrix(elements_dict: Dict[int, FrozenSet[int]], shape: tuple[int, int]) -> csc_matrix: """Constructs a `scipy.sparse.csc_matrix` check matrix from a dictionary `elements_dict`. Parameters ---------- - elements_dict : dict[int, frozenset[int]] - A dictionary giving the indices of nonzero rows in each column. `elements_dict[i]` is a frozenset of ints + elements_dict : Dict[int, FrozenSet[int]] + A dictionary giving the indices of nonzero rows in each column. `elements_dict[i]` is a FrozenSet of ints giving the indices of nonzero rows in column `i`. shape : Tuple[int, int] The dimensions of the matrix to be returned @@ -82,14 +82,14 @@ def detector_error_model_to_check_matrices( DemMatrices A collection of matrices representing the stim DetectorErrorModel """ - hyperedge_ids: dict[frozenset[int], int] = {} - edge_ids: dict[frozenset[int], int] = {} - hyperedge_obs_map: dict[int, frozenset[int]] = {} - edge_obs_map: dict[int, frozenset[int]] = {} - priors_dict: dict[int, float] = {} - hyperedge_to_edge: dict[int, frozenset[int]] = {} - - def handle_error(prob: float, detectors: list[list[int]], observables: list[list[int]]) -> None: + hyperedge_ids: Dict[FrozenSet[int], int] = {} + edge_ids: Dict[FrozenSet[int], int] = {} + hyperedge_obs_map: Dict[int, FrozenSet[int]] = {} + edge_obs_map: Dict[int, FrozenSet[int]] = {} + priors_dict: Dict[int, float] = {} + hyperedge_to_edge: Dict[int, FrozenSet[int]] = {} + + def handle_error(prob: float, detectors: List[List[int]], observables: List[List[int]]) -> None: hyperedge_dets = iter_set_xor(detectors) hyperedge_obs = iter_set_xor(observables) @@ -109,7 +109,7 @@ def handle_error(prob: float, detectors: list[list[int]], observables: list[list if not allow_undecomposed_hyperedges: msg = ( "A hyperedge error mechanism was found that was not decomposed into edges. " - "This can happen if you do not set `decompose_errors=True` as required when " + "This can happen if you do not Set `decompose_errors=True` as required when " "calling `circuit.detector_error_model`." ) raise ValueError(msg) @@ -126,8 +126,8 @@ def handle_error(prob: float, detectors: list[list[int]], observables: list[list for instruction in dem.flattened(): if instruction.type == "error": - dets: list[list[int]] = [[]] - frames: list[list[int]] = [[]] + dets: List[List[int]] = [[]] + frames: List[List[int]] = [[]] t: stim.DemTarget p = instruction.args_copy()[0] for t in instruction.targets_copy(): diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 3c555fa3..f6beeed0 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -4,7 +4,7 @@ import locale import pathlib -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, Dict import stim from sinter import CompiledDecoder, Decoder @@ -19,7 +19,7 @@ class SinterCompiledDecoderMaxSat(CompiledDecoder): """MaxSAT decoder instantiation as CompiledDecoder.""" - def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: + def __init__(self, decoder: MaxSatStim, **kwargs: Dict[str, Any]) -> None: """Constructor initializing compiled decoder with stim decoder.""" self.decoder = decoder @@ -140,6 +140,6 @@ def decode_via_files( ) -def sinter_decoders(**kwargs: Any) -> dict[str, Decoder]: # noqa: ANN401 +def sinter_decoders(**kwargs: Any) -> Dict[str, Decoder]: # noqa: ANN401 """Return a list of available sinter decoders.""" return {"maxsat": SinterDecoderMaxSat(**kwargs), "bposd": SinterDecoder_BPOSD()} diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index 0ea18d84..18b32cb2 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, Tuple, List, Dict import numpy as np @@ -33,10 +33,10 @@ def __init__(self, model: stim.DetectorErrorModel) -> None: self.problem.preconstruct_z3_instance(weights=[self.weight_function(p) for p in self._matrices.priors]) @staticmethod - def check_matrix_to_adj_lists(check_matrix: Any) -> tuple[dict, dict]: # noqa: ANN401 + def check_matrix_to_adj_lists(check_matrix: Any) -> Tuple[dict, dict]: # noqa: ANN401 """Converts a check matrix to two adjacency lists.""" - qtf: dict[int, list[int]] = {} - ftq: dict[int, list[int]] = {} + qtf: Dict[int, List[int]] = {} + ftq: Dict[int, List[int]] = {} for row in range(check_matrix.shape[0]): for col in range(check_matrix.shape[1]): if check_matrix[row, col] == 1: From 61df30fe503de541b497066380a62fbe405763f0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 08:56:48 +0000 Subject: [PATCH 29/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stim_interface/dem_to_matrices.py | 28 +++++++++---------- .../stim_interface/max_sat_sinter_decoder.py | 6 ++-- .../stim_interface/max_sat_stim_decoder.py | 8 +++--- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py index b14d93ac..c5830d45 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py @@ -4,7 +4,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING, List, FrozenSet, Dict, Set +from typing import TYPE_CHECKING import numpy as np from scipy.sparse import csc_matrix @@ -13,16 +13,16 @@ import stim -def iter_set_xor(set_list: List[List[int]]) -> FrozenSet[int]: +def iter_set_xor(set_list: list[list[int]]) -> frozenset[int]: """Computes XOR between sets.""" - out: Set[int] = set() + out: set[int] = set() for x in set_list: s = set(x) out = (out - s) | (s - out) return frozenset(out) -def dict_to_csc_matrix(elements_dict: Dict[int, FrozenSet[int]], shape: tuple[int, int]) -> csc_matrix: +def dict_to_csc_matrix(elements_dict: dict[int, frozenset[int]], shape: tuple[int, int]) -> csc_matrix: """Constructs a `scipy.sparse.csc_matrix` check matrix from a dictionary `elements_dict`. Parameters @@ -82,14 +82,14 @@ def detector_error_model_to_check_matrices( DemMatrices A collection of matrices representing the stim DetectorErrorModel """ - hyperedge_ids: Dict[FrozenSet[int], int] = {} - edge_ids: Dict[FrozenSet[int], int] = {} - hyperedge_obs_map: Dict[int, FrozenSet[int]] = {} - edge_obs_map: Dict[int, FrozenSet[int]] = {} - priors_dict: Dict[int, float] = {} - hyperedge_to_edge: Dict[int, FrozenSet[int]] = {} - - def handle_error(prob: float, detectors: List[List[int]], observables: List[List[int]]) -> None: + hyperedge_ids: dict[frozenset[int], int] = {} + edge_ids: dict[frozenset[int], int] = {} + hyperedge_obs_map: dict[int, frozenset[int]] = {} + edge_obs_map: dict[int, frozenset[int]] = {} + priors_dict: dict[int, float] = {} + hyperedge_to_edge: dict[int, frozenset[int]] = {} + + def handle_error(prob: float, detectors: list[list[int]], observables: list[list[int]]) -> None: hyperedge_dets = iter_set_xor(detectors) hyperedge_obs = iter_set_xor(observables) @@ -126,8 +126,8 @@ def handle_error(prob: float, detectors: List[List[int]], observables: List[List for instruction in dem.flattened(): if instruction.type == "error": - dets: List[List[int]] = [[]] - frames: List[List[int]] = [[]] + dets: list[list[int]] = [[]] + frames: list[list[int]] = [[]] t: stim.DemTarget p = instruction.args_copy()[0] for t in instruction.targets_copy(): diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index f6beeed0..3c555fa3 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -4,7 +4,7 @@ import locale import pathlib -from typing import TYPE_CHECKING, Any, Dict +from typing import TYPE_CHECKING, Any import stim from sinter import CompiledDecoder, Decoder @@ -19,7 +19,7 @@ class SinterCompiledDecoderMaxSat(CompiledDecoder): """MaxSAT decoder instantiation as CompiledDecoder.""" - def __init__(self, decoder: MaxSatStim, **kwargs: Dict[str, Any]) -> None: + def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: """Constructor initializing compiled decoder with stim decoder.""" self.decoder = decoder @@ -140,6 +140,6 @@ def decode_via_files( ) -def sinter_decoders(**kwargs: Any) -> Dict[str, Decoder]: # noqa: ANN401 +def sinter_decoders(**kwargs: Any) -> dict[str, Decoder]: # noqa: ANN401 """Return a list of available sinter decoders.""" return {"maxsat": SinterDecoderMaxSat(**kwargs), "bposd": SinterDecoder_BPOSD()} diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index 18b32cb2..0ea18d84 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Tuple, List, Dict +from typing import TYPE_CHECKING, Any import numpy as np @@ -33,10 +33,10 @@ def __init__(self, model: stim.DetectorErrorModel) -> None: self.problem.preconstruct_z3_instance(weights=[self.weight_function(p) for p in self._matrices.priors]) @staticmethod - def check_matrix_to_adj_lists(check_matrix: Any) -> Tuple[dict, dict]: # noqa: ANN401 + def check_matrix_to_adj_lists(check_matrix: Any) -> tuple[dict, dict]: # noqa: ANN401 """Converts a check matrix to two adjacency lists.""" - qtf: Dict[int, List[int]] = {} - ftq: Dict[int, List[int]] = {} + qtf: dict[int, list[int]] = {} + ftq: dict[int, list[int]] = {} for row in range(check_matrix.shape[0]): for col in range(check_matrix.shape[1]): if check_matrix[row, col] == 1: From 1c030d554464b4cf9683fee83d4d845a0dbadd82 Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 16 Oct 2024 11:13:00 +0200 Subject: [PATCH 30/79] mypy fixes --- .../stim_interface/color_code_stim.py | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py index fce16542..bae259fe 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py @@ -3,7 +3,7 @@ from __future__ import annotations import itertools as it -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, List, Tuple, Set import numpy as np import stim @@ -12,18 +12,18 @@ from numpy.typing import NDArray -def neighbors(perm: NDArray[int]) -> list[NDArray[int]]: +def neighbors(perm: NDArray[int]) -> NDArray[NDArray[NDArray[int]]]: """Return the neighbors of a lattice point in the 2D color code.""" - node_sw = (perm[0] + 1, perm[1], perm[2] - 1) - node_se = (perm[0], perm[1] + 1, perm[2] - 1) - node_e = (perm[0] - 1, perm[1] + 1, perm[2]) - node_ne = (perm[0] - 1, perm[1], perm[2] + 1) - node_nw = (perm[0], perm[1] - 1, perm[2] + 1) - node_w = (perm[0] + 1, perm[1] - 1, perm[2]) - return [node_sw, node_se, node_e, node_ne, node_nw, node_w] + node_sw = np.array((perm[0] + 1, perm[1], perm[2] - 1)) + node_se = np.array((perm[0], perm[1] + 1, perm[2] - 1)) + node_e = np.array((perm[0] - 1, perm[1] + 1, perm[2])) + node_ne = np.array((perm[0] - 1, perm[1], perm[2] + 1)) + node_nw = np.array((perm[0], perm[1] - 1, perm[2] + 1)) + node_w = np.array((perm[0] + 1, perm[1] - 1, perm[2])) + return np.asarray((node_sw, node_se, node_e, node_ne, node_nw, node_w)) -def gen_pcm_and_logical(distance: int) -> tuple[NDArray[bool], set[int]]: +def gen_pcm_and_logical(distance: int) -> Tuple[NDArray[bool], Set[int]]: """Generate the parity check matrix and logical operator for the 2D color code.""" lattice_points_to_qubit_index, ancilla_qubit_to_lattice_points = {}, {} qubit_count, ancilla_qubit_count = 0, 0 @@ -51,7 +51,8 @@ def gen_pcm_and_logical(distance: int) -> tuple[NDArray[bool], set[int]]: return (parity_check_matrix, logical_operator) -def add_checks_one_round(pcm: NDArray[int], circuit: Any, detectors: bool, error_probability: float) -> Any: # noqa: ANN401 +def add_checks_one_round(pcm: NDArray[int], circuit: Any, detectors: bool, + error_probability: float) -> Any: # noqa: ANN401 """Add one round of checks to the circuit.""" for check in pcm: if error_probability == 0: @@ -76,7 +77,7 @@ def add_checks_one_round(pcm: NDArray[int], circuit: Any, detectors: bool, error def gen_stim_circuit_memory_experiment( - pcm: NDArray[int], logical_operator: NDArray[int], distance: int, error_probability: float + pcm: NDArray[int], logical_operator: NDArray[int], distance: int, error_probability: float ) -> Any: # noqa: ANN401 """Generate a stim circuit for a memory experiment on the 2D color code.""" data_qubits = range(len(pcm[0])) From 6d9f566b8a4fadac6c728711dc56dde06ee0023e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 09:13:29 +0000 Subject: [PATCH 31/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qecc/cc_decoder/stim_interface/color_code_stim.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py index bae259fe..8cec0985 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py @@ -3,7 +3,7 @@ from __future__ import annotations import itertools as it -from typing import TYPE_CHECKING, Any, List, Tuple, Set +from typing import TYPE_CHECKING, Any import numpy as np import stim @@ -23,7 +23,7 @@ def neighbors(perm: NDArray[int]) -> NDArray[NDArray[NDArray[int]]]: return np.asarray((node_sw, node_se, node_e, node_ne, node_nw, node_w)) -def gen_pcm_and_logical(distance: int) -> Tuple[NDArray[bool], Set[int]]: +def gen_pcm_and_logical(distance: int) -> tuple[NDArray[bool], set[int]]: """Generate the parity check matrix and logical operator for the 2D color code.""" lattice_points_to_qubit_index, ancilla_qubit_to_lattice_points = {}, {} qubit_count, ancilla_qubit_count = 0, 0 @@ -51,8 +51,7 @@ def gen_pcm_and_logical(distance: int) -> Tuple[NDArray[bool], Set[int]]: return (parity_check_matrix, logical_operator) -def add_checks_one_round(pcm: NDArray[int], circuit: Any, detectors: bool, - error_probability: float) -> Any: # noqa: ANN401 +def add_checks_one_round(pcm: NDArray[int], circuit: Any, detectors: bool, error_probability: float) -> Any: # noqa: ANN401 """Add one round of checks to the circuit.""" for check in pcm: if error_probability == 0: @@ -77,7 +76,7 @@ def add_checks_one_round(pcm: NDArray[int], circuit: Any, detectors: bool, def gen_stim_circuit_memory_experiment( - pcm: NDArray[int], logical_operator: NDArray[int], distance: int, error_probability: float + pcm: NDArray[int], logical_operator: NDArray[int], distance: int, error_probability: float ) -> Any: # noqa: ANN401 """Generate a stim circuit for a memory experiment on the 2D color code.""" data_qubits = range(len(pcm[0])) From 27979c935df13a4f4a0e959d3a4ca8992bb85fef Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 16 Oct 2024 12:59:36 +0200 Subject: [PATCH 32/79] fix np array typing --- .../cc_decoder/stim_interface/dem_to_matrices.py | 2 +- .../stim_interface/max_sat_sinter_decoder.py | 4 ++-- .../stim_interface/max_sat_stim_decoder.py | 14 +++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py index c5830d45..9ed11809 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py @@ -60,7 +60,7 @@ class DemMatrices: edge_check_matrix: csc_matrix edge_observables_matrix: csc_matrix hyperedge_to_edge_matrix: csc_matrix - priors: np.NDarray[np.float64] + priors: np.NDArray[np.float64] def detector_error_model_to_check_matrices( diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 3c555fa3..9de3bcc7 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -35,8 +35,8 @@ def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: def decode_shots_bit_packed( self, *, - bit_packed_detection_event_data: np.NDarray[np.NDarray[np.uint8]], - ) -> np.NDarray[np.uint8]: + bit_packed_detection_event_data: np.NDArray[np.NDArray[np.uint8]], + ) -> np.NDArray[np.uint8]: """Decode bitpacked shots from sinter simulation using batch decoder.""" predictions, converged_cnt, not_converged_cnt = self.decoder.decode_batch( shots=bit_packed_detection_event_data, diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index 0ea18d84..0a276367 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -53,19 +53,19 @@ def weight_function(x: np.float64) -> np.float64: """Return log likelihood weighting.""" return np.log((1 - x) / x) - def decode(self, syndrome: np.NDarray[int]) -> (np.NDarray[int], bool): + def decode(self, syndrome: np.NDArray[int]) -> (np.NDArray[int], bool): """Decode the syndrome and return a prediction of which observables were flipped. Parameters ---------- - syndrome : np.NDarray + syndrome : np.NDArray A single shot of syndrome data. This should be a binary array with a length equal to the number of detectors in the `stim.Circuit` or `stim.DetectorErrorModel`. E.g. the syndrome might be one row of shot data sampled from a `stim.CompiledDetectorSampler`. Returns: ------- - np.NDarray + np.NDArray A binary numpy array `predictions` which predicts which observables were flipped. Its length is equal to the number of observables in the `stim.Circuit` or `stim.DetectorErrorModel`. `predictions[i]` is 1 if the decoder predicts observable `i` was flipped and 0 otherwise. @@ -77,22 +77,22 @@ def decode(self, syndrome: np.NDarray[int]) -> (np.NDarray[int], bool): def decode_batch( self, - shots: np.NDarray[int], + shots: np.NDArray[int], *, bit_packed_shots: bool = False, bit_packed_predictions: bool = False, - ) -> (np.NDarray[int], int, int): + ) -> (np.NDArray[int], int, int): """Decode a batch of shots of syndrome data by iterating over each shot. Parameters ---------- - shots : np.NDarray + shots : np.NDArray A binary numpy array of dtype `np.uint8` or `bool` with shape `(num_shots, num_detectors)`, where here `num_shots` is the number of shots and `num_detectors` is the number of detectors in the `stim.Circuit` or `stim.DetectorErrorModel`. Returns: ------- - np.NDarray + np.NDArray A 2D numpy array `predictions` of dtype bool, where `predictions[i, :]` is the output of `self.decode(shots[i, :])`. """ From 982333bbfb653887daa0a8843c1df1e4f185496c Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 16 Oct 2024 14:22:35 +0200 Subject: [PATCH 33/79] mypy fixes --- pyproject.toml | 5 +++-- .../stim_interface/dem_to_matrices.py | 1 + .../stim_interface/max_sat_sinter_decoder.py | 6 +++--- .../stim_interface/max_sat_stim_decoder.py | 20 +++++++++---------- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4943158e..40aa99a5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -180,9 +180,10 @@ disallow_untyped_defs = false explicit_package_bases = true warn_unreachable = true exclude = [ - "*/cc_decoder/plotting/**", + "plotting*", "code_construction*", - "^data_utils\\.py$" + "^data_utils\\.py$", + "run_color_code_phenomenological_noise*" ] [[tool.mypy.overrides]] diff --git a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py index 9ed11809..fb980853 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py @@ -7,6 +7,7 @@ from typing import TYPE_CHECKING import numpy as np +import numpy.typing from scipy.sparse import csc_matrix if TYPE_CHECKING: diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 9de3bcc7..fe7b59f0 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -14,7 +14,7 @@ if TYPE_CHECKING: import numpy as np - + from numpy.typing import NDArray class SinterCompiledDecoderMaxSat(CompiledDecoder): """MaxSAT decoder instantiation as CompiledDecoder.""" @@ -35,8 +35,8 @@ def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: def decode_shots_bit_packed( self, *, - bit_packed_detection_event_data: np.NDArray[np.NDArray[np.uint8]], - ) -> np.NDArray[np.uint8]: + bit_packed_detection_event_data: NDArray[NDArray[np.uint8]], + ) -> NDArray[np.uint8]: """Decode bitpacked shots from sinter simulation using batch decoder.""" predictions, converged_cnt, not_converged_cnt = self.decoder.decode_batch( shots=bit_packed_detection_event_data, diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index 0a276367..8b60909b 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, Tuple import numpy as np @@ -11,7 +11,7 @@ if TYPE_CHECKING: import stim - + from numpy.typing import NDArray class MaxSatStim: """MaxSat stim decoder implementation.""" @@ -33,7 +33,7 @@ def __init__(self, model: stim.DetectorErrorModel) -> None: self.problem.preconstruct_z3_instance(weights=[self.weight_function(p) for p in self._matrices.priors]) @staticmethod - def check_matrix_to_adj_lists(check_matrix: Any) -> tuple[dict, dict]: # noqa: ANN401 + def check_matrix_to_adj_lists(check_matrix: Any) -> tuple[dict[int, list[int]], dict[int, list[int]]]: # noqa: ANN401 """Converts a check matrix to two adjacency lists.""" qtf: dict[int, list[int]] = {} ftq: dict[int, list[int]] = {} @@ -53,19 +53,19 @@ def weight_function(x: np.float64) -> np.float64: """Return log likelihood weighting.""" return np.log((1 - x) / x) - def decode(self, syndrome: np.NDArray[int]) -> (np.NDArray[int], bool): + def decode(self, syndrome: NDArray[int]) -> Tuple[NDArray[int], bool]: """Decode the syndrome and return a prediction of which observables were flipped. Parameters ---------- - syndrome : np.NDArray + syndrome : NDArray A single shot of syndrome data. This should be a binary array with a length equal to the number of detectors in the `stim.Circuit` or `stim.DetectorErrorModel`. E.g. the syndrome might be one row of shot data sampled from a `stim.CompiledDetectorSampler`. Returns: ------- - np.NDArray + NDArray A binary numpy array `predictions` which predicts which observables were flipped. Its length is equal to the number of observables in the `stim.Circuit` or `stim.DetectorErrorModel`. `predictions[i]` is 1 if the decoder predicts observable `i` was flipped and 0 otherwise. @@ -77,22 +77,22 @@ def decode(self, syndrome: np.NDArray[int]) -> (np.NDArray[int], bool): def decode_batch( self, - shots: np.NDArray[int], + shots: NDArray[int], *, bit_packed_shots: bool = False, bit_packed_predictions: bool = False, - ) -> (np.NDArray[int], int, int): + ) -> (NDArray[int], int, int): """Decode a batch of shots of syndrome data by iterating over each shot. Parameters ---------- - shots : np.NDArray + shots : NDArray A binary numpy array of dtype `np.uint8` or `bool` with shape `(num_shots, num_detectors)`, where here `num_shots` is the number of shots and `num_detectors` is the number of detectors in the `stim.Circuit` or `stim.DetectorErrorModel`. Returns: ------- - np.NDArray + NDArray A 2D numpy array `predictions` of dtype bool, where `predictions[i, :]` is the output of `self.decode(shots[i, :])`. """ From 609ae17843290a8c666bdfed376bf07a82284d5c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 12:23:36 +0000 Subject: [PATCH 34/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py | 1 + .../qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index fe7b59f0..11af3c87 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -16,6 +16,7 @@ import numpy as np from numpy.typing import NDArray + class SinterCompiledDecoderMaxSat(CompiledDecoder): """MaxSAT decoder instantiation as CompiledDecoder.""" diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index 8b60909b..8d7a5f9f 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Tuple +from typing import TYPE_CHECKING, Any import numpy as np @@ -13,6 +13,7 @@ import stim from numpy.typing import NDArray + class MaxSatStim: """MaxSat stim decoder implementation.""" @@ -53,7 +54,7 @@ def weight_function(x: np.float64) -> np.float64: """Return log likelihood weighting.""" return np.log((1 - x) / x) - def decode(self, syndrome: NDArray[int]) -> Tuple[NDArray[int], bool]: + def decode(self, syndrome: NDArray[int]) -> tuple[NDArray[int], bool]: """Decode the syndrome and return a prediction of which observables were flipped. Parameters From a580b4c9d990184623b9bc67bb8019d1992d67de Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 16 Oct 2024 14:34:39 +0200 Subject: [PATCH 35/79] mypy fixes --- src/mqt/qecc/cc_decoder/decoder.py | 2 +- src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py | 3 ++- .../qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/decoder.py b/src/mqt/qecc/cc_decoder/decoder.py index 8c5232d7..8401ea09 100644 --- a/src/mqt/qecc/cc_decoder/decoder.py +++ b/src/mqt/qecc/cc_decoder/decoder.py @@ -62,7 +62,7 @@ def complete_parity_constraint(self, light: int, indices: list[int], val: bool) constraint = Xor(self.switch_vars[indices[0]], helper_vars[0]) == val self.optimizer.add(simplify(constraint)) - def preconstruct_z3_instance(self, weights: np.NDArray[float] = None) -> None: + def preconstruct_z3_instance(self, weights: npt.NDArray[float] = None) -> None: """Preconstruct the z3 instance for the lights-out problem. Creates all necessary variables, adds the known parts of the parity constraints. diff --git a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py index fb980853..e4de033d 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py @@ -12,6 +12,7 @@ if TYPE_CHECKING: import stim + from numpy.typing import NDArray def iter_set_xor(set_list: list[list[int]]) -> frozenset[int]: @@ -61,7 +62,7 @@ class DemMatrices: edge_check_matrix: csc_matrix edge_observables_matrix: csc_matrix hyperedge_to_edge_matrix: csc_matrix - priors: np.NDArray[np.float64] + priors: NDArray[np.float64] def detector_error_model_to_check_matrices( diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index 8d7a5f9f..fc0c9ff6 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, Tuple import numpy as np @@ -54,7 +54,7 @@ def weight_function(x: np.float64) -> np.float64: """Return log likelihood weighting.""" return np.log((1 - x) / x) - def decode(self, syndrome: NDArray[int]) -> tuple[NDArray[int], bool]: + def decode(self, syndrome: NDArray[int]) -> tuple[NDArray[int], int]: """Decode the syndrome and return a prediction of which observables were flipped. Parameters @@ -82,7 +82,7 @@ def decode_batch( *, bit_packed_shots: bool = False, bit_packed_predictions: bool = False, - ) -> (NDArray[int], int, int): + ) -> Tuple[NDArray[int], int, int]: """Decode a batch of shots of syndrome data by iterating over each shot. Parameters From 23806ef090ec15de334e49b968b8b85793484dd9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 12:34:58 +0000 Subject: [PATCH 36/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index fc0c9ff6..4dd30eca 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Tuple +from typing import TYPE_CHECKING, Any import numpy as np @@ -82,7 +82,7 @@ def decode_batch( *, bit_packed_shots: bool = False, bit_packed_predictions: bool = False, - ) -> Tuple[NDArray[int], int, int]: + ) -> tuple[NDArray[int], int, int]: """Decode a batch of shots of syndrome data by iterating over each shot. Parameters From 23fb1a329572daa81a0a999dd9d5049573c6d5ec Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 16 Oct 2024 14:58:38 +0200 Subject: [PATCH 37/79] try fixing import issues --- pyproject.toml | 3 ++- src/mqt/qecc/cc_decoder/stim_interface/__init__.py | 1 - src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py | 1 - .../qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py | 2 +- .../qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py | 4 ++-- 5 files changed, 5 insertions(+), 6 deletions(-) delete mode 100644 src/mqt/qecc/cc_decoder/stim_interface/__init__.py diff --git a/pyproject.toml b/pyproject.toml index 40aa99a5..e3cf58d5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,6 +56,7 @@ dependencies = [ "numba>=0.59; python_version > '3.11'", "numba>=0.57; python_version <= '3.11'", "pymatching>=2.2.1", + "stimbposd" ] dynamic = ["version"] @@ -188,7 +189,7 @@ exclude = [ [[tool.mypy.overrides]] module = ["qiskit.*", "qecsim.*", "qiskit_aer.*", "matplotlib.*", "scipy.*", "ldpc.*", "pytest_console_scripts.*", - "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*"] + "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*", "stimbposd.*"] ignore_missing_imports = true diff --git a/src/mqt/qecc/cc_decoder/stim_interface/__init__.py b/src/mqt/qecc/cc_decoder/stim_interface/__init__.py deleted file mode 100644 index 1acba125..00000000 --- a/src/mqt/qecc/cc_decoder/stim_interface/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""init py file for stim_interface module.""" diff --git a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py index e4de033d..39bd3d7a 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/dem_to_matrices.py @@ -7,7 +7,6 @@ from typing import TYPE_CHECKING import numpy as np -import numpy.typing from scipy.sparse import csc_matrix if TYPE_CHECKING: diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 11af3c87..a0eb7149 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -10,7 +10,7 @@ from sinter import CompiledDecoder, Decoder from stimbposd import SinterDecoder_BPOSD -from mqt.qecc.cc_decoder.stim_interface.max_sat_stim_decoder import MaxSatStim +from ..stim_interface.max_sat_stim_decoder import MaxSatStim if TYPE_CHECKING: import numpy as np diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index fc0c9ff6..c6d49ab6 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -6,8 +6,8 @@ import numpy as np -from mqt.qecc.cc_decoder.max_sat_decoder import LightsOut -from mqt.qecc.cc_decoder.stim_interface.dem_to_matrices import detector_error_model_to_check_matrices +from ..decoder import LightsOut +from ..stim_interface.dem_to_matrices import detector_error_model_to_check_matrices if TYPE_CHECKING: import stim From b75df905d462af85763cb5d925526df96c740cfb Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 13:03:52 +0000 Subject: [PATCH 38/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index a0eb7149..ab89283d 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -10,7 +10,7 @@ from sinter import CompiledDecoder, Decoder from stimbposd import SinterDecoder_BPOSD -from ..stim_interface.max_sat_stim_decoder import MaxSatStim +from ..stim_interface.max_sat_stim_decoder import MaxSatStim if TYPE_CHECKING: import numpy as np From 91f3457a76415e3fb21de695a517e3250c7c679c Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 16 Oct 2024 15:54:05 +0200 Subject: [PATCH 39/79] try fix mypy excludes --- pyproject.toml | 2 +- src/mqt/qecc/cc_decoder/decoder.py | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e3cf58d5..088f0d24 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -184,7 +184,7 @@ exclude = [ "plotting*", "code_construction*", "^data_utils\\.py$", - "run_color_code_phenomenological_noise*" + "^run_color_code_phenomenological_noise*" ] [[tool.mypy.overrides]] diff --git a/src/mqt/qecc/cc_decoder/decoder.py b/src/mqt/qecc/cc_decoder/decoder.py index 8401ea09..f1d3dcc5 100644 --- a/src/mqt/qecc/cc_decoder/decoder.py +++ b/src/mqt/qecc/cc_decoder/decoder.py @@ -123,15 +123,17 @@ def solve(self, lights: list[bool], solver_path: str = "z3") -> tuple[list[int], solve_time = timer() - start if str(result) != "sat": self.optimizer.pop() - return ([0 for var in self.switch_vars], False, solve_time) + res_string = [0 for var in self.switch_vars] if self.switch_vars is not None else [] + return (res_string, False, solve_time) # validate the model model = self.optimizer.model() if self.validate_model(model, lights) is False: self.optimizer.pop() - assert self.validate_model(model, lights), "Model is invalid" - return ([0 for var in self.switch_vars], False, solve_time) + res_string = [0 for var in self.switch_vars] if self.switch_vars is not None else [] + return (res_string, False, solve_time) + assert self.switch_vars is not None switches = [1 if model[var] else 0 for var in self.switch_vars] else: From bf48e84749299fa0b00960bd994a51b28f970fbe Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 16 Oct 2024 15:59:37 +0200 Subject: [PATCH 40/79] try fix mypy excludes --- pyproject.toml | 2 +- .../cc_decoder/run_color_code_phenomenological_noise.py | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 088f0d24..2a442dba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -181,7 +181,7 @@ disallow_untyped_defs = false explicit_package_bases = true warn_unreachable = true exclude = [ - "plotting*", + "plotting/*", "code_construction*", "^data_utils\\.py$", "^run_color_code_phenomenological_noise*" diff --git a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py b/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py index 13947ffa..f65852ce 100644 --- a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py +++ b/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py @@ -2,15 +2,17 @@ from __future__ import annotations +from typing import Any + import matplotlib.pyplot as plt import numpy as np import sinter -from mqt.qecc.cc_decoder.stim_interface.color_code_stim import gen_pcm_and_logical, gen_stim_circuit_memory_experiment -from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import sinter_decoders +from ..cc_decoder.stim_interface.color_code_stim import gen_pcm_and_logical, gen_stim_circuit_memory_experiment +from ..cc_decoder.stim_interface.max_sat_sinter_decoder import sinter_decoders -def generate_example_tasks() -> None: +def generate_example_tasks() -> Any: # noqa: ANN401 """Generate example stim tasks.""" for p in np.arange(0.001, 0.03, 0.001): for d in [3, 4, 5]: From 07be22875d9105dd2d7245dbafbc6be1de9d792b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 14:00:02 +0000 Subject: [PATCH 41/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qecc/cc_decoder/run_color_code_phenomenological_noise.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py b/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py index f65852ce..189a36a6 100644 --- a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py +++ b/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py @@ -12,7 +12,7 @@ from ..cc_decoder.stim_interface.max_sat_sinter_decoder import sinter_decoders -def generate_example_tasks() -> Any: # noqa: ANN401 +def generate_example_tasks() -> Any: # noqa: ANN401 """Generate example stim tasks.""" for p in np.arange(0.001, 0.03, 0.001): for d in [3, 4, 5]: From 157f437a5975a720ae5c7c7a45e93af30618deae Mon Sep 17 00:00:00 2001 From: lucas Date: Thu, 17 Oct 2024 09:23:52 +0200 Subject: [PATCH 42/79] try fix mypy excludes --- pyproject.toml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2a442dba..1532c2dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -181,10 +181,12 @@ disallow_untyped_defs = false explicit_package_bases = true warn_unreachable = true exclude = [ - "plotting/*", + "^plot_convergence_rate\\.ipynb$", + "^plot_pseudothresholds.\\ipnyb$", + "^plots\\.py$", "code_construction*", "^data_utils\\.py$", - "^run_color_code_phenomenological_noise*" + "^run_color_code_phenomenological_noise\\.py$" ] [[tool.mypy.overrides]] From 3d4c44acd3f0d7c2db043fd4a0a30e8aa67fedb5 Mon Sep 17 00:00:00 2001 From: lucas Date: Thu, 17 Oct 2024 09:43:59 +0200 Subject: [PATCH 43/79] try fix mypy excludes ctd --- pyproject.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1532c2dc..9b863a60 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -181,12 +181,12 @@ disallow_untyped_defs = false explicit_package_bases = true warn_unreachable = true exclude = [ - "^plot_convergence_rate\\.ipynb$", - "^plot_pseudothresholds.\\ipnyb$", + "^plot\\_convergence\\_rate\\.ipynb$", + "^plot\\_pseudothresholds.\\ipnyb$", "^plots\\.py$", "code_construction*", "^data_utils\\.py$", - "^run_color_code_phenomenological_noise\\.py$" + "^run\\_color\\_code\\_phenomenological\\_noise\\.py$" ] [[tool.mypy.overrides]] From 31859d68ec4e5a536400f805edc522eb51f85647 Mon Sep 17 00:00:00 2001 From: lucas Date: Thu, 17 Oct 2024 09:48:01 +0200 Subject: [PATCH 44/79] add sinter to mypy modules --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9b863a60..46fd75fa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -186,12 +186,12 @@ exclude = [ "^plots\\.py$", "code_construction*", "^data_utils\\.py$", - "^run\\_color\\_code\\_phenomenological\\_noise\\.py$" + "^run\\_color\\_code\\_phenomenological\\_noise\\.py$", ] [[tool.mypy.overrides]] module = ["qiskit.*", "qecsim.*", "qiskit_aer.*", "matplotlib.*", "scipy.*", "ldpc.*", "pytest_console_scripts.*", - "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*", "stimbposd.*"] + "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*", "stimbposd.*", "sinter.*"] ignore_missing_imports = true From 5129ec87cac4277694075ef6b35645445e996957 Mon Sep 17 00:00:00 2001 From: lucas Date: Thu, 17 Oct 2024 13:19:30 +0200 Subject: [PATCH 45/79] mypy ignores for subclassing from stim --- .../qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index ab89283d..47ff2944 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -17,7 +17,7 @@ from numpy.typing import NDArray -class SinterCompiledDecoderMaxSat(CompiledDecoder): +class SinterCompiledDecoderMaxSat(CompiledDecoder): # noqa: ANN401 """MaxSAT decoder instantiation as CompiledDecoder.""" def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: @@ -62,7 +62,7 @@ def decode_shots_bit_packed( return predictions -class SinterDecoderMaxSat(Decoder): +class SinterDecoderMaxSat(Decoder): # noqa: ANN401 """Sinter implementation of MaxSAT decoder.""" def __init__( From 2c5e167e461f871f94bc71cd60185da0bf068e6d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 17 Oct 2024 11:19:50 +0000 Subject: [PATCH 46/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 47ff2944..ab89283d 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -17,7 +17,7 @@ from numpy.typing import NDArray -class SinterCompiledDecoderMaxSat(CompiledDecoder): # noqa: ANN401 +class SinterCompiledDecoderMaxSat(CompiledDecoder): """MaxSAT decoder instantiation as CompiledDecoder.""" def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: @@ -62,7 +62,7 @@ def decode_shots_bit_packed( return predictions -class SinterDecoderMaxSat(Decoder): # noqa: ANN401 +class SinterDecoderMaxSat(Decoder): """Sinter implementation of MaxSAT decoder.""" def __init__( From 77de7f1e40c525d509e2ed6478dfe80b2611a6c7 Mon Sep 17 00:00:00 2001 From: lucas Date: Thu, 17 Oct 2024 17:12:44 +0200 Subject: [PATCH 47/79] adapt codecov ignores --- .github/codecov.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/codecov.yml b/.github/codecov.yml index 6f564b74..14e7342d 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -1,7 +1,8 @@ ignore: - "**/python" - "test/**/*" - - "src/mqt/qecc/cc_decoder/plots.py" + - "src/mqt/qecc/cc_decoder/plotting/*" + - "src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py" - "src/mqt/qecc/analog_information_decoding/utils/data_utils.py" - "src/mqt/qecc/analog_information_decoding/code_construction/*" From 5d143a3f13b2b1766fa9ead185d0c905371624d4 Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 23 Oct 2024 16:58:23 +0200 Subject: [PATCH 48/79] mypy byline ignores --- src/mqt/qecc/cc_decoder/plotting/plots.py | 10 +++++----- .../stim_interface/max_sat_sinter_decoder.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/plotting/plots.py b/src/mqt/qecc/cc_decoder/plotting/plots.py index a812e869..bf1981ab 100644 --- a/src/mqt/qecc/cc_decoder/plotting/plots.py +++ b/src/mqt/qecc/cc_decoder/plotting/plots.py @@ -205,7 +205,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: data.append(json.loads(f.read())) # prepare code to per,ler map and print - code_to_xys = {} + code_to_xys = {} # type: ignore for run in data: xys = code_to_xys.setdefault(run["n_k_d"][-1], []) xys.append((run["physical_error_rate"], run["logical_failure_rate"])) @@ -239,7 +239,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: ax[1][0].set_ylim(0, 300000) ds = [] - p_data = {} + p_data = {} # type: ignore pers = [0.051, 0.081, 0.111] # 0.001, 0.021, for d, data in sorted(code_to_xys.items()): ds.append(d) @@ -251,7 +251,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: p_data[p]["t"].append(t) for p, data in sorted(p_data.items()): - ax[1][1].plot(ds, data["t"], label="p=" + str(p)) + ax[1][1].plot(ds, data["t"], label="p=" + str(p)) # type: ignore ax[1][1].set_xlabel("Distance") ax[1][1].set_ylabel("Average time per run (µs)") # noqa: RUF001 @@ -264,8 +264,8 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: for file in results_dir.glob("*.json"): with file.open() as f: data.append(json.loads(f.read())) - metrics = {} - per_metrics = {} + metrics = {} # type: ignore + per_metrics = {} # type: ignore # save plot as vector graphic for result in data: diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index ab89283d..5ab5cdbb 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -17,7 +17,7 @@ from numpy.typing import NDArray -class SinterCompiledDecoderMaxSat(CompiledDecoder): +class SinterCompiledDecoderMaxSat(CompiledDecoder): # type: ignore """MaxSAT decoder instantiation as CompiledDecoder.""" def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: @@ -62,7 +62,7 @@ def decode_shots_bit_packed( return predictions -class SinterDecoderMaxSat(Decoder): +class SinterDecoderMaxSat(Decoder): # type: ignore """Sinter implementation of MaxSAT decoder.""" def __init__( From b029dae29feada272ec053a808915bd2aa22aca2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 23 Oct 2024 14:58:47 +0000 Subject: [PATCH 49/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mqt/qecc/cc_decoder/plotting/plots.py | 10 +++++----- .../stim_interface/max_sat_sinter_decoder.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/plotting/plots.py b/src/mqt/qecc/cc_decoder/plotting/plots.py index bf1981ab..b17d10fe 100644 --- a/src/mqt/qecc/cc_decoder/plotting/plots.py +++ b/src/mqt/qecc/cc_decoder/plotting/plots.py @@ -205,7 +205,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: data.append(json.loads(f.read())) # prepare code to per,ler map and print - code_to_xys = {} # type: ignore + code_to_xys = {} # type: ignore for run in data: xys = code_to_xys.setdefault(run["n_k_d"][-1], []) xys.append((run["physical_error_rate"], run["logical_failure_rate"])) @@ -239,7 +239,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: ax[1][0].set_ylim(0, 300000) ds = [] - p_data = {} # type: ignore + p_data = {} # type: ignore pers = [0.051, 0.081, 0.111] # 0.001, 0.021, for d, data in sorted(code_to_xys.items()): ds.append(d) @@ -251,7 +251,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: p_data[p]["t"].append(t) for p, data in sorted(p_data.items()): - ax[1][1].plot(ds, data["t"], label="p=" + str(p)) # type: ignore + ax[1][1].plot(ds, data["t"], label="p=" + str(p)) # type: ignore ax[1][1].set_xlabel("Distance") ax[1][1].set_ylabel("Average time per run (µs)") # noqa: RUF001 @@ -264,8 +264,8 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: for file in results_dir.glob("*.json"): with file.open() as f: data.append(json.loads(f.read())) - metrics = {} # type: ignore - per_metrics = {} # type: ignore + metrics = {} # type: ignore + per_metrics = {} # type: ignore # save plot as vector graphic for result in data: diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 5ab5cdbb..4fa44592 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -17,7 +17,7 @@ from numpy.typing import NDArray -class SinterCompiledDecoderMaxSat(CompiledDecoder): # type: ignore +class SinterCompiledDecoderMaxSat(CompiledDecoder): # type: ignore """MaxSAT decoder instantiation as CompiledDecoder.""" def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: @@ -62,7 +62,7 @@ def decode_shots_bit_packed( return predictions -class SinterDecoderMaxSat(Decoder): # type: ignore +class SinterDecoderMaxSat(Decoder): # type: ignore """Sinter implementation of MaxSAT decoder.""" def __init__( From 05a96b18cc2d582fb05aa07a19335c8e0edbb132 Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 23 Oct 2024 17:39:41 +0200 Subject: [PATCH 50/79] add types for ignore types :P --- src/mqt/qecc/cc_decoder/plotting/plots.py | 10 +++++----- .../stim_interface/max_sat_sinter_decoder.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/plotting/plots.py b/src/mqt/qecc/cc_decoder/plotting/plots.py index bf1981ab..d4adcce4 100644 --- a/src/mqt/qecc/cc_decoder/plotting/plots.py +++ b/src/mqt/qecc/cc_decoder/plotting/plots.py @@ -205,7 +205,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: data.append(json.loads(f.read())) # prepare code to per,ler map and print - code_to_xys = {} # type: ignore + code_to_xys = {} # type: ignore[var-annotated] for run in data: xys = code_to_xys.setdefault(run["n_k_d"][-1], []) xys.append((run["physical_error_rate"], run["logical_failure_rate"])) @@ -239,7 +239,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: ax[1][0].set_ylim(0, 300000) ds = [] - p_data = {} # type: ignore + p_data = {} # type: ignore[var-annotated] pers = [0.051, 0.081, 0.111] # 0.001, 0.021, for d, data in sorted(code_to_xys.items()): ds.append(d) @@ -251,7 +251,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: p_data[p]["t"].append(t) for p, data in sorted(p_data.items()): - ax[1][1].plot(ds, data["t"], label="p=" + str(p)) # type: ignore + ax[1][1].plot(ds, data["t"], label="p=" + str(p)) # type: ignore[call-overload] ax[1][1].set_xlabel("Distance") ax[1][1].set_ylabel("Average time per run (µs)") # noqa: RUF001 @@ -264,8 +264,8 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: for file in results_dir.glob("*.json"): with file.open() as f: data.append(json.loads(f.read())) - metrics = {} # type: ignore - per_metrics = {} # type: ignore + metrics = {} # type: ignore[var-annotated] + per_metrics = {} # type: ignore[var-annotated] # save plot as vector graphic for result in data: diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 5ab5cdbb..41a764cc 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -17,7 +17,7 @@ from numpy.typing import NDArray -class SinterCompiledDecoderMaxSat(CompiledDecoder): # type: ignore +class SinterCompiledDecoderMaxSat(CompiledDecoder): # type: ignore[misc] """MaxSAT decoder instantiation as CompiledDecoder.""" def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: @@ -62,7 +62,7 @@ def decode_shots_bit_packed( return predictions -class SinterDecoderMaxSat(Decoder): # type: ignore +class SinterDecoderMaxSat(Decoder): # type: ignore[misc] """Sinter implementation of MaxSAT decoder.""" def __init__( From d2c36a7f5f792db019a05abd6ce63a3feba9fae6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 23 Oct 2024 15:41:04 +0000 Subject: [PATCH 51/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mqt/qecc/cc_decoder/plotting/plots.py | 10 +++++----- .../stim_interface/max_sat_sinter_decoder.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/plotting/plots.py b/src/mqt/qecc/cc_decoder/plotting/plots.py index d4adcce4..c4ba8101 100644 --- a/src/mqt/qecc/cc_decoder/plotting/plots.py +++ b/src/mqt/qecc/cc_decoder/plotting/plots.py @@ -205,7 +205,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: data.append(json.loads(f.read())) # prepare code to per,ler map and print - code_to_xys = {} # type: ignore[var-annotated] + code_to_xys = {} # type: ignore[var-annotated] for run in data: xys = code_to_xys.setdefault(run["n_k_d"][-1], []) xys.append((run["physical_error_rate"], run["logical_failure_rate"])) @@ -239,7 +239,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: ax[1][0].set_ylim(0, 300000) ds = [] - p_data = {} # type: ignore[var-annotated] + p_data = {} # type: ignore[var-annotated] pers = [0.051, 0.081, 0.111] # 0.001, 0.021, for d, data in sorted(code_to_xys.items()): ds.append(d) @@ -251,7 +251,7 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: p_data[p]["t"].append(t) for p, data in sorted(p_data.items()): - ax[1][1].plot(ds, data["t"], label="p=" + str(p)) # type: ignore[call-overload] + ax[1][1].plot(ds, data["t"], label="p=" + str(p)) # type: ignore[call-overload] ax[1][1].set_xlabel("Distance") ax[1][1].set_ylabel("Average time per run (µs)") # noqa: RUF001 @@ -264,8 +264,8 @@ def generate_plots_tn(results_dir: Path, results_file: Path) -> None: for file in results_dir.glob("*.json"): with file.open() as f: data.append(json.loads(f.read())) - metrics = {} # type: ignore[var-annotated] - per_metrics = {} # type: ignore[var-annotated] + metrics = {} # type: ignore[var-annotated] + per_metrics = {} # type: ignore[var-annotated] # save plot as vector graphic for result in data: diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 41a764cc..236804d1 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -17,7 +17,7 @@ from numpy.typing import NDArray -class SinterCompiledDecoderMaxSat(CompiledDecoder): # type: ignore[misc] +class SinterCompiledDecoderMaxSat(CompiledDecoder): # type: ignore[misc] """MaxSAT decoder instantiation as CompiledDecoder.""" def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: @@ -62,7 +62,7 @@ def decode_shots_bit_packed( return predictions -class SinterDecoderMaxSat(Decoder): # type: ignore[misc] +class SinterDecoderMaxSat(Decoder): # type: ignore[misc] """Sinter implementation of MaxSAT decoder.""" def __init__( From 32bd204f517e65d7b69097d655bad221e8ed2ba3 Mon Sep 17 00:00:00 2001 From: burgholzer Date: Fri, 8 Nov 2024 12:18:18 +0100 Subject: [PATCH 52/79] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20streamline=20decoder?= =?UTF-8?q?=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: burgholzer --- src/mqt/qecc/cc_decoder/decoder.py | 53 ++++++++++++++---------------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/decoder.py b/src/mqt/qecc/cc_decoder/decoder.py index f1d3dcc5..232a9206 100644 --- a/src/mqt/qecc/cc_decoder/decoder.py +++ b/src/mqt/qecc/cc_decoder/decoder.py @@ -38,20 +38,18 @@ def preconstruct_parity_constraint(self, light: int, indices: list[int]) -> None Adds all constraint to the optimizer that are independent of the value of the light. """ helper_vars = self.helper_vars[light] + if len(indices) == 1: + # nothing to preconstruct for a single switch + return + assert self.switch_vars is not None - if len(helper_vars) > 1: - # Xor(switch1, helper1) == helper0, Xor(switch2, helper2) == helper1, ... - for i in range(1, len(indices) - 1): - constraint = Xor(self.switch_vars[indices[i]], helper_vars[i]) == helper_vars[i - 1] - self.optimizer.add(simplify(constraint)) - # switchN-1 == helperN-1 - constraint = self.switch_vars[indices[-1]] == helper_vars[-1] - self.optimizer.add(simplify(constraint)) - else: - assert len(indices) == 1 - constraint = Xor(self.switch_vars[indices[0]], False) == helper_vars[0] + for i in range(1, len(indices) - 1): + constraint = Xor(self.switch_vars[indices[i]], helper_vars[i]) == helper_vars[i - 1] self.optimizer.add(simplify(constraint)) + constraint = self.switch_vars[indices[-1]] == helper_vars[-1] + self.optimizer.add(simplify(constraint)) + def complete_parity_constraint(self, light: int, indices: list[int], val: bool) -> None: """Completes the parity constraints for a light. @@ -59,7 +57,10 @@ def complete_parity_constraint(self, light: int, indices: list[int], val: bool) """ helper_vars = self.helper_vars[light] assert self.switch_vars is not None - constraint = Xor(self.switch_vars[indices[0]], helper_vars[0]) == val + if len(indices) == 1: + constraint = self.switch_vars[indices[0]] == val + else: + constraint = Xor(self.switch_vars[indices[0]], helper_vars[0]) == val self.optimizer.add(simplify(constraint)) def preconstruct_z3_instance(self, weights: npt.NDArray[float] = None) -> None: @@ -73,18 +74,15 @@ def preconstruct_z3_instance(self, weights: npt.NDArray[float] = None) -> None: for light, switches in self.lights_to_switches.items(): if light not in self.helper_vars: - if len(switches) > 1: - self.helper_vars[light] = [Bool(f"helper_{light}_{i}") for i in range(len(switches) - 1)] - else: - self.helper_vars[light] = [Bool(f"helper_{light}_{i}") for i in range(len(switches))] + self.helper_vars[light] = [Bool(f"helper_{light}_{i}") for i in range(len(switches) - 1)] self.preconstruct_parity_constraint(light, switches) if weights is not None and len(weights) > 0: - for idx, switch in enumerate(self.switch_vars): - self.optimizer.add_soft(Not(switch), weights[idx]) + for switch, weight in zip(self.switch_vars, weights): + self.optimizer.add_soft(Not(switch), weight) else: - for _, switchh in enumerate(self.switch_vars): - self.optimizer.add_soft(Not(switchh)) + for switch in self.switch_vars: + self.optimizer.add_soft(Not(switch)) def validate_model(self, model: ModelRef, lights: list[bool]) -> bool: """Validate the model by checking if pressing the switches turns off all lights.""" @@ -102,19 +100,17 @@ def count_switches(self, model: ModelRef) -> int: assert self.switch_vars is not None return sum(1 for var in self.switch_vars if model[var]) - def solve(self, lights: list[bool], solver_path: str = "z3") -> tuple[list[int], bool, float]: + def solve(self, lights: list[bool], solver_path: str = "z3", timeout: int = 1800) -> tuple[list[int], bool, float]: """Solve the lights-out problem for a given pattern. Assumes that the z3 instance has already been pre-constructed. """ # push a new context to the optimizer self.optimizer.push() - self.optimizer.set("timeout", 1500) + self.optimizer.set("timeout", timeout) # add the problem specific constraints - start = timer() for light, val in enumerate(lights): self.complete_parity_constraint(light, self.lights_to_switches[light], val) - timer() - start switches: list[int] = [] if solver_path == "z3": # solve the problem @@ -123,16 +119,15 @@ def solve(self, lights: list[bool], solver_path: str = "z3") -> tuple[list[int], solve_time = timer() - start if str(result) != "sat": self.optimizer.pop() - res_string = [0 for var in self.switch_vars] if self.switch_vars is not None else [] - return (res_string, False, solve_time) + res_string = [0] * len(self.switch_vars) if self.switch_vars is not None else [] + return res_string, False, solve_time # validate the model model = self.optimizer.model() if self.validate_model(model, lights) is False: self.optimizer.pop() - assert self.validate_model(model, lights), "Model is invalid" - res_string = [0 for var in self.switch_vars] if self.switch_vars is not None else [] - return (res_string, False, solve_time) + res_string = [0] * len(self.switch_vars) if self.switch_vars is not None else [] + return res_string, False, solve_time assert self.switch_vars is not None switches = [1 if model[var] else 0 for var in self.switch_vars] From e8fd04f1185963a584a74d840deac68834422619 Mon Sep 17 00:00:00 2001 From: burgholzer Date: Fri, 8 Nov 2024 12:20:19 +0100 Subject: [PATCH 53/79] =?UTF-8?q?=F0=9F=9A=9A=20move=20evaluation=20and=20?= =?UTF-8?q?plotting=20outside=20of=20main=20package?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: burgholzer --- .../cc_decoder/plotting/plot_convergence_rate.ipynb | 0 .../cc_decoder/plotting/plot_pseudothresholds.ipynb | 0 {src/mqt/qecc => scripts}/cc_decoder/plotting/plots.py | 0 {src/mqt/qecc => scripts}/cc_decoder/run.sh | 0 .../cc_decoder/run_color_code_phenomenological_noise.py | 4 ++-- 5 files changed, 2 insertions(+), 2 deletions(-) rename {src/mqt/qecc => scripts}/cc_decoder/plotting/plot_convergence_rate.ipynb (100%) rename {src/mqt/qecc => scripts}/cc_decoder/plotting/plot_pseudothresholds.ipynb (100%) rename {src/mqt/qecc => scripts}/cc_decoder/plotting/plots.py (100%) rename {src/mqt/qecc => scripts}/cc_decoder/run.sh (100%) rename {src/mqt/qecc => scripts}/cc_decoder/run_color_code_phenomenological_noise.py (91%) diff --git a/src/mqt/qecc/cc_decoder/plotting/plot_convergence_rate.ipynb b/scripts/cc_decoder/plotting/plot_convergence_rate.ipynb similarity index 100% rename from src/mqt/qecc/cc_decoder/plotting/plot_convergence_rate.ipynb rename to scripts/cc_decoder/plotting/plot_convergence_rate.ipynb diff --git a/src/mqt/qecc/cc_decoder/plotting/plot_pseudothresholds.ipynb b/scripts/cc_decoder/plotting/plot_pseudothresholds.ipynb similarity index 100% rename from src/mqt/qecc/cc_decoder/plotting/plot_pseudothresholds.ipynb rename to scripts/cc_decoder/plotting/plot_pseudothresholds.ipynb diff --git a/src/mqt/qecc/cc_decoder/plotting/plots.py b/scripts/cc_decoder/plotting/plots.py similarity index 100% rename from src/mqt/qecc/cc_decoder/plotting/plots.py rename to scripts/cc_decoder/plotting/plots.py diff --git a/src/mqt/qecc/cc_decoder/run.sh b/scripts/cc_decoder/run.sh similarity index 100% rename from src/mqt/qecc/cc_decoder/run.sh rename to scripts/cc_decoder/run.sh diff --git a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py b/scripts/cc_decoder/run_color_code_phenomenological_noise.py similarity index 91% rename from src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py rename to scripts/cc_decoder/run_color_code_phenomenological_noise.py index 189a36a6..df29cafe 100644 --- a/src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py +++ b/scripts/cc_decoder/run_color_code_phenomenological_noise.py @@ -8,8 +8,8 @@ import numpy as np import sinter -from ..cc_decoder.stim_interface.color_code_stim import gen_pcm_and_logical, gen_stim_circuit_memory_experiment -from ..cc_decoder.stim_interface.max_sat_sinter_decoder import sinter_decoders +from mqt.qecc.cc_decoder.stim_interface.color_code_stim import gen_pcm_and_logical, gen_stim_circuit_memory_experiment +from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import sinter_decoders def generate_example_tasks() -> Any: # noqa: ANN401 From cd5777fe98924641e377b914503757f0a82bdd10 Mon Sep 17 00:00:00 2001 From: burgholzer Date: Fri, 8 Nov 2024 12:20:37 +0100 Subject: [PATCH 54/79] =?UTF-8?q?=F0=9F=9A=A8=20proper=20includes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: burgholzer --- .../qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py | 2 +- src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 236804d1..aba868e1 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -10,7 +10,7 @@ from sinter import CompiledDecoder, Decoder from stimbposd import SinterDecoder_BPOSD -from ..stim_interface.max_sat_stim_decoder import MaxSatStim +from .max_sat_stim_decoder import MaxSatStim if TYPE_CHECKING: import numpy as np diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index fe83a8e9..196dce4a 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -7,7 +7,7 @@ import numpy as np from ..decoder import LightsOut -from ..stim_interface.dem_to_matrices import detector_error_model_to_check_matrices +from .dem_to_matrices import detector_error_model_to_check_matrices if TYPE_CHECKING: import stim From b460e8b9197f916c3889e70820dfae422be82782 Mon Sep 17 00:00:00 2001 From: burgholzer Date: Fri, 8 Nov 2024 12:20:51 +0100 Subject: [PATCH 55/79] =?UTF-8?q?=F0=9F=94=A7=20adjust=20codecov=20config?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: burgholzer --- .github/codecov.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/codecov.yml b/.github/codecov.yml index 14e7342d..69a35a24 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -1,8 +1,6 @@ ignore: - "**/python" - "test/**/*" - - "src/mqt/qecc/cc_decoder/plotting/*" - - "src/mqt/qecc/cc_decoder/run_color_code_phenomenological_noise.py" - "src/mqt/qecc/analog_information_decoding/utils/data_utils.py" - "src/mqt/qecc/analog_information_decoding/code_construction/*" From fb2c93f5f72c91c243c066ddbd09e0fae6ee39ae Mon Sep 17 00:00:00 2001 From: burgholzer Date: Fri, 8 Nov 2024 12:21:15 +0100 Subject: [PATCH 56/79] =?UTF-8?q?=F0=9F=9A=A8=20typing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: burgholzer --- .../qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index 196dce4a..de5d58c4 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -31,7 +31,9 @@ def __init__(self, model: stim.DetectorErrorModel) -> None: qtf, ftq = self.check_matrix_to_adj_lists(self._matrices.check_matrix) self.problem = LightsOut(ftq, qtf) self.observables = self._matrices.observables_matrix - self.problem.preconstruct_z3_instance(weights=[self.weight_function(p) for p in self._matrices.priors]) + self.problem.preconstruct_z3_instance( + weights=np.array([self.weight_function(p) for p in self._matrices.priors]) + ) @staticmethod def check_matrix_to_adj_lists(check_matrix: Any) -> tuple[dict[int, list[int]], dict[int, list[int]]]: # noqa: ANN401 From d01b0d5c1f64cc2589c6435e0384048c37b08f2a Mon Sep 17 00:00:00 2001 From: burgholzer Date: Fri, 8 Nov 2024 12:22:32 +0100 Subject: [PATCH 57/79] =?UTF-8?q?=F0=9F=94=92=20update=20lockfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: burgholzer --- uv.lock | 279 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 154 insertions(+), 125 deletions(-) diff --git a/uv.lock b/uv.lock index 47a46999..cec0e893 100644 --- a/uv.lock +++ b/uv.lock @@ -453,31 +453,31 @@ wheels = [ [[package]] name = "debugpy" -version = "1.8.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6d/00/5a8b5dc8f52617c5e41845e26290ebea1ba06377cc08155b6d245c27b386/debugpy-1.8.7.zip", hash = "sha256:18b8f731ed3e2e1df8e9cdaa23fb1fc9c24e570cd0081625308ec51c82efe42e", size = 4957835 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/50/1850a5a0cab6f65a21e452166ec60bac5f8a995184d17e18bb9dc3789c72/debugpy-1.8.7-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95fe04a573b8b22896c404365e03f4eda0ce0ba135b7667a1e57bd079793b96b", size = 2090182 }, - { url = "https://files.pythonhosted.org/packages/87/51/ef4d5c55c06689b377678bdee870e3df8eb2a3d9cf0e618b4d7255413c8a/debugpy-1.8.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:628a11f4b295ffb4141d8242a9bb52b77ad4a63a2ad19217a93be0f77f2c28c9", size = 3547569 }, - { url = "https://files.pythonhosted.org/packages/eb/df/a4ea1f95022f93522b59b71ec42d6703abe3e0bee753070118816555fee9/debugpy-1.8.7-cp310-cp310-win32.whl", hash = "sha256:85ce9c1d0eebf622f86cc68618ad64bf66c4fc3197d88f74bb695a416837dd55", size = 5153144 }, - { url = "https://files.pythonhosted.org/packages/47/f7/912408b69e83659bd62fa29ebb7984efe81aed4f5e08bfe10e31a1dc3c3a/debugpy-1.8.7-cp310-cp310-win_amd64.whl", hash = "sha256:29e1571c276d643757ea126d014abda081eb5ea4c851628b33de0c2b6245b037", size = 5185605 }, - { url = "https://files.pythonhosted.org/packages/f6/0a/4a4516ef4c07891542cb25620085507cab3c6b23a42b5630c17788fff83e/debugpy-1.8.7-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:caf528ff9e7308b74a1749c183d6808ffbedbb9fb6af78b033c28974d9b8831f", size = 2204794 }, - { url = "https://files.pythonhosted.org/packages/46/6f/2bb0bba20b8b74b7c341379dd99275cf6aa7722c1948fa99728716aad1b9/debugpy-1.8.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cba1d078cf2e1e0b8402e6bda528bf8fda7ccd158c3dba6c012b7897747c41a0", size = 3122160 }, - { url = "https://files.pythonhosted.org/packages/c0/ce/833351375cef971f0caa63fa82adf3f6949ad85410813026a4a436083a71/debugpy-1.8.7-cp311-cp311-win32.whl", hash = "sha256:171899588bcd412151e593bd40d9907133a7622cd6ecdbdb75f89d1551df13c2", size = 5078675 }, - { url = "https://files.pythonhosted.org/packages/7d/e1/e9ac2d546143a4defbaa2e609e173c912fb989cdfb5385c9771770a6bf5c/debugpy-1.8.7-cp311-cp311-win_amd64.whl", hash = "sha256:6e1c4ffb0c79f66e89dfd97944f335880f0d50ad29525dc792785384923e2211", size = 5102927 }, - { url = "https://files.pythonhosted.org/packages/59/4b/9f52ca1a799601a10cd2673503658bd8c8ecc4a7a43302ee29cf062474ec/debugpy-1.8.7-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:4d27d842311353ede0ad572600c62e4bcd74f458ee01ab0dd3a1a4457e7e3706", size = 2529803 }, - { url = "https://files.pythonhosted.org/packages/80/79/8bba39190d2ea17840925d287f1c6c3a7c60b58f5090444e9ecf176c540f/debugpy-1.8.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:703c1fd62ae0356e194f3e7b7a92acd931f71fe81c4b3be2c17a7b8a4b546ec2", size = 4170911 }, - { url = "https://files.pythonhosted.org/packages/3b/19/5b3d312936db8eb281310fa27903459328ed722d845d594ba5feaeb2f0b3/debugpy-1.8.7-cp312-cp312-win32.whl", hash = "sha256:2f729228430ef191c1e4df72a75ac94e9bf77413ce5f3f900018712c9da0aaca", size = 5195476 }, - { url = "https://files.pythonhosted.org/packages/9f/49/ad20b29f8c921fd5124530d3d39b8f2077efd51b71339a2eff02bba693e9/debugpy-1.8.7-cp312-cp312-win_amd64.whl", hash = "sha256:45c30aaefb3e1975e8a0258f5bbd26cd40cde9bfe71e9e5a7ac82e79bad64e39", size = 5235031 }, - { url = "https://files.pythonhosted.org/packages/41/95/29b247518d0a6afdb5249f5d05743c9c5bfaf4bd13a85b81cb5e1dc65837/debugpy-1.8.7-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:d050a1ec7e925f514f0f6594a1e522580317da31fbda1af71d1530d6ea1f2b40", size = 2517557 }, - { url = "https://files.pythonhosted.org/packages/4d/93/026e2000a0740e2f54b198f8dc317accf3a70b6524b2b15fa8e6eca74414/debugpy-1.8.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f4349a28e3228a42958f8ddaa6333d6f8282d5edaea456070e48609c5983b7", size = 4162703 }, - { url = "https://files.pythonhosted.org/packages/c3/92/a48e653b19a171434290ecdc5935b7a292a65488139c5271d6d0eceeb0f1/debugpy-1.8.7-cp313-cp313-win32.whl", hash = "sha256:11ad72eb9ddb436afb8337891a986302e14944f0f755fd94e90d0d71e9100bba", size = 5195220 }, - { url = "https://files.pythonhosted.org/packages/4e/b3/dc3c5527edafcd1a6d0f8c4ecc6c5c9bc431f77340cf4193328e98f0ac38/debugpy-1.8.7-cp313-cp313-win_amd64.whl", hash = "sha256:2efb84d6789352d7950b03d7f866e6d180284bc02c7e12cb37b489b7083d81aa", size = 5235333 }, - { url = "https://files.pythonhosted.org/packages/f5/18/a26b37d548b2264ad602b649d7b061098436cd8c434ec24375561a9ac1ab/debugpy-1.8.7-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:90d93e4f2db442f8222dec5ec55ccfc8005821028982f1968ebf551d32b28907", size = 2091465 }, - { url = "https://files.pythonhosted.org/packages/19/f0/4868ae5da4cec7f78b4118a516587c51303d81a175526995081eff1bfafb/debugpy-1.8.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6db2a370e2700557a976eaadb16243ec9c91bd46f1b3bb15376d7aaa7632c81", size = 3544575 }, - { url = "https://files.pythonhosted.org/packages/0c/f2/b7df9733ae83c4219c0c6ac55e2d2d03799554e130db817a3e614ed53df7/debugpy-1.8.7-cp39-cp39-win32.whl", hash = "sha256:a6cf2510740e0c0b4a40330640e4b454f928c7b99b0c9dbf48b11efba08a8cda", size = 5153988 }, - { url = "https://files.pythonhosted.org/packages/36/bb/a64ff234e6c6520266eb4911c833d208183d2a56f474dfc458a9b0e4aaac/debugpy-1.8.7-cp39-cp39-win_amd64.whl", hash = "sha256:6a9d9d6d31846d8e34f52987ee0f1a904c7baa4912bf4843ab39dadf9b8f3e0d", size = 5186414 }, - { url = "https://files.pythonhosted.org/packages/51/b1/a0866521c71a6ae3d3ca320e74835163a4671b1367ba360a55a0a51e5a91/debugpy-1.8.7-py2.py3-none-any.whl", hash = "sha256:57b00de1c8d2c84a61b90880f7e5b6deaf4c312ecbde3a0e8912f2a56c4ac9ae", size = 5210683 }, +version = "1.8.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/5e/7667b95c9d7ddb25c047143a3a47685f9be2a5d3d177a85a730b22dc6e5c/debugpy-1.8.8.zip", hash = "sha256:e6355385db85cbd666be703a96ab7351bc9e6c61d694893206f8001e22aee091", size = 4928684 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/79/677d71c342d5f24baf81d262c9e0c19cac3b17b4e4587c0574eaa3964ab1/debugpy-1.8.8-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:e59b1607c51b71545cb3496876544f7186a7a27c00b436a62f285603cc68d1c6", size = 2088337 }, + { url = "https://files.pythonhosted.org/packages/11/b3/4119fa89b66bcc64a3b186ea52ee7c22bccc5d1765ee890887678b0e3e76/debugpy-1.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6531d952b565b7cb2fbd1ef5df3d333cf160b44f37547a4e7cf73666aca5d8d", size = 3567953 }, + { url = "https://files.pythonhosted.org/packages/e8/4a/01f70b44af27c13d720446ce9bf14467c90411e90e6c6ffbb7c45845d23d/debugpy-1.8.8-cp310-cp310-win32.whl", hash = "sha256:b01f4a5e5c5fb1d34f4ccba99a20ed01eabc45a4684f4948b5db17a319dfb23f", size = 5128658 }, + { url = "https://files.pythonhosted.org/packages/2b/a5/c4210f3842db0911a49b3030bfc217e0772bfd33d7aa50996bc762e8a334/debugpy-1.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:535f4fb1c024ddca5913bb0eb17880c8f24ba28aa2c225059db145ee557035e9", size = 5157545 }, + { url = "https://files.pythonhosted.org/packages/38/55/6b5596ea6d5490e17abc2896f1fbe83d31205a22629805daccd30686721c/debugpy-1.8.8-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:c399023146e40ae373753a58d1be0a98bf6397fadc737b97ad612886b53df318", size = 2187057 }, + { url = "https://files.pythonhosted.org/packages/3f/f7/c2ee07f6335c3620c1435aef2c4d3d4853f6b7fb0789aa2c52a84498ef90/debugpy-1.8.8-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09cc7b162586ea2171eea055985da2702b0723f6f907a423c9b2da5996ad67ba", size = 3139844 }, + { url = "https://files.pythonhosted.org/packages/0d/68/01d335338b68bdebab11de573f4631c7bf0404666ccbf474621123497702/debugpy-1.8.8-cp311-cp311-win32.whl", hash = "sha256:eea8821d998ebeb02f0625dd0d76839ddde8cbf8152ebbe289dd7acf2cdc6b98", size = 5049405 }, + { url = "https://files.pythonhosted.org/packages/22/1d/3f69460b4b8f01dace3882513de71a446eb37ee57fe2112be948fadebde8/debugpy-1.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:d4483836da2a533f4b1454dffc9f668096ac0433de855f0c22cdce8c9f7e10c4", size = 5075025 }, + { url = "https://files.pythonhosted.org/packages/c2/04/8e79824c4d9100049bda056aeaf8f2765d1325a4521a87f8bb373c977236/debugpy-1.8.8-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:0cc94186340be87b9ac5a707184ec8f36547fb66636d1029ff4f1cc020e53996", size = 2514549 }, + { url = "https://files.pythonhosted.org/packages/a5/6b/c336d1eba1aedc9f654aefcdfe47ec41657d149f28ca1477c5f9009681c6/debugpy-1.8.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64674e95916e53c2e9540a056e5f489e0ad4872645399d778f7c598eacb7b7f9", size = 4229617 }, + { url = "https://files.pythonhosted.org/packages/63/9c/d9276c41e9e14164b31bcba789c87a355c091d0fc2d4e4e36a4881c9aa54/debugpy-1.8.8-cp312-cp312-win32.whl", hash = "sha256:5c6e885dbf12015aed73770f29dec7023cb310d0dc2ba8bfbeb5c8e43f80edc9", size = 5167033 }, + { url = "https://files.pythonhosted.org/packages/6d/1c/fd4bc22196b2d0defaa9f644ea4d676d0cb53b6434091b5fa2d4e49c85f2/debugpy-1.8.8-cp312-cp312-win_amd64.whl", hash = "sha256:19ffbd84e757a6ca0113574d1bf5a2298b3947320a3e9d7d8dc3377f02d9f864", size = 5209968 }, + { url = "https://files.pythonhosted.org/packages/90/45/6745f342bbf41bde7eb5dbf5567b794a4a5498a7a729146cb3101b875b30/debugpy-1.8.8-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:705cd123a773d184860ed8dae99becd879dfec361098edbefb5fc0d3683eb804", size = 2499523 }, + { url = "https://files.pythonhosted.org/packages/5c/39/0374610062a384648db9b7b315d0c906facf23613bfd19527135a7c0a420/debugpy-1.8.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890fd16803f50aa9cb1a9b9b25b5ec321656dd6b78157c74283de241993d086f", size = 4218219 }, + { url = "https://files.pythonhosted.org/packages/cc/19/5b8a68eb9bbafd6bfd27ba0ed93d411f3fd50935ecdd2df242de2110a7c9/debugpy-1.8.8-cp313-cp313-win32.whl", hash = "sha256:90244598214bbe704aa47556ec591d2f9869ff9e042e301a2859c57106649add", size = 5171845 }, + { url = "https://files.pythonhosted.org/packages/cd/04/7381dab68e40ca877d5beffc25ad1a0d3d2557cf7465405435fac9e27ef5/debugpy-1.8.8-cp313-cp313-win_amd64.whl", hash = "sha256:4b93e4832fd4a759a0c465c967214ed0c8a6e8914bced63a28ddb0dd8c5f078b", size = 5206890 }, + { url = "https://files.pythonhosted.org/packages/3d/c8/7b1b654f7c21bac0e77272ee503b00f75e8acc8753efa542d4495591c741/debugpy-1.8.8-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:53709d4ec586b525724819dc6af1a7703502f7e06f34ded7157f7b1f963bb854", size = 2089581 }, + { url = "https://files.pythonhosted.org/packages/2d/87/57eb80944ce75f383946d79d9dd3ff0e0cd7c737f446be11661e3b963fbf/debugpy-1.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a9c013077a3a0000e83d97cf9cc9328d2b0bbb31f56b0e99ea3662d29d7a6a2", size = 3562815 }, + { url = "https://files.pythonhosted.org/packages/45/e1/23f65fbf5564cd8b3f126ab4a82c8a1a4728bdfd1b7fb0e2a856f794790e/debugpy-1.8.8-cp39-cp39-win32.whl", hash = "sha256:ffe94dd5e9a6739a75f0b85316dc185560db3e97afa6b215628d1b6a17561cb2", size = 5121656 }, + { url = "https://files.pythonhosted.org/packages/7c/f8/751ea54bb878fe965010d0492776671a7aab045937118b356027235e59ce/debugpy-1.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5c0e5a38c7f9b481bf31277d2f74d2109292179081f11108e668195ef926c0f9", size = 5175678 }, + { url = "https://files.pythonhosted.org/packages/03/99/ec2190d03df5dbd610418919bd1c3d8e6f61d0a97894e11ade6d3260cfb8/debugpy-1.8.8-py2.py3-none-any.whl", hash = "sha256:ec684553aba5b4066d4de510859922419febc710df7bba04fe9e7ef3de15d34f", size = 5157124 }, ] [[package]] @@ -1132,7 +1132,7 @@ wheels = [ [[package]] name = "mqt-qecc" -version = "1.8.2.dev26+g221a92e" +version = "1.8.2.dev93+gfb2c93f.d20241108" source = { editable = "." } dependencies = [ { name = "bposd" }, @@ -1145,6 +1145,7 @@ dependencies = [ { name = "qiskit", extra = ["qasm3-import"] }, { name = "qiskit-aer" }, { name = "stim" }, + { name = "stimbposd" }, { name = "z3-solver" }, ] @@ -1224,6 +1225,7 @@ requires-dist = [ { name = "sphinxcontrib-bibtex", marker = "extra == 'docs'", specifier = ">=2.4.2" }, { name = "sphinxext-opengraph", marker = "extra == 'docs'", specifier = ">=0.9" }, { name = "stim", specifier = ">=1.13.0" }, + { name = "stimbposd" }, { name = "z3-solver", specifier = ">=4.12" }, ] @@ -1434,11 +1436,11 @@ parser = [ [[package]] name = "packaging" -version = "24.1" +version = "24.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", size = 148788 } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", size = 53985 }, + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, ] [[package]] @@ -2168,99 +2170,99 @@ wheels = [ [[package]] name = "rpds-py" -version = "0.20.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/25/cb/8e919951f55d109d658f81c9b49d0cc3b48637c50792c5d2e77032b8c5da/rpds_py-0.20.1.tar.gz", hash = "sha256:e1791c4aabd117653530dccd24108fa03cc6baf21f58b950d0a73c3b3b29a350", size = 25931 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/0e/d7e7e9280988a7bc56fd326042baca27f4f55fad27dc8aa64e5e0e894e5d/rpds_py-0.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a649dfd735fff086e8a9d0503a9f0c7d01b7912a333c7ae77e1515c08c146dad", size = 327335 }, - { url = "https://files.pythonhosted.org/packages/4c/72/027185f213d53ae66765c575229829b202fbacf3d55fe2bd9ff4e29bb157/rpds_py-0.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f16bc1334853e91ddaaa1217045dd7be166170beec337576818461268a3de67f", size = 318250 }, - { url = "https://files.pythonhosted.org/packages/2b/e7/b4eb3e6ff541c83d3b46f45f855547e412ab60c45bef64520fafb00b9b42/rpds_py-0.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14511a539afee6f9ab492b543060c7491c99924314977a55c98bfa2ee29ce78c", size = 361206 }, - { url = "https://files.pythonhosted.org/packages/e7/80/cb9a4b4cad31bcaa37f38dae7a8be861f767eb2ca4f07a146b5ffcfbee09/rpds_py-0.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3ccb8ac2d3c71cda472b75af42818981bdacf48d2e21c36331b50b4f16930163", size = 369921 }, - { url = "https://files.pythonhosted.org/packages/95/1b/463b11e7039e18f9e778568dbf7338c29bbc1f8996381115201c668eb8c8/rpds_py-0.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c142b88039b92e7e0cb2552e8967077e3179b22359e945574f5e2764c3953dcf", size = 403673 }, - { url = "https://files.pythonhosted.org/packages/86/98/1ef4028e9d5b76470bf7f8f2459be07ac5c9621270a2a5e093f8d8a8cc2c/rpds_py-0.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f19169781dddae7478a32301b499b2858bc52fc45a112955e798ee307e294977", size = 430267 }, - { url = "https://files.pythonhosted.org/packages/25/8e/41d7e3e6d3a4a6c94375020477705a3fbb6515717901ab8f94821cf0a0d9/rpds_py-0.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13c56de6518e14b9bf6edde23c4c39dac5b48dcf04160ea7bce8fca8397cdf86", size = 360569 }, - { url = "https://files.pythonhosted.org/packages/4f/6a/8839340464d4e1bbfaf0482e9d9165a2309c2c17427e4dcb72ce3e5cc5d6/rpds_py-0.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:925d176a549f4832c6f69fa6026071294ab5910e82a0fe6c6228fce17b0706bd", size = 382584 }, - { url = "https://files.pythonhosted.org/packages/64/96/7a7f938d3796a6a3ec08ed0e8a5ecd436fbd516a3684ab1fa22d46d6f6cc/rpds_py-0.20.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:78f0b6877bfce7a3d1ff150391354a410c55d3cdce386f862926a4958ad5ab7e", size = 546560 }, - { url = "https://files.pythonhosted.org/packages/15/c7/19fb4f1247a3c90a99eca62909bf76ee988f9b663e47878a673d9854ec5c/rpds_py-0.20.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3dd645e2b0dcb0fd05bf58e2e54c13875847687d0b71941ad2e757e5d89d4356", size = 549359 }, - { url = "https://files.pythonhosted.org/packages/d2/4c/445eb597a39a883368ea2f341dd6e48a9d9681b12ebf32f38a827b30529b/rpds_py-0.20.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4f676e21db2f8c72ff0936f895271e7a700aa1f8d31b40e4e43442ba94973899", size = 527567 }, - { url = "https://files.pythonhosted.org/packages/4f/71/4c44643bffbcb37311fc7fe221bcf139c8d660bc78f746dd3a05741372c8/rpds_py-0.20.1-cp310-none-win32.whl", hash = "sha256:648386ddd1e19b4a6abab69139b002bc49ebf065b596119f8f37c38e9ecee8ff", size = 200412 }, - { url = "https://files.pythonhosted.org/packages/f4/33/9d0529d74099e090ec9ab15eb0a049c56cca599eaaca71bfedbdbca656a9/rpds_py-0.20.1-cp310-none-win_amd64.whl", hash = "sha256:d9ecb51120de61e4604650666d1f2b68444d46ae18fd492245a08f53ad2b7711", size = 218563 }, - { url = "https://files.pythonhosted.org/packages/a0/2e/a6ded84019a05b8f23e0fe6a632f62ae438a8c5e5932d3dfc90c73418414/rpds_py-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:762703bdd2b30983c1d9e62b4c88664df4a8a4d5ec0e9253b0231171f18f6d75", size = 327194 }, - { url = "https://files.pythonhosted.org/packages/68/11/d3f84c69de2b2086be3d6bd5e9d172825c096b13842ab7e5f8f39f06035b/rpds_py-0.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0b581f47257a9fce535c4567782a8976002d6b8afa2c39ff616edf87cbeff712", size = 318126 }, - { url = "https://files.pythonhosted.org/packages/18/c0/13f1bce9c901511e5e4c0b77a99dbb946bb9a177ca88c6b480e9cb53e304/rpds_py-0.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842c19a6ce894493563c3bd00d81d5100e8e57d70209e84d5491940fdb8b9e3a", size = 361119 }, - { url = "https://files.pythonhosted.org/packages/06/31/3bd721575671f22a37476c2d7b9e34bfa5185bdcee09f7fedde3b29f3adb/rpds_py-0.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42cbde7789f5c0bcd6816cb29808e36c01b960fb5d29f11e052215aa85497c93", size = 369532 }, - { url = "https://files.pythonhosted.org/packages/20/22/3eeb0385f33251b4fd0f728e6a3801dc8acc05e714eb7867cefe635bf4ab/rpds_py-0.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c8e9340ce5a52f95fa7d3b552b35c7e8f3874d74a03a8a69279fd5fca5dc751", size = 403703 }, - { url = "https://files.pythonhosted.org/packages/10/e1/8dde6174e7ac5b9acd3269afca2e17719bc7e5088c68f44874d2ad9e4560/rpds_py-0.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ba6f89cac95c0900d932c9efb7f0fb6ca47f6687feec41abcb1bd5e2bd45535", size = 429868 }, - { url = "https://files.pythonhosted.org/packages/19/51/a3cc1a5238acfc2582033e8934d034301f9d4931b9bf7c7ccfabc4ca0880/rpds_py-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a916087371afd9648e1962e67403c53f9c49ca47b9680adbeef79da3a7811b0", size = 360539 }, - { url = "https://files.pythonhosted.org/packages/cd/8c/3c87471a44bd4114e2b0aec90f298f6caaac4e8db6af904d5dd2279f5c61/rpds_py-0.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:200a23239781f46149e6a415f1e870c5ef1e712939fe8fa63035cd053ac2638e", size = 382467 }, - { url = "https://files.pythonhosted.org/packages/d0/9b/95073fe3e0f130e6d561e106818b6568ef1f2df3352e7f162ab912da837c/rpds_py-0.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:58b1d5dd591973d426cbb2da5e27ba0339209832b2f3315928c9790e13f159e8", size = 546669 }, - { url = "https://files.pythonhosted.org/packages/de/4c/7ab3669e02bb06fedebcfd64d361b7168ba39dfdf385e4109440f2e7927b/rpds_py-0.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6b73c67850ca7cae0f6c56f71e356d7e9fa25958d3e18a64927c2d930859b8e4", size = 549304 }, - { url = "https://files.pythonhosted.org/packages/f1/e8/ad5da336cd42adbdafe0ecd40dcecdae01fd3d703c621c7637615a008d3a/rpds_py-0.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d8761c3c891cc51e90bc9926d6d2f59b27beaf86c74622c8979380a29cc23ac3", size = 527637 }, - { url = "https://files.pythonhosted.org/packages/02/f1/1b47b9e5b941c2659c9b7e4ef41b6f07385a6500c638fa10c066e4616ecb/rpds_py-0.20.1-cp311-none-win32.whl", hash = "sha256:cd945871335a639275eee904caef90041568ce3b42f402c6959b460d25ae8732", size = 200488 }, - { url = "https://files.pythonhosted.org/packages/85/f6/c751c1adfa31610055acfa1cc667cf2c2d7011a73070679c448cf5856905/rpds_py-0.20.1-cp311-none-win_amd64.whl", hash = "sha256:7e21b7031e17c6b0e445f42ccc77f79a97e2687023c5746bfb7a9e45e0921b84", size = 218475 }, - { url = "https://files.pythonhosted.org/packages/e7/10/4e8dcc08b58a548098dbcee67a4888751a25be7a6dde0a83d4300df48bfa/rpds_py-0.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:36785be22066966a27348444b40389f8444671630063edfb1a2eb04318721e17", size = 329749 }, - { url = "https://files.pythonhosted.org/packages/d2/e4/61144f3790e12fd89e6153d77f7915ad26779735fef8ee9c099cba6dfb4a/rpds_py-0.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:142c0a5124d9bd0e2976089484af5c74f47bd3298f2ed651ef54ea728d2ea42c", size = 321032 }, - { url = "https://files.pythonhosted.org/packages/fa/e0/99205aabbf3be29ef6c58ef9b08feed51ba6532fdd47461245cb58dd9897/rpds_py-0.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbddc10776ca7ebf2a299c41a4dde8ea0d8e3547bfd731cb87af2e8f5bf8962d", size = 363931 }, - { url = "https://files.pythonhosted.org/packages/ac/bd/bce2dddb518b13a7e77eed4be234c9af0c9c6d403d01c5e6ae8eb447ab62/rpds_py-0.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15a842bb369e00295392e7ce192de9dcbf136954614124a667f9f9f17d6a216f", size = 373343 }, - { url = "https://files.pythonhosted.org/packages/43/15/112b7c553066cb91264691ba7fb119579c440a0ae889da222fa6fc0d411a/rpds_py-0.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be5ef2f1fc586a7372bfc355986226484e06d1dc4f9402539872c8bb99e34b01", size = 406304 }, - { url = "https://files.pythonhosted.org/packages/af/8d/2da52aef8ae5494a382b0c0025ba5b68f2952db0f2a4c7534580e8ca83cc/rpds_py-0.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbcf360c9e3399b056a238523146ea77eeb2a596ce263b8814c900263e46031a", size = 423022 }, - { url = "https://files.pythonhosted.org/packages/c8/1b/f23015cb293927c93bdb4b94a48bfe77ad9d57359c75db51f0ff0cf482ff/rpds_py-0.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd27a66740ffd621d20b9a2f2b5ee4129a56e27bfb9458a3bcc2e45794c96cb", size = 364937 }, - { url = "https://files.pythonhosted.org/packages/7b/8b/6da8636b2ea2e2f709e56656e663b6a71ecd9a9f9d9dc21488aade122026/rpds_py-0.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0b937b2a1988f184a3e9e577adaa8aede21ec0b38320d6009e02bd026db04fa", size = 386301 }, - { url = "https://files.pythonhosted.org/packages/20/af/2ae192797bffd0d6d558145b5a36e7245346ff3e44f6ddcb82f0eb8512d4/rpds_py-0.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6889469bfdc1eddf489729b471303739bf04555bb151fe8875931f8564309afc", size = 549452 }, - { url = "https://files.pythonhosted.org/packages/07/dd/9f6520712a5108cd7d407c9db44a3d59011b385c58e320d58ebf67757a9e/rpds_py-0.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:19b73643c802f4eaf13d97f7855d0fb527fbc92ab7013c4ad0e13a6ae0ed23bd", size = 554370 }, - { url = "https://files.pythonhosted.org/packages/5e/0e/b1bdc7ea0db0946d640ab8965146099093391bb5d265832994c47461e3c5/rpds_py-0.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3c6afcf2338e7f374e8edc765c79fbcb4061d02b15dd5f8f314a4af2bdc7feb5", size = 530940 }, - { url = "https://files.pythonhosted.org/packages/ae/d3/ffe907084299484fab60a7955f7c0e8a295c04249090218c59437010f9f4/rpds_py-0.20.1-cp312-none-win32.whl", hash = "sha256:dc73505153798c6f74854aba69cc75953888cf9866465196889c7cdd351e720c", size = 203164 }, - { url = "https://files.pythonhosted.org/packages/1f/ba/9cbb57423c4bfbd81c473913bebaed151ad4158ee2590a4e4b3e70238b48/rpds_py-0.20.1-cp312-none-win_amd64.whl", hash = "sha256:8bbe951244a838a51289ee53a6bae3a07f26d4e179b96fc7ddd3301caf0518eb", size = 220750 }, - { url = "https://files.pythonhosted.org/packages/b5/01/fee2e1d1274c92fff04aa47d805a28d62c2aa971d1f49f5baea1c6e670d9/rpds_py-0.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6ca91093a4a8da4afae7fe6a222c3b53ee4eef433ebfee4d54978a103435159e", size = 329359 }, - { url = "https://files.pythonhosted.org/packages/b0/cf/4aeffb02b7090029d7aeecbffb9a10e1c80f6f56d7e9a30e15481dc4099c/rpds_py-0.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b9c2fe36d1f758b28121bef29ed1dee9b7a2453e997528e7d1ac99b94892527c", size = 320543 }, - { url = "https://files.pythonhosted.org/packages/17/69/85cf3429e9ccda684ba63ff36b5866d5f9451e921cc99819341e19880334/rpds_py-0.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f009c69bc8c53db5dfab72ac760895dc1f2bc1b62ab7408b253c8d1ec52459fc", size = 363107 }, - { url = "https://files.pythonhosted.org/packages/ef/de/7df88dea9c3eeb832196d23b41f0f6fc5f9a2ee9b2080bbb1db8731ead9c/rpds_py-0.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6740a3e8d43a32629bb9b009017ea5b9e713b7210ba48ac8d4cb6d99d86c8ee8", size = 372027 }, - { url = "https://files.pythonhosted.org/packages/d1/b8/88675399d2038580743c570a809c43a900e7090edc6553f8ffb66b23c965/rpds_py-0.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:32b922e13d4c0080d03e7b62991ad7f5007d9cd74e239c4b16bc85ae8b70252d", size = 405031 }, - { url = "https://files.pythonhosted.org/packages/e1/aa/cca639f6d17caf00bab51bdc70fcc0bdda3063e5662665c4fdf60443c474/rpds_py-0.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe00a9057d100e69b4ae4a094203a708d65b0f345ed546fdef86498bf5390982", size = 422271 }, - { url = "https://files.pythonhosted.org/packages/c4/07/bf8a949d2ec4626c285579c9d6b356c692325f1a4126e947736b416e1fc4/rpds_py-0.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49fe9b04b6fa685bd39237d45fad89ba19e9163a1ccaa16611a812e682913496", size = 363625 }, - { url = "https://files.pythonhosted.org/packages/11/f0/06675c6a58d6ce34547879138810eb9aab0c10e5607ea6c2e4dc56b703c8/rpds_py-0.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa7ac11e294304e615b43f8c441fee5d40094275ed7311f3420d805fde9b07b4", size = 385906 }, - { url = "https://files.pythonhosted.org/packages/bf/ac/2d1f50374eb8e41030fad4e87f81751e1c39e3b5d4bee8c5618830d8a6ac/rpds_py-0.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aa97af1558a9bef4025f8f5d8c60d712e0a3b13a2fe875511defc6ee77a1ab7", size = 549021 }, - { url = "https://files.pythonhosted.org/packages/f7/d4/a7d70a7cc71df772eeadf4bce05e32e780a9fe44a511a5b091c7a85cb767/rpds_py-0.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:483b29f6f7ffa6af845107d4efe2e3fa8fb2693de8657bc1849f674296ff6a5a", size = 553800 }, - { url = "https://files.pythonhosted.org/packages/87/81/dc30bc449ccba63ad23a0f6633486d4e0e6955f45f3715a130dacabd6ad0/rpds_py-0.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37fe0f12aebb6a0e3e17bb4cd356b1286d2d18d2e93b2d39fe647138458b4bcb", size = 531076 }, - { url = "https://files.pythonhosted.org/packages/50/80/fb62ab48f3b5cfe704ead6ad372da1922ddaa76397055e02eb507054c979/rpds_py-0.20.1-cp313-none-win32.whl", hash = "sha256:a624cc00ef2158e04188df5e3016385b9353638139a06fb77057b3498f794782", size = 202804 }, - { url = "https://files.pythonhosted.org/packages/d9/30/a3391e76d0b3313f33bdedd394a519decae3a953d2943e3dabf80ae32447/rpds_py-0.20.1-cp313-none-win_amd64.whl", hash = "sha256:b71b8666eeea69d6363248822078c075bac6ed135faa9216aa85f295ff009b1e", size = 220502 }, - { url = "https://files.pythonhosted.org/packages/d6/87/e7e0fcbfdc0d0e261534bcc885f6ae6253095b972e32f8b8b1278c78a2a9/rpds_py-0.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b41b6321805c472f66990c2849e152aff7bc359eb92f781e3f606609eac877ad", size = 327867 }, - { url = "https://files.pythonhosted.org/packages/93/a0/17836b7961fc82586e9b818abdee2a27e2e605a602bb8c0d43f02092f8c2/rpds_py-0.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a90c373ea2975519b58dece25853dbcb9779b05cc46b4819cb1917e3b3215b6", size = 318893 }, - { url = "https://files.pythonhosted.org/packages/dc/03/deb81d8ea3a8b974e7b03cfe8c8c26616ef8f4980dd430d8dd0a2f1b4d8e/rpds_py-0.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16d4477bcb9fbbd7b5b0e4a5d9b493e42026c0bf1f06f723a9353f5153e75d30", size = 361664 }, - { url = "https://files.pythonhosted.org/packages/16/49/d9938603731745c7b6babff97ca61ff3eb4619e7128b5ab0111ad4e91d6d/rpds_py-0.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84b8382a90539910b53a6307f7c35697bc7e6ffb25d9c1d4e998a13e842a5e83", size = 369796 }, - { url = "https://files.pythonhosted.org/packages/87/d2/480b36c69cdc373853401b6aab6a281cf60f6d72b1545d82c0d23d9dd77c/rpds_py-0.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4888e117dd41b9d34194d9e31631af70d3d526efc363085e3089ab1a62c32ed1", size = 403860 }, - { url = "https://files.pythonhosted.org/packages/31/7c/f6d909cb57761293308dbef14f1663d84376f2e231892a10aafc57b42037/rpds_py-0.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5265505b3d61a0f56618c9b941dc54dc334dc6e660f1592d112cd103d914a6db", size = 430793 }, - { url = "https://files.pythonhosted.org/packages/d4/62/c9bd294c4b5f84d9cc2c387b548ae53096ad7e71ac5b02b6310e9dc85aa4/rpds_py-0.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e75ba609dba23f2c95b776efb9dd3f0b78a76a151e96f96cc5b6b1b0004de66f", size = 360927 }, - { url = "https://files.pythonhosted.org/packages/c1/a7/15d927d83a44da8307a432b1cac06284b6657706d099a98cc99fec34ad51/rpds_py-0.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1791ff70bc975b098fe6ecf04356a10e9e2bd7dc21fa7351c1742fdeb9b4966f", size = 382660 }, - { url = "https://files.pythonhosted.org/packages/4c/28/0630719c18456238bb07d59c4302fed50a13aa8035ec23dbfa80d116f9bc/rpds_py-0.20.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d126b52e4a473d40232ec2052a8b232270ed1f8c9571aaf33f73a14cc298c24f", size = 546888 }, - { url = "https://files.pythonhosted.org/packages/b9/75/3c9bda11b9c15d680b315f898af23825159314d4b56568f24b53ace8afcd/rpds_py-0.20.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c14937af98c4cc362a1d4374806204dd51b1e12dded1ae30645c298e5a5c4cb1", size = 550088 }, - { url = "https://files.pythonhosted.org/packages/70/f1/8fe7d04c194218171220a412057429defa9e2da785de0777c4d39309337e/rpds_py-0.20.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3d089d0b88996df627693639d123c8158cff41c0651f646cd8fd292c7da90eaf", size = 528270 }, - { url = "https://files.pythonhosted.org/packages/d6/62/41b0020f4b00af042b008e679dbe25a2f5bce655139a81f8b812f9068e52/rpds_py-0.20.1-cp39-none-win32.whl", hash = "sha256:653647b8838cf83b2e7e6a0364f49af96deec64d2a6578324db58380cff82aca", size = 200658 }, - { url = "https://files.pythonhosted.org/packages/05/01/e64bb8889f2dcc951e53de33d8b8070456397ae4e10edc35e6cb9908f5c8/rpds_py-0.20.1-cp39-none-win_amd64.whl", hash = "sha256:fa41a64ac5b08b292906e248549ab48b69c5428f3987b09689ab2441f267d04d", size = 218883 }, - { url = "https://files.pythonhosted.org/packages/b6/fa/7959429e69569d0f6e7d27f80451402da0409349dd2b07f6bcbdd5fad2d3/rpds_py-0.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a07ced2b22f0cf0b55a6a510078174c31b6d8544f3bc00c2bcee52b3d613f74", size = 328209 }, - { url = "https://files.pythonhosted.org/packages/25/97/5dfdb091c30267ff404d2fd9e70c7a6d6ffc65ca77fffe9456e13b719066/rpds_py-0.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:68cb0a499f2c4a088fd2f521453e22ed3527154136a855c62e148b7883b99f9a", size = 319499 }, - { url = "https://files.pythonhosted.org/packages/7c/98/cf2608722400f5f9bb4c82aa5ac09026f3ac2ebea9d4059d3533589ed0b6/rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa3060d885657abc549b2a0f8e1b79699290e5d83845141717c6c90c2df38311", size = 361795 }, - { url = "https://files.pythonhosted.org/packages/89/de/0e13dd43c785c60e63933e96fbddda0b019df6862f4d3019bb49c3861131/rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95f3b65d2392e1c5cec27cff08fdc0080270d5a1a4b2ea1d51d5f4a2620ff08d", size = 370604 }, - { url = "https://files.pythonhosted.org/packages/8a/fc/fe3c83c77f82b8059eeec4e998064913d66212b69b3653df48f58ad33d3d/rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2cc3712a4b0b76a1d45a9302dd2f53ff339614b1c29603a911318f2357b04dd2", size = 404177 }, - { url = "https://files.pythonhosted.org/packages/94/30/5189518bfb80a41f664daf32b46645c7fbdcc89028a0f1bfa82e806e0fbb/rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d4eea0761e37485c9b81400437adb11c40e13ef513375bbd6973e34100aeb06", size = 430108 }, - { url = "https://files.pythonhosted.org/packages/67/0e/6f069feaff5c298375cd8c55e00ecd9bd79c792ce0893d39448dc0097857/rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f5179583d7a6cdb981151dd349786cbc318bab54963a192692d945dd3f6435d", size = 361184 }, - { url = "https://files.pythonhosted.org/packages/27/9f/ce3e2ae36f392c3ef1988c06e9e0b4c74f64267dad7c223003c34da11adb/rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fbb0ffc754490aff6dabbf28064be47f0f9ca0b9755976f945214965b3ace7e", size = 384140 }, - { url = "https://files.pythonhosted.org/packages/5f/d5/89d44504d0bc7a1135062cb520a17903ff002f458371b8d9160af3b71e52/rpds_py-0.20.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a94e52537a0e0a85429eda9e49f272ada715506d3b2431f64b8a3e34eb5f3e75", size = 546589 }, - { url = "https://files.pythonhosted.org/packages/8f/8f/e1c2db4fcca3947d9a28ec9553700b4dc8038f0eff575f579e75885b0661/rpds_py-0.20.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:92b68b79c0da2a980b1c4197e56ac3dd0c8a149b4603747c4378914a68706979", size = 550059 }, - { url = "https://files.pythonhosted.org/packages/67/29/00a9e986df36721b5def82fff60995c1ee8827a7d909a6ec8929fb4cc668/rpds_py-0.20.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:93da1d3db08a827eda74356f9f58884adb254e59b6664f64cc04cdff2cc19b0d", size = 529131 }, - { url = "https://files.pythonhosted.org/packages/a3/32/95364440560ec476b19c6a2704259e710c223bf767632ebaa72cc2a1760f/rpds_py-0.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:754bbed1a4ca48479e9d4182a561d001bbf81543876cdded6f695ec3d465846b", size = 219677 }, - { url = "https://files.pythonhosted.org/packages/ed/bf/ad8492e972c90a3d48a38e2b5095c51a8399d5b57e83f2d5d1649490f72b/rpds_py-0.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ca449520e7484534a2a44faf629362cae62b660601432d04c482283c47eaebab", size = 328046 }, - { url = "https://files.pythonhosted.org/packages/75/fd/84f42386165d6d555acb76c6d39c90b10c9dcf25116daf4f48a0a9d6867a/rpds_py-0.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9c4cb04a16b0f199a8c9bf807269b2f63b7b5b11425e4a6bd44bd6961d28282c", size = 319306 }, - { url = "https://files.pythonhosted.org/packages/6c/8a/abcd5119a0573f9588ad71a3fde3c07ddd1d1393cfee15a6ba7495c256f1/rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63804105143c7e24cee7db89e37cb3f3941f8e80c4379a0b355c52a52b6780", size = 362558 }, - { url = "https://files.pythonhosted.org/packages/9d/65/1c2bb10afd4bd32800227a658ae9097bc1d08a4e5048a57a9bd2efdf6306/rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:55cd1fa4ecfa6d9f14fbd97ac24803e6f73e897c738f771a9fe038f2f11ff07c", size = 370811 }, - { url = "https://files.pythonhosted.org/packages/6c/ee/f4bab2b9e51ced30351cfd210647885391463ae682028c79760e7db28e4e/rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f8f741b6292c86059ed175d80eefa80997125b7c478fb8769fd9ac8943a16c0", size = 404660 }, - { url = "https://files.pythonhosted.org/packages/48/0f/9d04d0939682f0c97be827fc51ff986555ffb573e6781bd5132441f0ce25/rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fc212779bf8411667234b3cdd34d53de6c2b8b8b958e1e12cb473a5f367c338", size = 430490 }, - { url = "https://files.pythonhosted.org/packages/0d/f2/e9b90fd8416d59941b6a12f2c2e1d898b63fd092f5a7a6f98236cb865764/rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ad56edabcdb428c2e33bbf24f255fe2b43253b7d13a2cdbf05de955217313e6", size = 361448 }, - { url = "https://files.pythonhosted.org/packages/0b/83/1cc776dce7bedb17d6f4ea62eafccee8a57a4678f4fac414ab69fb9b6b0b/rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a3a1e9ee9728b2c1734f65d6a1d376c6f2f6fdcc13bb007a08cc4b1ff576dc5", size = 383681 }, - { url = "https://files.pythonhosted.org/packages/17/5c/e0cdd6b0a8373fdef3667af2778dd9ff3abf1bbb9c7bd92c603c91440eb0/rpds_py-0.20.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e13de156137b7095442b288e72f33503a469aa1980ed856b43c353ac86390519", size = 546203 }, - { url = "https://files.pythonhosted.org/packages/1b/a8/81fc9cbc01e7ef6d10652aedc1de4e8473934773e2808ba49094e03575df/rpds_py-0.20.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:07f59760ef99f31422c49038964b31c4dfcfeb5d2384ebfc71058a7c9adae2d2", size = 549855 }, - { url = "https://files.pythonhosted.org/packages/b3/87/99648693d3c1bbce088119bc61ecaab62e5f9c713894edc604ffeca5ae88/rpds_py-0.20.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:59240685e7da61fb78f65a9f07f8108e36a83317c53f7b276b4175dc44151684", size = 528625 }, - { url = "https://files.pythonhosted.org/packages/05/c3/10c68a08849f1fa45d205e54141fa75d316013e3d701ef01770ee1220bb8/rpds_py-0.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:83cba698cfb3c2c5a7c3c6bac12fe6c6a51aae69513726be6411076185a8b24a", size = 219991 }, +version = "0.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/80/afdf96daf9b27d61483ef05b38f282121db0e38f5fd4e89f40f5c86c2a4f/rpds_py-0.21.0.tar.gz", hash = "sha256:ed6378c9d66d0de903763e7706383d60c33829581f0adff47b6535f1802fa6db", size = 26335 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/a4/91747f902f166c589f1753cbd8bda713aceb75817c8bb597058a38aa85e6/rpds_py-0.21.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a017f813f24b9df929674d0332a374d40d7f0162b326562daae8066b502d0590", size = 327473 }, + { url = "https://files.pythonhosted.org/packages/8a/72/75a30a07f96ae210e732c50c7339e742945fdc83661e65a1c80fcf39ceea/rpds_py-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:20cc1ed0bcc86d8e1a7e968cce15be45178fd16e2ff656a243145e0b439bd250", size = 318359 }, + { url = "https://files.pythonhosted.org/packages/dc/63/87d469d7628cd71366fd1baa32573acd37385843b8d39b6e2b69f16eec48/rpds_py-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad116dda078d0bc4886cb7840e19811562acdc7a8e296ea6ec37e70326c1b41c", size = 361377 }, + { url = "https://files.pythonhosted.org/packages/dd/b1/78da258a4cafa1d8606a21b7d9ed4cc9d72d1c663583060ab02444b9bd9c/rpds_py-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:808f1ac7cf3b44f81c9475475ceb221f982ef548e44e024ad5f9e7060649540e", size = 369494 }, + { url = "https://files.pythonhosted.org/packages/44/47/6fdb7273cc80066d434e83cd49a3cfedb6d96ff70908480870877fb64b1e/rpds_py-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de552f4a1916e520f2703ec474d2b4d3f86d41f353e7680b597512ffe7eac5d0", size = 403639 }, + { url = "https://files.pythonhosted.org/packages/5f/4a/8c6c46afc050b5243be579be7f7b194d00b9731e83cc0845e9c70db127bb/rpds_py-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:efec946f331349dfc4ae9d0e034c263ddde19414fe5128580f512619abed05f1", size = 430551 }, + { url = "https://files.pythonhosted.org/packages/d4/31/2dd40abc26fc0fc037b86006583276dc375d38ac821d4ca2394274e8045b/rpds_py-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b80b4690bbff51a034bfde9c9f6bf9357f0a8c61f548942b80f7b66356508bf5", size = 360795 }, + { url = "https://files.pythonhosted.org/packages/9d/2a/665b9ebef76f54764f1437ac03373a95a69480b7ce56c480360f88730cae/rpds_py-0.21.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:085ed25baac88953d4283e5b5bd094b155075bb40d07c29c4f073e10623f9f2e", size = 382663 }, + { url = "https://files.pythonhosted.org/packages/e8/8c/e056f0c887d29baa256f8c8d7f7079a72d80395c35c14219de45ab19dce2/rpds_py-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:daa8efac2a1273eed2354397a51216ae1e198ecbce9036fba4e7610b308b6153", size = 546477 }, + { url = "https://files.pythonhosted.org/packages/33/11/588568f6c2ed5c9d6d121c188c71ca0f76e0e369a6d66f835737189e5a75/rpds_py-0.21.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:95a5bad1ac8a5c77b4e658671642e4af3707f095d2b78a1fdd08af0dfb647624", size = 549477 }, + { url = "https://files.pythonhosted.org/packages/15/86/c1401e2f70fbdf963c2ac9157994ebeb00c101ddf87975a90507f27cb2f4/rpds_py-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3e53861b29a13d5b70116ea4230b5f0f3547b2c222c5daa090eb7c9c82d7f664", size = 527966 }, + { url = "https://files.pythonhosted.org/packages/66/f2/452420f1493112825e975c87b3b4fd8b334e0e228cdb641597a92e0c3267/rpds_py-0.21.0-cp310-none-win32.whl", hash = "sha256:ea3a6ac4d74820c98fcc9da4a57847ad2cc36475a8bd9683f32ab6d47a2bd682", size = 200978 }, + { url = "https://files.pythonhosted.org/packages/35/4c/674b2e2d75607acdbc7a162ace36dcaad225c9e760cef5defa5c0f5ddd2d/rpds_py-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:b8f107395f2f1d151181880b69a2869c69e87ec079c49c0016ab96860b6acbe5", size = 218549 }, + { url = "https://files.pythonhosted.org/packages/80/61/615929ea79f5fd0b3aca000411a33bcc1753607ccc1af0ce7b05b56e6e56/rpds_py-0.21.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5555db3e618a77034954b9dc547eae94166391a98eb867905ec8fcbce1308d95", size = 327267 }, + { url = "https://files.pythonhosted.org/packages/a5/f5/28e89dda55b731d78cbfea284dc9789d265a8a06523f0adf60e9b05cade7/rpds_py-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:97ef67d9bbc3e15584c2f3c74bcf064af36336c10d2e21a2131e123ce0f924c9", size = 318227 }, + { url = "https://files.pythonhosted.org/packages/e4/ef/eb90feb3e384543c48e2f867551075c43a429aa4c9a44e9c4bd71f4f786b/rpds_py-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ab2c2a26d2f69cdf833174f4d9d86118edc781ad9a8fa13970b527bf8236027", size = 361235 }, + { url = "https://files.pythonhosted.org/packages/ed/e7/8ea2d3d3398266c5c8ddd957d86003493b6d14f8f158b726dd09c8f43dee/rpds_py-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4e8921a259f54bfbc755c5bbd60c82bb2339ae0324163f32868f63f0ebb873d9", size = 369467 }, + { url = "https://files.pythonhosted.org/packages/51/25/a286abda9da7820c971a0b1abcf1d31fb81c44a1088a128ad26c77206622/rpds_py-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a7ff941004d74d55a47f916afc38494bd1cfd4b53c482b77c03147c91ac0ac3", size = 403482 }, + { url = "https://files.pythonhosted.org/packages/7a/1e/9c3c0463fe142456dcd9e9be0ffd15b66a77adfcdf3ecf94fa2b12d95fcb/rpds_py-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5145282a7cd2ac16ea0dc46b82167754d5e103a05614b724457cffe614f25bd8", size = 429943 }, + { url = "https://files.pythonhosted.org/packages/e1/fd/f1fd7e77fef8e5a442ce7fd80ba957730877515fe18d7195f646408a60ce/rpds_py-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de609a6f1b682f70bb7163da745ee815d8f230d97276db049ab447767466a09d", size = 360437 }, + { url = "https://files.pythonhosted.org/packages/55/83/347932db075847f4f8172c3b53ad70fe725edd9058f0d4098080ad45e3bc/rpds_py-0.21.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40c91c6e34cf016fa8e6b59d75e3dbe354830777fcfd74c58b279dceb7975b75", size = 382400 }, + { url = "https://files.pythonhosted.org/packages/22/9b/2a6eeab4e6752adba751cfee19bdf35d11e1073509f74883cbf14d42d682/rpds_py-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d2132377f9deef0c4db89e65e8bb28644ff75a18df5293e132a8d67748397b9f", size = 546560 }, + { url = "https://files.pythonhosted.org/packages/3c/19/6e51a141fe6f017d07b7d899b10a4af9e0f268deffacc1107d70fcd9257b/rpds_py-0.21.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0a9e0759e7be10109645a9fddaaad0619d58c9bf30a3f248a2ea57a7c417173a", size = 549334 }, + { url = "https://files.pythonhosted.org/packages/cf/40/4ae09a07e4531278e6bee41ef3e4f166c23468135afc2c6c98917bfc28e6/rpds_py-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e20da3957bdf7824afdd4b6eeb29510e83e026473e04952dca565170cd1ecc8", size = 527855 }, + { url = "https://files.pythonhosted.org/packages/eb/45/2135be31543677687a426117c56d8b33e8b581bc4a8b7abfa53721012162/rpds_py-0.21.0-cp311-none-win32.whl", hash = "sha256:f71009b0d5e94c0e86533c0b27ed7cacc1239cb51c178fd239c3cfefefb0400a", size = 200968 }, + { url = "https://files.pythonhosted.org/packages/68/fa/e66c3aaf13ef91c203ba47c102cd7c5dca92dde8837e5093577968d6d36d/rpds_py-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:e168afe6bf6ab7ab46c8c375606298784ecbe3ba31c0980b7dcbb9631dcba97e", size = 218502 }, + { url = "https://files.pythonhosted.org/packages/d9/5a/3aa6f5d8bacbe4f55ebf9a3c9628dad40cdb57f845124cf13c78895ea156/rpds_py-0.21.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:30b912c965b2aa76ba5168fd610087bad7fcde47f0a8367ee8f1876086ee6d1d", size = 329516 }, + { url = "https://files.pythonhosted.org/packages/df/c0/67c8c8ac850c6e3681e356a59d46315bf73bc77cb50c9a32db8ae44325b7/rpds_py-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca9989d5d9b1b300bc18e1801c67b9f6d2c66b8fd9621b36072ed1df2c977f72", size = 321245 }, + { url = "https://files.pythonhosted.org/packages/64/83/bf31341f21fa594035891ff04a497dc86b210cc1a903a9cc01b097cc614f/rpds_py-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f54e7106f0001244a5f4cf810ba8d3f9c542e2730821b16e969d6887b664266", size = 363951 }, + { url = "https://files.pythonhosted.org/packages/a2/e1/8218bba36737621262df316fbb729639af25ff611cc07bfeaadc1bfa6292/rpds_py-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fed5dfefdf384d6fe975cc026886aece4f292feaf69d0eeb716cfd3c5a4dd8be", size = 373113 }, + { url = "https://files.pythonhosted.org/packages/39/8d/4afcd688e3ad33ec273900f42e6a41e9bd9f43cfc509b6d498683d2d0338/rpds_py-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:590ef88db231c9c1eece44dcfefd7515d8bf0d986d64d0caf06a81998a9e8cab", size = 405944 }, + { url = "https://files.pythonhosted.org/packages/fa/65/3326efa721b6ecd70262aab69a26c9bc19398cdb0a2a416ef30b58326460/rpds_py-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f983e4c2f603c95dde63df633eec42955508eefd8d0f0e6d236d31a044c882d7", size = 422874 }, + { url = "https://files.pythonhosted.org/packages/31/fb/48a647d0afab74289dd21a4128002d58684c22600a22c4bfb76cb9e3bfb0/rpds_py-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b229ce052ddf1a01c67d68166c19cb004fb3612424921b81c46e7ea7ccf7c3bf", size = 364227 }, + { url = "https://files.pythonhosted.org/packages/f1/b0/1cdd179d7382dd52d65b1fd19c54d090b6bd0688dfbe259bb5ab7548c359/rpds_py-0.21.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ebf64e281a06c904a7636781d2e973d1f0926a5b8b480ac658dc0f556e7779f4", size = 386447 }, + { url = "https://files.pythonhosted.org/packages/dc/41/84ace07f31aac3a96b73a374d89106cf252f7d3274e7cae85d17a27c602d/rpds_py-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:998a8080c4495e4f72132f3d66ff91f5997d799e86cec6ee05342f8f3cda7dca", size = 549386 }, + { url = "https://files.pythonhosted.org/packages/33/ce/bf51bc5a3aa539171ea8c7737ab5ac06cef54c79b6b2a0511afc41533c89/rpds_py-0.21.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:98486337f7b4f3c324ab402e83453e25bb844f44418c066623db88e4c56b7c7b", size = 554777 }, + { url = "https://files.pythonhosted.org/packages/76/b1/950568e55a94c2979c2b61ec24e76e648a525fbc7551ccfc1f2841e39d44/rpds_py-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a78d8b634c9df7f8d175451cfeac3810a702ccb85f98ec95797fa98b942cea11", size = 530918 }, + { url = "https://files.pythonhosted.org/packages/78/84/93f00e3613426c8a7a9ca16782d2828f2ac55296dd5c6b599379d9f59ee2/rpds_py-0.21.0-cp312-none-win32.whl", hash = "sha256:a58ce66847711c4aa2ecfcfaff04cb0327f907fead8945ffc47d9407f41ff952", size = 203112 }, + { url = "https://files.pythonhosted.org/packages/e6/08/7a186847dd78881a781d2be9b42c8e49c3261c0f4a6d0289ba9a1e4cde71/rpds_py-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:e860f065cc4ea6f256d6f411aba4b1251255366e48e972f8a347cf88077b24fd", size = 220735 }, + { url = "https://files.pythonhosted.org/packages/32/3a/e69ec108eefb9b1f19ee00dde7a800b485942e62b123f01d9156a6d8569c/rpds_py-0.21.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ee4eafd77cc98d355a0d02f263efc0d3ae3ce4a7c24740010a8b4012bbb24937", size = 329206 }, + { url = "https://files.pythonhosted.org/packages/f6/c0/fa689498fa3415565306398c8d2a596207c2a13d3cc03724f32514bddfbc/rpds_py-0.21.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:688c93b77e468d72579351a84b95f976bd7b3e84aa6686be6497045ba84be560", size = 320245 }, + { url = "https://files.pythonhosted.org/packages/68/d0/466b61007005f1b2fd8501f23e4bdee4d71c7381b61358750920d1882ac9/rpds_py-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c38dbf31c57032667dd5a2f0568ccde66e868e8f78d5a0d27dcc56d70f3fcd3b", size = 363585 }, + { url = "https://files.pythonhosted.org/packages/1e/e2/787ea3a0f4b197893c62c254e6f14929c40bbcff86922928ac4eafaa8edf/rpds_py-0.21.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2d6129137f43f7fa02d41542ffff4871d4aefa724a5fe38e2c31a4e0fd343fb0", size = 372302 }, + { url = "https://files.pythonhosted.org/packages/b5/ef/99f2cfe6aa128c21f1b30c66ecd348cbd59792953ca35eeb6efa38b88aa1/rpds_py-0.21.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520ed8b99b0bf86a176271f6fe23024323862ac674b1ce5b02a72bfeff3fff44", size = 405344 }, + { url = "https://files.pythonhosted.org/packages/30/3c/9d12d0b76ecfe80a7ba4770459828dda495d72b18cafd6dfd54c67b2e282/rpds_py-0.21.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaeb25ccfb9b9014a10eaf70904ebf3f79faaa8e60e99e19eef9f478651b9b74", size = 422322 }, + { url = "https://files.pythonhosted.org/packages/f9/22/387aec1cd6e124adbc3b1f40c4e4152c3963ae47d78d3ca650102ea72c4f/rpds_py-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af04ac89c738e0f0f1b913918024c3eab6e3ace989518ea838807177d38a2e94", size = 363739 }, + { url = "https://files.pythonhosted.org/packages/d1/3e/0ad65b776db13d13f002ab363fe3821cd1adec500d8e05e0a81047a75f9d/rpds_py-0.21.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9b76e2afd585803c53c5b29e992ecd183f68285b62fe2668383a18e74abe7a3", size = 386579 }, + { url = "https://files.pythonhosted.org/packages/4f/3b/c68c1067b24a7df47edcc0325a825908601aba399e2d372a156edc631ad1/rpds_py-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5afb5efde74c54724e1a01118c6e5c15e54e642c42a1ba588ab1f03544ac8c7a", size = 548924 }, + { url = "https://files.pythonhosted.org/packages/ab/1c/35f1a5cce4bca71c49664f00140010a96b126e5f443ebaf6db741c25b9b7/rpds_py-0.21.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:52c041802a6efa625ea18027a0723676a778869481d16803481ef6cc02ea8cb3", size = 554217 }, + { url = "https://files.pythonhosted.org/packages/c8/d0/48154c152f9adb8304b21d867d28e79be3b352633fb195c03c7107a4da9a/rpds_py-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee1e4fc267b437bb89990b2f2abf6c25765b89b72dd4a11e21934df449e0c976", size = 530540 }, + { url = "https://files.pythonhosted.org/packages/50/e8/78847f4e112e99fd5b7bc30fea3e4a44c20b811473d6755f944c5bf0aec7/rpds_py-0.21.0-cp313-none-win32.whl", hash = "sha256:0c025820b78817db6a76413fff6866790786c38f95ea3f3d3c93dbb73b632202", size = 202604 }, + { url = "https://files.pythonhosted.org/packages/60/31/083e6337775e133fb0217ed0ab0752380efa6e5112f2250d592d4135a228/rpds_py-0.21.0-cp313-none-win_amd64.whl", hash = "sha256:320c808df533695326610a1b6a0a6e98f033e49de55d7dc36a13c8a30cfa756e", size = 220448 }, + { url = "https://files.pythonhosted.org/packages/6c/e0/ab30b78170a198fe12c47c2f04c12374d3a424d506c6fe813c62434c6a5a/rpds_py-0.21.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:2c51d99c30091f72a3c5d126fad26236c3f75716b8b5e5cf8effb18889ced928", size = 327774 }, + { url = "https://files.pythonhosted.org/packages/e8/7c/8cbd90d5726894dab069bbba7813864d163cdbbfcd5bf60a12504d061788/rpds_py-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cbd7504a10b0955ea287114f003b7ad62330c9e65ba012c6223dba646f6ffd05", size = 318715 }, + { url = "https://files.pythonhosted.org/packages/95/50/7bf8688a91f09a214b847cb3a47007f87577e67c40354d1643adb7ec27e9/rpds_py-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dcc4949be728ede49e6244eabd04064336012b37f5c2200e8ec8eb2988b209c", size = 361901 }, + { url = "https://files.pythonhosted.org/packages/0a/f9/0be0f9f58d8d06b3e7c921ce5ca68774eb4d67c691ee21c60d1eeedaf6a7/rpds_py-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f414da5c51bf350e4b7960644617c130140423882305f7574b6cf65a3081cecb", size = 370187 }, + { url = "https://files.pythonhosted.org/packages/ad/b1/cccfbcd85cfa7537427384f636708867b29c3b438a5d60d579dd022374d1/rpds_py-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9afe42102b40007f588666bc7de82451e10c6788f6f70984629db193849dced1", size = 404678 }, + { url = "https://files.pythonhosted.org/packages/06/c3/7cd4daa0a7ae54ec4b5b9e93b2f0b0d9b6dd3eccb10a0408c3508066ca6d/rpds_py-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b929c2bb6e29ab31f12a1117c39f7e6d6450419ab7464a4ea9b0b417174f044", size = 431349 }, + { url = "https://files.pythonhosted.org/packages/44/ab/6fd9144e3b182b7c6ee09fd3f1718541d86c74a595f2afe0bd8bf8fb5db0/rpds_py-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8404b3717da03cbf773a1d275d01fec84ea007754ed380f63dfc24fb76ce4592", size = 361472 }, + { url = "https://files.pythonhosted.org/packages/9f/54/902896b543778b0ff6d1baf9b46290f2ca5db14593136b4602a44c0df440/rpds_py-0.21.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e12bb09678f38b7597b8346983d2323a6482dcd59e423d9448108c1be37cac9d", size = 383059 }, + { url = "https://files.pythonhosted.org/packages/2a/38/c17ae56ed63ef78fb22dbd669460b4ea5ae37ae100e16d5205e4538e0bb1/rpds_py-0.21.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:58a0e345be4b18e6b8501d3b0aa540dad90caeed814c515e5206bb2ec26736fd", size = 547211 }, + { url = "https://files.pythonhosted.org/packages/ad/0f/8688bb424ca626fe2ff8782ed40660b1881c78bceadcdd6c72971ebba4cb/rpds_py-0.21.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c3761f62fcfccf0864cc4665b6e7c3f0c626f0380b41b8bd1ce322103fa3ef87", size = 550158 }, + { url = "https://files.pythonhosted.org/packages/ee/f3/002f79553404f04d737b461e07935a8bf7303d1cee6d7934b0cec009f650/rpds_py-0.21.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c2b2f71c6ad6c2e4fc9ed9401080badd1469fa9889657ec3abea42a3d6b2e1ed", size = 528557 }, + { url = "https://files.pythonhosted.org/packages/52/26/dca37e306fa2b7329fcdd3b6028d5075c156e444f87b3229af51074ec4a9/rpds_py-0.21.0-cp39-none-win32.whl", hash = "sha256:b21747f79f360e790525e6f6438c7569ddbfb1b3197b9e65043f25c3c9b489d8", size = 200495 }, + { url = "https://files.pythonhosted.org/packages/f3/9c/f5438d22e6172bf6b38e1809e42f4ce47e9dec7f6db04635c167a674fa68/rpds_py-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:0626238a43152918f9e72ede9a3b6ccc9e299adc8ade0d67c5e142d564c9a83d", size = 218879 }, + { url = "https://files.pythonhosted.org/packages/ff/d3/ffb04445d29c03d380047c62bed01b979adb9204424e2c833817012f679e/rpds_py-0.21.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6b4ef7725386dc0762857097f6b7266a6cdd62bfd209664da6712cb26acef035", size = 328265 }, + { url = "https://files.pythonhosted.org/packages/dc/9d/894ff29a2be8f85fd1acff6e0c1b52b629aee019da8651125af9ee4894e1/rpds_py-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6bc0e697d4d79ab1aacbf20ee5f0df80359ecf55db33ff41481cf3e24f206919", size = 319238 }, + { url = "https://files.pythonhosted.org/packages/43/3d/0e5b835c22933a5bdc4413e4a91de55a8c1ef33f55eb2514a5cf24729173/rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da52d62a96e61c1c444f3998c434e8b263c384f6d68aca8274d2e08d1906325c", size = 362136 }, + { url = "https://files.pythonhosted.org/packages/67/81/c9f29da910ac19758f170633c0937fc2f0898b84389bd05bfc255c985f19/rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:98e4fe5db40db87ce1c65031463a760ec7906ab230ad2249b4572c2fc3ef1f9f", size = 370411 }, + { url = "https://files.pythonhosted.org/packages/a8/df/b989044f90b81093e454eb54799e7ee5b085ebf957a75d07d5e21eac2fb5/rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30bdc973f10d28e0337f71d202ff29345320f8bc49a31c90e6c257e1ccef4333", size = 404598 }, + { url = "https://files.pythonhosted.org/packages/8f/09/f79cd575f503932f41138c4bec4c902eb3b71ea8570436688145cc77b8ef/rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:faa5e8496c530f9c71f2b4e1c49758b06e5f4055e17144906245c99fa6d45356", size = 430224 }, + { url = "https://files.pythonhosted.org/packages/34/46/7fae3500bc188df2feee09dd72df262b97d31e8e4bd2ff4a8be4e28bf1d3/rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32eb88c30b6a4f0605508023b7141d043a79b14acb3b969aa0b4f99b25bc7d4a", size = 361660 }, + { url = "https://files.pythonhosted.org/packages/5b/1d/d850242d30e68f99ad80815576f38b378b5aba393613e3357ed5e593499e/rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a89a8ce9e4e75aeb7fa5d8ad0f3fecdee813802592f4f46a15754dcb2fd6b061", size = 384008 }, + { url = "https://files.pythonhosted.org/packages/c9/16/df4cfd1de216c25de24f8631f17380f8edee92201ec7810d1e2ba1dd9f85/rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:241e6c125568493f553c3d0fdbb38c74babf54b45cef86439d4cd97ff8feb34d", size = 546855 }, + { url = "https://files.pythonhosted.org/packages/c0/b8/03d4561095d4fbf2ab62ed651a2b5cb674fe5245b1ab2f7909e8056bd014/rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:3b766a9f57663396e4f34f5140b3595b233a7b146e94777b97a8413a1da1be18", size = 550599 }, + { url = "https://files.pythonhosted.org/packages/f4/54/d93867e2bf4acf57314798181faf3bd7d1a4f51a3aa81cb6211d56f74d3f/rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:af4a644bf890f56e41e74be7d34e9511e4954894d544ec6b8efe1e21a1a8da6c", size = 528963 }, + { url = "https://files.pythonhosted.org/packages/66/86/6f72984a284d720d84fba5ee7b0d1b0d320978b516497cbfd6e335e95a3e/rpds_py-0.21.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3e30a69a706e8ea20444b98a49f386c17b26f860aa9245329bab0851ed100677", size = 219621 }, + { url = "https://files.pythonhosted.org/packages/f5/25/999c5176513cdf7d9b86958dedddfa95790f9db643b5ddce0a889def7471/rpds_py-0.21.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:031819f906bb146561af051c7cef4ba2003d28cff07efacef59da973ff7969ba", size = 328029 }, + { url = "https://files.pythonhosted.org/packages/64/89/b468c7bd5736db4c8800c905c6d351b750dfccd9e29e685a3aa9705cfcb4/rpds_py-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b876f2bc27ab5954e2fd88890c071bd0ed18b9c50f6ec3de3c50a5ece612f7a6", size = 319144 }, + { url = "https://files.pythonhosted.org/packages/ca/19/de615c09b8ce5a1a09c4d85b64cbeb4188784b082e9e99f051ba6e9ef758/rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc5695c321e518d9f03b7ea6abb5ea3af4567766f9852ad1560f501b17588c7b", size = 362362 }, + { url = "https://files.pythonhosted.org/packages/53/ac/5ba82e51534a13580649de84304c5f75abe37ead43194b7347dd11970528/rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4de1da871b5c0fd5537b26a6fc6814c3cc05cabe0c941db6e9044ffbb12f04a", size = 370449 }, + { url = "https://files.pythonhosted.org/packages/aa/3e/4b99613a4628abb6efd82c9d653fee53fcde12225b68f62037b09ad2a720/rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:878f6fea96621fda5303a2867887686d7a198d9e0f8a40be100a63f5d60c88c9", size = 404073 }, + { url = "https://files.pythonhosted.org/packages/ce/bc/00bda2ffe45d53c7900234508e1a9432031ff8a38df3325af98aada9c680/rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8eeec67590e94189f434c6d11c426892e396ae59e4801d17a93ac96b8c02a6c", size = 429922 }, + { url = "https://files.pythonhosted.org/packages/96/51/3942efa11d6e3fa140f1ac639d533286c94fa6e09e5a1f50a01bfbe12ca9/rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff2eba7f6c0cb523d7e9cff0903f2fe1feff8f0b2ceb6bd71c0e20a4dcee271", size = 361252 }, + { url = "https://files.pythonhosted.org/packages/ba/dd/91a32a556908ddc6762ef5247345b30a91a7e75e3e004246e238224f3321/rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a429b99337062877d7875e4ff1a51fe788424d522bd64a8c0a20ef3021fdb6ed", size = 383920 }, + { url = "https://files.pythonhosted.org/packages/6a/64/8b0d0c0d162c06805ba0218f524bf607b1324c41e7396ee6cfed751bcfc9/rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d167e4dbbdac48bd58893c7e446684ad5d425b407f9336e04ab52e8b9194e2ed", size = 546679 }, + { url = "https://files.pythonhosted.org/packages/e5/26/6800bf70179c5aaffae6bc0cee355744b1475f4b08cb9855a72a5b488fff/rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:4eb2de8a147ffe0626bfdc275fc6563aa7bf4b6db59cf0d44f0ccd6ca625a24e", size = 550831 }, + { url = "https://files.pythonhosted.org/packages/32/b7/75e7cea814765ecc0820aac232216b236ffad940f59bc87522effb44e144/rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e78868e98f34f34a88e23ee9ccaeeec460e4eaf6db16d51d7a9b883e5e785a5e", size = 528487 }, + { url = "https://files.pythonhosted.org/packages/54/3d/11cac262f7d5ac4f34e838628410eca4f9ce3bf02be28ccb0de90362ac11/rpds_py-0.21.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4991ca61656e3160cdaca4851151fd3f4a92e9eba5c7a530ab030d6aee96ec89", size = 219893 }, ] [[package]] @@ -2358,6 +2360,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/b9/1906bfeb30f2fc13bb39bf7ddb8749784c05faadbd18a21cf141ba37bff2/setuptools_scm-8.1.0-py3-none-any.whl", hash = "sha256:897a3226a6fd4a6eb2f068745e49733261a21f70b1bb28fce0339feb978d9af3", size = 43666 }, ] +[[package]] +name = "sinter" +version = "1.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "matplotlib" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "stim" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/47/4968b5c570d03c116c475b18420cfe8d2ae15a2449016d6852e3f92a131f/sinter-1.14.0.tar.gz", hash = "sha256:b40498d9bb7752e28a18bcc06875b34f45befc9f957d7c51c240a37124e8c4d3", size = 174330 } + [[package]] name = "six" version = "1.16.0" @@ -2586,6 +2600,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0b/73/a0db8eb3e200a703d476a8c9091caee71b00d324d6bcdf3fe085dbfbe8ad/stim-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:19b4aab97e347bafc03d95231025cab5abc93151611b6a811ccf4f13df86cd66", size = 2586106 }, ] +[[package]] +name = "stimbposd" +version = "0.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ldpc" }, + { name = "numpy" }, + { name = "sinter" }, + { name = "stim" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/42/4dcfb18c8ec6809236817fc0ee1016b2999266dad84e807afd2fcc2fd446/stimbposd-0.0.1.tar.gz", hash = "sha256:a9a62651e5699a31e2b52c299d23d0af7fecdd7ff99dcd31ed393041f36bf6b4", size = 35089 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/e9/5a6a7f6e10db5b40d05e4deb6e0966a39f103bf0195aab4a82a47fe0941f/stimbposd-0.0.1-py3-none-any.whl", hash = "sha256:2d2519a66d6d8fef6ce08ab052380d3aac54462f3caf7b7c3b73b6ae38cc04ce", size = 13155 }, +] + [[package]] name = "symengine" version = "0.13.0" @@ -2682,14 +2711,14 @@ wheels = [ [[package]] name = "tqdm" -version = "4.66.6" +version = "4.67.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "platform_system == 'Windows'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/34/bef135b27fe1864993a5284ad001157ee9b5538e859ac90f5b0e8cc8c9ec/tqdm-4.66.6.tar.gz", hash = "sha256:4bdd694238bef1485ce839d67967ab50af8f9272aab687c0d7702a01da0be090", size = 169533 } +sdist = { url = "https://files.pythonhosted.org/packages/e8/4f/0153c21dc5779a49a0598c445b1978126b1344bab9ee71e53e44877e14e0/tqdm-4.67.0.tar.gz", hash = "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a", size = 169739 } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/73/02342de9c2d20922115f787e101527b831c0cffd2105c946c4a4826bcfd4/tqdm-4.66.6-py3-none-any.whl", hash = "sha256:223e8b5359c2efc4b30555531f09e9f2f3589bcd7fdd389271191031b49b7a63", size = 78326 }, + { url = "https://files.pythonhosted.org/packages/2b/78/57043611a16c655c8350b4c01b8d6abfb38cc2acb475238b62c2146186d7/tqdm-4.67.0-py3-none-any.whl", hash = "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be", size = 78590 }, ] [[package]] From 3f75906767cbc01e7a4c9be93b4c6103bbb1d953 Mon Sep 17 00:00:00 2001 From: lucas Date: Mon, 18 Nov 2024 14:06:54 +0100 Subject: [PATCH 58/79] remove stimbposd --- pyproject.toml | 3 +-- scripts/cc_decoder/run_color_code_phenomenological_noise.py | 2 +- .../qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index afb9dfde..afb6d9c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,7 +56,6 @@ dependencies = [ "numba>=0.59; python_version > '3.11'", "numba>=0.57; python_version <= '3.11'", "pymatching>=2.2.1", - "stimbposd" ] dynamic = ["version"] @@ -191,7 +190,7 @@ exclude = [ [[tool.mypy.overrides]] module = ["qiskit.*", "qecsim.*", "qiskit_aer.*", "matplotlib.*", "scipy.*", "ldpc.*", "pytest_console_scripts.*", - "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*", "stimbposd.*", "sinter.*"] + "z3.*", "bposd.*", "numba.*", "pymatching.*", "stim.*", "multiprocess.*", "sinter.*"] ignore_missing_imports = true diff --git a/scripts/cc_decoder/run_color_code_phenomenological_noise.py b/scripts/cc_decoder/run_color_code_phenomenological_noise.py index df29cafe..4561986d 100644 --- a/scripts/cc_decoder/run_color_code_phenomenological_noise.py +++ b/scripts/cc_decoder/run_color_code_phenomenological_noise.py @@ -36,7 +36,7 @@ def main() -> None: max_shots=10_000, max_errors=500, tasks=generate_example_tasks(), - decoders=["maxsat", "bposd"], + decoders=["maxsat"], custom_decoders=sinter_decoders(), print_progress=True, save_resume_filepath="pseudothreshold_plot.csv", diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index aba868e1..d062ca91 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -8,7 +8,6 @@ import stim from sinter import CompiledDecoder, Decoder -from stimbposd import SinterDecoder_BPOSD from .max_sat_stim_decoder import MaxSatStim @@ -143,4 +142,4 @@ def decode_via_files( def sinter_decoders(**kwargs: Any) -> dict[str, Decoder]: # noqa: ANN401 """Return a list of available sinter decoders.""" - return {"maxsat": SinterDecoderMaxSat(**kwargs), "bposd": SinterDecoder_BPOSD()} + return {"maxsat": SinterDecoderMaxSat(**kwargs)} From 14bc26316f7eaccf99ef92b1eb21fec7f079cad3 Mon Sep 17 00:00:00 2001 From: lucas Date: Mon, 18 Nov 2024 14:43:52 +0100 Subject: [PATCH 59/79] fix numpy issue --- pyproject.toml | 6 ------ .../cc_decoder/run_color_code_phenomenological_noise.py | 7 ++++++- src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py | 5 +++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index afb6d9c3..9aae5f76 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -180,12 +180,8 @@ disallow_untyped_defs = false explicit_package_bases = true warn_unreachable = true exclude = [ - "^plot\\_convergence\\_rate\\.ipynb$", - "^plot\\_pseudothresholds.\\ipnyb$", - "^plots\\.py$", "code_construction*", "^data_utils\\.py$", - "^run\\_color\\_code\\_phenomenological\\_noise\\.py$", ] [[tool.mypy.overrides]] @@ -275,8 +271,6 @@ isort.required-imports = ["from __future__ import annotations"] "E402", # Allow imports to appear anywhere in Jupyter notebooks "I002", # Allow missing `from __future__ import annotations` import ] -"*/cc_decoder/plotting/**" = ["T20"] -"*/cc_decoder/plotting/*.ipynb" = ["T", "PTH", "FURB", "PERF", "D"] "scripts/*" = ["T201"] [tool.ruff.lint.pydocstyle] diff --git a/scripts/cc_decoder/run_color_code_phenomenological_noise.py b/scripts/cc_decoder/run_color_code_phenomenological_noise.py index 4561986d..cc7725d6 100644 --- a/scripts/cc_decoder/run_color_code_phenomenological_noise.py +++ b/scripts/cc_decoder/run_color_code_phenomenological_noise.py @@ -8,10 +8,15 @@ import numpy as np import sinter -from mqt.qecc.cc_decoder.stim_interface.color_code_stim import gen_pcm_and_logical, gen_stim_circuit_memory_experiment +from mqt.qecc.cc_decoder.stim_interface.color_code_stim import gen_pcm_and_logical, \ + gen_stim_circuit_memory_experiment from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import sinter_decoders +# from mqt.qecc.cc_decoder.stim_interface.color_code_stim import gen_pcm_and_logical, gen_stim_circuit_memory_experiment +# from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import sinter_decoders + + def generate_example_tasks() -> Any: # noqa: ANN401 """Generate example stim tasks.""" for p in np.arange(0.001, 0.03, 0.001): diff --git a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py index 8cec0985..eabbb40d 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py @@ -45,8 +45,9 @@ def gen_pcm_and_logical(distance: int) -> tuple[NDArray[bool], set[int]]: for ancilla_qubit, lattice_point in ancilla_qubit_to_lattice_points.items(): for neighbor in neighbors(lattice_point): - if neighbor in lattice_points_to_qubit_index: - qubit = lattice_points_to_qubit_index[neighbor] + neighbour_tpl = tuple(neighbor) + if neighbour_tpl in lattice_points_to_qubit_index: + qubit = lattice_points_to_qubit_index[neighbour_tpl] parity_check_matrix[ancilla_qubit, qubit] = True return (parity_check_matrix, logical_operator) From d4a07bae19275d7bd0ba074b06eda3d7842ce32d Mon Sep 17 00:00:00 2001 From: lucas Date: Mon, 18 Nov 2024 14:45:07 +0100 Subject: [PATCH 60/79] remove superfluous arg --- src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index d062ca91..559a6635 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -123,7 +123,6 @@ def decode_via_files( dem = stim.DetectorErrorModel.from_file(dem_path) max_sat = MaxSatStim( model=dem, - **self.maxsat_kwargs, ) shots = stim.read_shot_data_file( path=dets_b8_in_path, From d854adf800a6b34dd4c5461b3e47443037870a82 Mon Sep 17 00:00:00 2001 From: lucas Date: Mon, 18 Nov 2024 15:59:25 +0100 Subject: [PATCH 61/79] tests for color code stim ckt gen --- .../stim_interface/color_code_stim.py | 8 ++ .../python/cc_decoder/test_color_code_stim.py | 79 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 test/python/cc_decoder/test_color_code_stim.py diff --git a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py index eabbb40d..cb936437 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py @@ -105,3 +105,11 @@ def gen_stim_circuit_memory_experiment( circuit.append("OBSERVABLE_INCLUDE", [stim.target_rec(-1)], (0)) return circuit + +if __name__ == '__main__': + circuit = stim.Circuit() + pcm = np.array([[True, True, False, True, True, False, False], + [False, True, True, False, True, True, False], + [False, False, False, True, True, True, True]]).astype(int) + logical = np.array([2,5,6]) + print(gen_stim_circuit_memory_experiment(pcm, logical,3, 0.5)) \ No newline at end of file diff --git a/test/python/cc_decoder/test_color_code_stim.py b/test/python/cc_decoder/test_color_code_stim.py new file mode 100644 index 00000000..d26ccfa9 --- /dev/null +++ b/test/python/cc_decoder/test_color_code_stim.py @@ -0,0 +1,79 @@ +from __future__ import annotations +from typing import TYPE_CHECKING +import numpy as np +import pytest +import stim +from numpy.core.numeric import array_equal + +if TYPE_CHECKING: + from numpy.typing import NDArray +from mqt.qecc.cc_decoder.stim_interface.color_code_stim import neighbors, gen_pcm_and_logical, add_checks_one_round, \ + gen_stim_circuit_memory_experiment + + +@pytest.fixture +def hamming_code() -> NDArray[bool]: + return np.array([[True, True, False, True, True, False, False], + [False, True, True, False, True, True, False], + [False, False, False, True, True, True, True]]) + + +def test_gen_pcm_and_logical(hamming_code) -> None: + distance = 3 + expected_logicals = {2, 5, 6} + + pcm, logicals = gen_pcm_and_logical(distance) + + assert array_equal(hamming_code, pcm) + assert expected_logicals == logicals + + +def test_neighbours() -> None: + input_perm = np.array([1, 2, 3]) + expected = [[2, 2, 2], + [1, 3, 2], + [0, 3, 3], + [0, 2, 4], + [1, 1, 4], + [2, 1, 3]] + + assert array_equal(expected, neighbors(input_perm)) + + +def test_add_checks_one_round(hamming_code) -> None: + expected_circuit = stim.Circuit() + circuit = stim.Circuit() + expected_circuit.append_from_stim_program_text("MPP Z0*Z1*Z3*Z4") + expected_circuit.append_from_stim_program_text("MPP Z1*Z2*Z4*Z5") + expected_circuit.append_from_stim_program_text("MPP Z3*Z4*Z5*Z6") + assert expected_circuit == add_checks_one_round(hamming_code, circuit, False, 0) + + +def test_gen_stim_memory_experiment(hamming_code) -> None: + expected_circuit = stim.Circuit() + circuit = stim.Circuit() + expected_circuit.append_from_stim_program_text("R 0 1 2 3 4 5 6") + expected_circuit.append_from_stim_program_text("MPP Z0*Z1*Z3*Z4 Z1*Z2*Z4*Z5 Z3*Z4*Z5*Z6") + expected_circuit.append_from_stim_program_text("X_ERROR(0.5) 0 1 2 3 4 5 6") + expected_circuit.append_from_stim_program_text("MPP(0.5) Z0*Z1*Z3*Z4 Z1*Z2*Z4*Z5 Z3*Z4*Z5*Z6") + expected_circuit.append_from_stim_program_text("DETECTOR rec[-1] rec[-4]") + expected_circuit.append_from_stim_program_text("DETECTOR rec[-2] rec[-5]") + expected_circuit.append_from_stim_program_text("DETECTOR rec[-3] rec[-6]") + expected_circuit.append_from_stim_program_text("X_ERROR(0.5) 0 1 2 3 4 5 6") + expected_circuit.append_from_stim_program_text("MPP(0.5) Z0*Z1*Z3*Z4 Z1*Z2*Z4*Z5 Z3*Z4*Z5*Z6") + expected_circuit.append_from_stim_program_text("DETECTOR rec[-1] rec[-4]") + expected_circuit.append_from_stim_program_text("DETECTOR rec[-2] rec[-5]") + expected_circuit.append_from_stim_program_text("DETECTOR rec[-3] rec[-6]") + expected_circuit.append_from_stim_program_text("X_ERROR(0.5) 0 1 2 3 4 5 6") + expected_circuit.append_from_stim_program_text("MPP(0.5) Z0*Z1*Z3*Z4 Z1*Z2*Z4*Z5 Z3*Z4*Z5*Z6") + expected_circuit.append_from_stim_program_text("DETECTOR rec[-1] rec[-4]") + expected_circuit.append_from_stim_program_text("DETECTOR rec[-2] rec[-5]") + expected_circuit.append_from_stim_program_text("DETECTOR rec[-3] rec[-6]") + expected_circuit.append_from_stim_program_text("MPP Z0*Z1*Z3*Z4 Z1*Z2*Z4*Z5 Z3*Z4*Z5*Z6") + expected_circuit.append_from_stim_program_text("DETECTOR rec[-1] rec[-4]") + expected_circuit.append_from_stim_program_text("DETECTOR rec[-2] rec[-5]") + expected_circuit.append_from_stim_program_text("DETECTOR rec[-3] rec[-6]") + expected_circuit.append_from_stim_program_text("MPP Z2*Z5*Z6") + expected_circuit.append_from_stim_program_text("OBSERVABLE_INCLUDE(0) rec[-1]") + logical = np.array([2, 5, 6]) + assert expected_circuit == gen_stim_circuit_memory_experiment(hamming_code, logical, 3, 0.5) From 1439947f14a5b38cb4dd08f68f8d25f01fa0bde4 Mon Sep 17 00:00:00 2001 From: lucas Date: Mon, 18 Nov 2024 20:37:51 +0100 Subject: [PATCH 62/79] tests for color code stim ckt gen --- .../stim_interface/color_code_stim.py | 8 - .../python/cc_decoder/test_color_code_stim.py | 13 +- .../python/cc_decoder/test_dem_to_matrices.py | 446 ++++++++++++++++++ 3 files changed, 452 insertions(+), 15 deletions(-) create mode 100644 test/python/cc_decoder/test_dem_to_matrices.py diff --git a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py index cb936437..eabbb40d 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/color_code_stim.py @@ -105,11 +105,3 @@ def gen_stim_circuit_memory_experiment( circuit.append("OBSERVABLE_INCLUDE", [stim.target_rec(-1)], (0)) return circuit - -if __name__ == '__main__': - circuit = stim.Circuit() - pcm = np.array([[True, True, False, True, True, False, False], - [False, True, True, False, True, True, False], - [False, False, False, True, True, True, True]]).astype(int) - logical = np.array([2,5,6]) - print(gen_stim_circuit_memory_experiment(pcm, logical,3, 0.5)) \ No newline at end of file diff --git a/test/python/cc_decoder/test_color_code_stim.py b/test/python/cc_decoder/test_color_code_stim.py index d26ccfa9..1b0cd87a 100644 --- a/test/python/cc_decoder/test_color_code_stim.py +++ b/test/python/cc_decoder/test_color_code_stim.py @@ -30,13 +30,12 @@ def test_gen_pcm_and_logical(hamming_code) -> None: def test_neighbours() -> None: input_perm = np.array([1, 2, 3]) - expected = [[2, 2, 2], - [1, 3, 2], - [0, 3, 3], - [0, 2, 4], - [1, 1, 4], - [2, 1, 3]] - + expected = np.array([[2, 2, 2], + [1, 3, 2], + [0, 3, 3], + [0, 2, 4], + [1, 1, 4], + [2, 1, 3]]) assert array_equal(expected, neighbors(input_perm)) diff --git a/test/python/cc_decoder/test_dem_to_matrices.py b/test/python/cc_decoder/test_dem_to_matrices.py new file mode 100644 index 00000000..596fa6c5 --- /dev/null +++ b/test/python/cc_decoder/test_dem_to_matrices.py @@ -0,0 +1,446 @@ +from __future__ import annotations +from typing import TYPE_CHECKING, Tuple +import numpy as np +import pytest +import stim +from numpy.core.numeric import array_equal + +if TYPE_CHECKING: + from numpy.typing import NDArray +from mqt.qecc.cc_decoder.stim_interface.dem_to_matrices import dict_to_csc_matrix, \ + detector_error_model_to_check_matrices, DemMatrices + + +@pytest.fixture +def dem_matrix() -> NDArray[NDArray[int]]: + return np.array( + [ + [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] + ] + ) + + +@pytest.fixture +def hyperedges() -> dict[int, frozenset[int]]: + return {0: frozenset({0, 1, 2}), 1: frozenset({0, 1}), 2: frozenset({0, 2}), 3: frozenset({0, 3}), + 4: frozenset({0}), 5: frozenset({1, 2}), 6: frozenset({1, 4}), 7: frozenset({1}), 8: frozenset({2}), + 9: frozenset({2, 5}), 10: frozenset({3, 4, 5}), 11: frozenset({3, 4}), 12: frozenset({3, 5}), + 13: frozenset({3, 6}), 14: frozenset({3}), 15: frozenset({4, 5}), 16: frozenset({4, 7}), 17: frozenset({4}), + 18: frozenset({5}), 19: frozenset({8, 5}), 20: frozenset({8, 6, 7}), 21: frozenset({6, 7}), + 22: frozenset({8, 6}), 23: frozenset({9, 6}), 24: frozenset({6}), 25: frozenset({8, 7}), + 26: frozenset({10, 7}), 27: frozenset({7}), 28: frozenset({8}), 29: frozenset({8, 11})} + + +@pytest.fixture +def hypergraph_shape() -> Tuple[int, int]: + return (12, 30) + + +@pytest.fixture +def priors() -> NDArray[np.float32]: + return np.array( + [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, + 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]) + + +@pytest.fixture +def hyperedge_to_edge_matrix() -> NDArray[NDArray[np.int32]]: + return np.array( + [ + [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, ], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, ]] + ) + + +@pytest.fixture +def edge_obsbl_matrix() -> NDArray[NDArray[np.int32]]: + return np.array([[1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0]]) + + +@pytest.fixture +def edge_check_matrix() -> NDArray[NDArray.np.int32]: + return np.array( + [ + [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]] + ) + + +@pytest.fixture +def obsble_matrix() -> NDArray[NDArray[np.int32]]: + return np.array([[0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0]]) + + +@pytest.fixture +def hamming_code() -> NDArray[bool]: + return np.array([[True, True, False, True, True, False, False], + [False, True, True, False, True, True, False], + [False, False, False, True, True, True, True]]) + + +@pytest.fixture +def detector_error_model() -> stim.DetectorErrorModel: + return stim.DetectorErrorModel(''' + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11''') + + +def test_dict_to_csc_matrix(hypergraph_shape, hyperedges: dict[int, frozenset[int]], + dem_matrix: NDArray[NDArray[int]]) -> None: + result = dict_to_csc_matrix(hyperedges, hypergraph_shape).todense() + assert array_equal(result, dem_matrix) + + +def test_detector_error_model_to_check_matrices(detector_error_model, priors, dem_matrix, obsble_matrix, + edge_check_matrix, edge_obsbl_matrix,hyperedge_to_edge_matrix) -> None: + result = detector_error_model_to_check_matrices(detector_error_model, True) + assert array_equal(result.priors, priors) + assert array_equal(result.check_matrix.todense(), dem_matrix) + assert array_equal(result.observables_matrix.todense(), obsble_matrix) + assert array_equal(result.edge_check_matrix.todense(), edge_check_matrix) + assert array_equal(result.edge_observables_matrix.todense(), edge_obsbl_matrix) + assert array_equal(result.hyperedge_to_edge_matrix.todense(), hyperedge_to_edge_matrix) From fa725d40fb2714f93f89ebdb21a94b884f03a6fe Mon Sep 17 00:00:00 2001 From: lucas Date: Mon, 18 Nov 2024 23:06:52 +0100 Subject: [PATCH 63/79] stim interface tests --- .../cc_decoder/test_max_sat_stim_decoder.py | 649 ++++++++++++++++++ 1 file changed, 649 insertions(+) create mode 100644 test/python/cc_decoder/test_max_sat_stim_decoder.py diff --git a/test/python/cc_decoder/test_max_sat_stim_decoder.py b/test/python/cc_decoder/test_max_sat_stim_decoder.py new file mode 100644 index 00000000..ca085ab2 --- /dev/null +++ b/test/python/cc_decoder/test_max_sat_stim_decoder.py @@ -0,0 +1,649 @@ +from __future__ import annotations +from typing import TYPE_CHECKING, Tuple +import numpy as np +import pytest +import stim +from numpy.core.numeric import array_equal +from numpy.ma.testutils import assert_equal + +if TYPE_CHECKING: + from numpy.typing import NDArray +from mqt.qecc.cc_decoder.stim_interface.max_sat_stim_decoder import MaxSatStim + + +@pytest.fixture +def hamming_code() -> NDArray[bool]: + return np.array([[True, True, False, True, True, False, False], + [False, True, True, False, True, True, False], + [False, False, False, True, True, True, True]]) + + +@pytest.fixture +def detector_error_model() -> stim.DetectorErrorModel: + return stim.DetectorErrorModel(''' + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11''') + + +@pytest.fixture +def detector_error_model() -> stim.DetectorErrorModel: + return stim.DetectorErrorModel(''' + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11''') + + +def test_check_matrix_to_adj_lists(hamming_code) -> None: + expected_qft = {0: [0], 1: [0, 1], 3: [0, 2], 4: [0, 1, 2], 2: [1], 5: [1, 2], 6: [2]} + expected_ftq = {0: [0, 1, 3, 4], 1: [1, 2, 4, 5], 2: [3, 4, 5, 6]} + qft, ftq = MaxSatStim.check_matrix_to_adj_lists(hamming_code) + assert expected_qft == qft + assert expected_ftq == ftq + + +def test_decode_batch(detector_error_model) -> None: + shots = np.array([[0, 0]]).astype(np.uint8) + bit_packed_shots = True + bit_packed_predictions = True + maxsatstim = MaxSatStim(detector_error_model) + res_pred, res_conv, res_not_cong_cnt = maxsatstim.decode_batch(shots=shots, + bit_packed_shots=True, + bit_packed_predictions=True) + assert len(res_pred) == 1 + assert res_conv == 1 + assert res_not_cong_cnt == 0 From 3761c1432e87bff12ebbb42c0bc636b71a11ee5a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 19 Nov 2024 14:23:52 +0000 Subject: [PATCH 64/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../run_color_code_phenomenological_noise.py | 4 +- .../python/cc_decoder/test_color_code_stim.py | 27 +- .../python/cc_decoder/test_dem_to_matrices.py | 1067 +++++++++++++++-- .../cc_decoder/test_max_sat_stim_decoder.py | 30 +- 4 files changed, 1015 insertions(+), 113 deletions(-) diff --git a/scripts/cc_decoder/run_color_code_phenomenological_noise.py b/scripts/cc_decoder/run_color_code_phenomenological_noise.py index cc7725d6..6a4052e6 100644 --- a/scripts/cc_decoder/run_color_code_phenomenological_noise.py +++ b/scripts/cc_decoder/run_color_code_phenomenological_noise.py @@ -8,11 +8,9 @@ import numpy as np import sinter -from mqt.qecc.cc_decoder.stim_interface.color_code_stim import gen_pcm_and_logical, \ - gen_stim_circuit_memory_experiment +from mqt.qecc.cc_decoder.stim_interface.color_code_stim import gen_pcm_and_logical, gen_stim_circuit_memory_experiment from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import sinter_decoders - # from mqt.qecc.cc_decoder.stim_interface.color_code_stim import gen_pcm_and_logical, gen_stim_circuit_memory_experiment # from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import sinter_decoders diff --git a/test/python/cc_decoder/test_color_code_stim.py b/test/python/cc_decoder/test_color_code_stim.py index 1b0cd87a..fb567431 100644 --- a/test/python/cc_decoder/test_color_code_stim.py +++ b/test/python/cc_decoder/test_color_code_stim.py @@ -1,5 +1,7 @@ from __future__ import annotations + from typing import TYPE_CHECKING + import numpy as np import pytest import stim @@ -7,15 +9,21 @@ if TYPE_CHECKING: from numpy.typing import NDArray -from mqt.qecc.cc_decoder.stim_interface.color_code_stim import neighbors, gen_pcm_and_logical, add_checks_one_round, \ - gen_stim_circuit_memory_experiment +from mqt.qecc.cc_decoder.stim_interface.color_code_stim import ( + add_checks_one_round, + gen_pcm_and_logical, + gen_stim_circuit_memory_experiment, + neighbors, +) @pytest.fixture def hamming_code() -> NDArray[bool]: - return np.array([[True, True, False, True, True, False, False], - [False, True, True, False, True, True, False], - [False, False, False, True, True, True, True]]) + return np.array([ + [True, True, False, True, True, False, False], + [False, True, True, False, True, True, False], + [False, False, False, True, True, True, True], + ]) def test_gen_pcm_and_logical(hamming_code) -> None: @@ -30,12 +38,7 @@ def test_gen_pcm_and_logical(hamming_code) -> None: def test_neighbours() -> None: input_perm = np.array([1, 2, 3]) - expected = np.array([[2, 2, 2], - [1, 3, 2], - [0, 3, 3], - [0, 2, 4], - [1, 1, 4], - [2, 1, 3]]) + expected = np.array([[2, 2, 2], [1, 3, 2], [0, 3, 3], [0, 2, 4], [1, 1, 4], [2, 1, 3]]) assert array_equal(expected, neighbors(input_perm)) @@ -50,7 +53,7 @@ def test_add_checks_one_round(hamming_code) -> None: def test_gen_stim_memory_experiment(hamming_code) -> None: expected_circuit = stim.Circuit() - circuit = stim.Circuit() + stim.Circuit() expected_circuit.append_from_stim_program_text("R 0 1 2 3 4 5 6") expected_circuit.append_from_stim_program_text("MPP Z0*Z1*Z3*Z4 Z1*Z2*Z4*Z5 Z3*Z4*Z5*Z6") expected_circuit.append_from_stim_program_text("X_ERROR(0.5) 0 1 2 3 4 5 6") diff --git a/test/python/cc_decoder/test_dem_to_matrices.py b/test/python/cc_decoder/test_dem_to_matrices.py index 596fa6c5..7fba10cd 100644 --- a/test/python/cc_decoder/test_dem_to_matrices.py +++ b/test/python/cc_decoder/test_dem_to_matrices.py @@ -1,5 +1,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Tuple + +from typing import TYPE_CHECKING + import numpy as np import pytest import stim @@ -7,85 +9,975 @@ if TYPE_CHECKING: from numpy.typing import NDArray -from mqt.qecc.cc_decoder.stim_interface.dem_to_matrices import dict_to_csc_matrix, \ - detector_error_model_to_check_matrices, DemMatrices +from mqt.qecc.cc_decoder.stim_interface.dem_to_matrices import ( + detector_error_model_to_check_matrices, + dict_to_csc_matrix, +) @pytest.fixture def dem_matrix() -> NDArray[NDArray[int]]: - return np.array( - [ - [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] - ] - ) + return np.array([ + [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], + ]) @pytest.fixture def hyperedges() -> dict[int, frozenset[int]]: - return {0: frozenset({0, 1, 2}), 1: frozenset({0, 1}), 2: frozenset({0, 2}), 3: frozenset({0, 3}), - 4: frozenset({0}), 5: frozenset({1, 2}), 6: frozenset({1, 4}), 7: frozenset({1}), 8: frozenset({2}), - 9: frozenset({2, 5}), 10: frozenset({3, 4, 5}), 11: frozenset({3, 4}), 12: frozenset({3, 5}), - 13: frozenset({3, 6}), 14: frozenset({3}), 15: frozenset({4, 5}), 16: frozenset({4, 7}), 17: frozenset({4}), - 18: frozenset({5}), 19: frozenset({8, 5}), 20: frozenset({8, 6, 7}), 21: frozenset({6, 7}), - 22: frozenset({8, 6}), 23: frozenset({9, 6}), 24: frozenset({6}), 25: frozenset({8, 7}), - 26: frozenset({10, 7}), 27: frozenset({7}), 28: frozenset({8}), 29: frozenset({8, 11})} + return { + 0: frozenset({0, 1, 2}), + 1: frozenset({0, 1}), + 2: frozenset({0, 2}), + 3: frozenset({0, 3}), + 4: frozenset({0}), + 5: frozenset({1, 2}), + 6: frozenset({1, 4}), + 7: frozenset({1}), + 8: frozenset({2}), + 9: frozenset({2, 5}), + 10: frozenset({3, 4, 5}), + 11: frozenset({3, 4}), + 12: frozenset({3, 5}), + 13: frozenset({3, 6}), + 14: frozenset({3}), + 15: frozenset({4, 5}), + 16: frozenset({4, 7}), + 17: frozenset({4}), + 18: frozenset({5}), + 19: frozenset({8, 5}), + 20: frozenset({8, 6, 7}), + 21: frozenset({6, 7}), + 22: frozenset({8, 6}), + 23: frozenset({9, 6}), + 24: frozenset({6}), + 25: frozenset({8, 7}), + 26: frozenset({10, 7}), + 27: frozenset({7}), + 28: frozenset({8}), + 29: frozenset({8, 11}), + } @pytest.fixture -def hypergraph_shape() -> Tuple[int, int]: +def hypergraph_shape() -> tuple[int, int]: return (12, 30) @pytest.fixture def priors() -> NDArray[np.float32]: - return np.array( - [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, - 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]) + return np.array([ + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + ]) @pytest.fixture def hyperedge_to_edge_matrix() -> NDArray[NDArray[np.int32]]: - return np.array( + return np.array([ + [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], [ - [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, ], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, ]] - ) + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + ], + ]) @pytest.fixture @@ -95,21 +987,20 @@ def edge_obsbl_matrix() -> NDArray[NDArray[np.int32]]: @pytest.fixture def edge_check_matrix() -> NDArray[NDArray.np.int32]: - return np.array( - [ - [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]] - ) + return np.array([ + [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], + ]) @pytest.fixture @@ -119,14 +1010,16 @@ def obsble_matrix() -> NDArray[NDArray[np.int32]]: @pytest.fixture def hamming_code() -> NDArray[bool]: - return np.array([[True, True, False, True, True, False, False], - [False, True, True, False, True, True, False], - [False, False, False, True, True, True, True]]) + return np.array([ + [True, True, False, True, True, False, False], + [False, True, True, False, True, True, False], + [False, False, False, True, True, True, True], + ]) @pytest.fixture def detector_error_model() -> stim.DetectorErrorModel: - return stim.DetectorErrorModel(''' + return stim.DetectorErrorModel(""" error(0.5) D0 D1 D2 error(0.5) D0 D1 L0 error(0.5) D0 D2 @@ -426,17 +1319,25 @@ def detector_error_model() -> stim.DetectorErrorModel: error(0.5) D7 D10 error(0.5) D7 L0 error(0.5) D8 - error(0.5) D8 D11''') + error(0.5) D8 D11""") -def test_dict_to_csc_matrix(hypergraph_shape, hyperedges: dict[int, frozenset[int]], - dem_matrix: NDArray[NDArray[int]]) -> None: +def test_dict_to_csc_matrix( + hypergraph_shape, hyperedges: dict[int, frozenset[int]], dem_matrix: NDArray[NDArray[int]] +) -> None: result = dict_to_csc_matrix(hyperedges, hypergraph_shape).todense() assert array_equal(result, dem_matrix) -def test_detector_error_model_to_check_matrices(detector_error_model, priors, dem_matrix, obsble_matrix, - edge_check_matrix, edge_obsbl_matrix,hyperedge_to_edge_matrix) -> None: +def test_detector_error_model_to_check_matrices( + detector_error_model, + priors, + dem_matrix, + obsble_matrix, + edge_check_matrix, + edge_obsbl_matrix, + hyperedge_to_edge_matrix, +) -> None: result = detector_error_model_to_check_matrices(detector_error_model, True) assert array_equal(result.priors, priors) assert array_equal(result.check_matrix.todense(), dem_matrix) diff --git a/test/python/cc_decoder/test_max_sat_stim_decoder.py b/test/python/cc_decoder/test_max_sat_stim_decoder.py index ca085ab2..c86eeea7 100644 --- a/test/python/cc_decoder/test_max_sat_stim_decoder.py +++ b/test/python/cc_decoder/test_max_sat_stim_decoder.py @@ -1,10 +1,10 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Tuple + +from typing import TYPE_CHECKING + import numpy as np import pytest import stim -from numpy.core.numeric import array_equal -from numpy.ma.testutils import assert_equal if TYPE_CHECKING: from numpy.typing import NDArray @@ -13,14 +13,16 @@ @pytest.fixture def hamming_code() -> NDArray[bool]: - return np.array([[True, True, False, True, True, False, False], - [False, True, True, False, True, True, False], - [False, False, False, True, True, True, True]]) + return np.array([ + [True, True, False, True, True, False, False], + [False, True, True, False, True, True, False], + [False, False, False, True, True, True, True], + ]) @pytest.fixture def detector_error_model() -> stim.DetectorErrorModel: - return stim.DetectorErrorModel(''' + return stim.DetectorErrorModel(""" error(0.5) D0 D1 D2 error(0.5) D0 D1 L0 error(0.5) D0 D2 @@ -320,12 +322,12 @@ def detector_error_model() -> stim.DetectorErrorModel: error(0.5) D7 D10 error(0.5) D7 L0 error(0.5) D8 - error(0.5) D8 D11''') + error(0.5) D8 D11""") @pytest.fixture def detector_error_model() -> stim.DetectorErrorModel: - return stim.DetectorErrorModel(''' + return stim.DetectorErrorModel(""" error(0.5) D0 D1 D2 error(0.5) D0 D1 L0 error(0.5) D0 D2 @@ -625,7 +627,7 @@ def detector_error_model() -> stim.DetectorErrorModel: error(0.5) D7 D10 error(0.5) D7 L0 error(0.5) D8 - error(0.5) D8 D11''') + error(0.5) D8 D11""") def test_check_matrix_to_adj_lists(hamming_code) -> None: @@ -638,12 +640,10 @@ def test_check_matrix_to_adj_lists(hamming_code) -> None: def test_decode_batch(detector_error_model) -> None: shots = np.array([[0, 0]]).astype(np.uint8) - bit_packed_shots = True - bit_packed_predictions = True maxsatstim = MaxSatStim(detector_error_model) - res_pred, res_conv, res_not_cong_cnt = maxsatstim.decode_batch(shots=shots, - bit_packed_shots=True, - bit_packed_predictions=True) + res_pred, res_conv, res_not_cong_cnt = maxsatstim.decode_batch( + shots=shots, bit_packed_shots=True, bit_packed_predictions=True + ) assert len(res_pred) == 1 assert res_conv == 1 assert res_not_cong_cnt == 0 From bffd7dda1f3f171e88f77a678e07544cac0bfb2d Mon Sep 17 00:00:00 2001 From: lucas Date: Tue, 19 Nov 2024 15:59:29 +0100 Subject: [PATCH 65/79] ignore scripts files --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index efe27170..33cfb1ff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -278,7 +278,7 @@ isort.required-imports = ["from __future__ import annotations"] "E402", # Allow imports to appear anywhere in Jupyter notebooks "I002", # Allow missing `from __future__ import annotations` import ] -"scripts/*" = ["T201"] +"scripts/**" = ["T201"] [tool.ruff.lint.pydocstyle] convention = "google" From 9f0693506aecf574146eed901247be378879d3bb Mon Sep 17 00:00:00 2001 From: lucas Date: Tue, 19 Nov 2024 16:09:02 +0100 Subject: [PATCH 66/79] add some docstrings --- .../stim_interface/max_sat_sinter_decoder.py | 2 +- .../python/cc_decoder/test_color_code_stim.py | 12 +- .../python/cc_decoder/test_dem_to_matrices.py | 29 +- .../cc_decoder/test_max_sat_stim_decoder.py | 316 +----------------- 4 files changed, 38 insertions(+), 321 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 559a6635..80875841 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -79,7 +79,7 @@ def compile_decoder_for_dem(self, *, dem: stim.DetectorErrorModel) -> CompiledDe ) return SinterCompiledDecoderMaxSat(maxsat, **self.maxsat_kwargs) - def decode_via_files( + def decode_via_files( # noqa: PLR6301 self, *, num_shots: int, # noqa: ARG002 diff --git a/test/python/cc_decoder/test_color_code_stim.py b/test/python/cc_decoder/test_color_code_stim.py index fb567431..a4eb370f 100644 --- a/test/python/cc_decoder/test_color_code_stim.py +++ b/test/python/cc_decoder/test_color_code_stim.py @@ -1,3 +1,4 @@ +""" tests for the color code stim decoder main functionality """ from __future__ import annotations from typing import TYPE_CHECKING @@ -19,6 +20,7 @@ @pytest.fixture def hamming_code() -> NDArray[bool]: + """ return hamming code parity check matrix. """ return np.array([ [True, True, False, True, True, False, False], [False, True, True, False, True, True, False], @@ -26,7 +28,8 @@ def hamming_code() -> NDArray[bool]: ]) -def test_gen_pcm_and_logical(hamming_code) -> None: +def test_gen_pcm_and_logical(hamming_code:NDArray[bool]) -> None: + """ test parity check matrix and logical matrix generation""" distance = 3 expected_logicals = {2, 5, 6} @@ -37,12 +40,14 @@ def test_gen_pcm_and_logical(hamming_code) -> None: def test_neighbours() -> None: + """ test neighbour computation for color code grid. """ input_perm = np.array([1, 2, 3]) expected = np.array([[2, 2, 2], [1, 3, 2], [0, 3, 3], [0, 2, 4], [1, 1, 4], [2, 1, 3]]) assert array_equal(expected, neighbors(input_perm)) -def test_add_checks_one_round(hamming_code) -> None: +def test_add_checks_one_round(hamming_code:NDArray[bool]) -> None: + """ test stim circuit generation for one stabilizer round """ expected_circuit = stim.Circuit() circuit = stim.Circuit() expected_circuit.append_from_stim_program_text("MPP Z0*Z1*Z3*Z4") @@ -51,7 +56,8 @@ def test_add_checks_one_round(hamming_code) -> None: assert expected_circuit == add_checks_one_round(hamming_code, circuit, False, 0) -def test_gen_stim_memory_experiment(hamming_code) -> None: +def test_gen_stim_memory_experiment(hamming_code:NDArray[bool]) -> None: + """ test generation of stim circuit for a memory experiment. """ expected_circuit = stim.Circuit() stim.Circuit() expected_circuit.append_from_stim_program_text("R 0 1 2 3 4 5 6") diff --git a/test/python/cc_decoder/test_dem_to_matrices.py b/test/python/cc_decoder/test_dem_to_matrices.py index 7fba10cd..e4975d7b 100644 --- a/test/python/cc_decoder/test_dem_to_matrices.py +++ b/test/python/cc_decoder/test_dem_to_matrices.py @@ -1,3 +1,4 @@ +""" testing detector error model (dem) to check matries glue code. """ from __future__ import annotations from typing import TYPE_CHECKING @@ -17,6 +18,7 @@ @pytest.fixture def dem_matrix() -> NDArray[NDArray[int]]: + """ return detector error model matrix for d=3 color code. """ return np.array([ [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], @@ -35,6 +37,7 @@ def dem_matrix() -> NDArray[NDArray[int]]: @pytest.fixture def hyperedges() -> dict[int, frozenset[int]]: + """ return adjacency dict of hyperedges for d=3 color code dem. """ return { 0: frozenset({0, 1, 2}), 1: frozenset({0, 1}), @@ -71,11 +74,13 @@ def hyperedges() -> dict[int, frozenset[int]]: @pytest.fixture def hypergraph_shape() -> tuple[int, int]: + """ return hypergraph shape for d=3 color code dem. """ return (12, 30) @pytest.fixture def priors() -> NDArray[np.float32]: + """ return list of priors for dem errors. """ return np.array([ 0.5, 0.5, @@ -112,6 +117,7 @@ def priors() -> NDArray[np.float32]: @pytest.fixture def hyperedge_to_edge_matrix() -> NDArray[NDArray[np.int32]]: + """ return hyperedge to edge matrix for dem. """ return np.array([ [ 0, @@ -982,11 +988,13 @@ def hyperedge_to_edge_matrix() -> NDArray[NDArray[np.int32]]: @pytest.fixture def edge_obsbl_matrix() -> NDArray[NDArray[np.int32]]: + """ return the edge observable matrix. """ return np.array([[1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0]]) @pytest.fixture def edge_check_matrix() -> NDArray[NDArray.np.int32]: + """ return the edge adjacency matrix. """ return np.array([ [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], @@ -1005,11 +1013,13 @@ def edge_check_matrix() -> NDArray[NDArray.np.int32]: @pytest.fixture def obsble_matrix() -> NDArray[NDArray[np.int32]]: + """ return the observable matrix""" return np.array([[0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0]]) @pytest.fixture def hamming_code() -> NDArray[bool]: + """ return hamming code check matrix. """ return np.array([ [True, True, False, True, True, False, False], [False, True, True, False, True, True, False], @@ -1019,6 +1029,7 @@ def hamming_code() -> NDArray[bool]: @pytest.fixture def detector_error_model() -> stim.DetectorErrorModel: + """ return d=3 color code dem. """ return stim.DetectorErrorModel(""" error(0.5) D0 D1 D2 error(0.5) D0 D1 L0 @@ -1323,21 +1334,23 @@ def detector_error_model() -> stim.DetectorErrorModel: def test_dict_to_csc_matrix( - hypergraph_shape, hyperedges: dict[int, frozenset[int]], dem_matrix: NDArray[NDArray[int]] + hypergraph_shape:Tuple[int,int], hyperedges: dict[int, frozenset[int]], dem_matrix: NDArray[NDArray[int]] ) -> None: + """ test the dictionary to sparse matrix function. """ result = dict_to_csc_matrix(hyperedges, hypergraph_shape).todense() assert array_equal(result, dem_matrix) def test_detector_error_model_to_check_matrices( - detector_error_model, - priors, - dem_matrix, - obsble_matrix, - edge_check_matrix, - edge_obsbl_matrix, - hyperedge_to_edge_matrix, + detector_error_model:stim.DetectorErrorModel, + priors:NDArray[np.float32], + dem_matrix:NDArray[NDArray[int]], + obsble_matrix:NDArray[NDArray[int]], + edge_check_matrix:NDArray[NDArray[int]], + edge_obsbl_matrix:NDArray[NDArray[int]], + hyperedge_to_edge_matrix:NDArray[NDArray[int]], ) -> None: + """ test dem to check matrices function. """ result = detector_error_model_to_check_matrices(detector_error_model, True) assert array_equal(result.priors, priors) assert array_equal(result.check_matrix.todense(), dem_matrix) diff --git a/test/python/cc_decoder/test_max_sat_stim_decoder.py b/test/python/cc_decoder/test_max_sat_stim_decoder.py index c86eeea7..2204e994 100644 --- a/test/python/cc_decoder/test_max_sat_stim_decoder.py +++ b/test/python/cc_decoder/test_max_sat_stim_decoder.py @@ -1,3 +1,4 @@ +""" test the max sat stim decoder integration. """ from __future__ import annotations from typing import TYPE_CHECKING @@ -13,320 +14,15 @@ @pytest.fixture def hamming_code() -> NDArray[bool]: + """ return the hamming code check matrix. """ return np.array([ [True, True, False, True, True, False, False], [False, True, True, False, True, True, False], [False, False, False, True, True, True, True], ]) - - -@pytest.fixture -def detector_error_model() -> stim.DetectorErrorModel: - return stim.DetectorErrorModel(""" - error(0.5) D0 D1 D2 - error(0.5) D0 D1 L0 - error(0.5) D0 D2 - error(0.5) D0 D3 - error(0.5) D0 L0 - error(0.5) D1 D2 - error(0.5) D1 D4 - error(0.5) D1 L0 - error(0.5) D2 - error(0.5) D2 D5 - error(0.5) D3 D4 D5 - error(0.5) D3 D4 L0 - error(0.5) D3 D5 - error(0.5) D3 D6 - error(0.5) D3 L0 - error(0.5) D4 D5 - error(0.5) D4 D7 - error(0.5) D4 L0 - error(0.5) D5 - error(0.5) D5 D8 - error(0.5) D6 D7 D8 - error(0.5) D6 D7 L0 - error(0.5) D6 D8 - error(0.5) D6 D9 - error(0.5) D6 L0 - error(0.5) D7 D8 - error(0.5) D7 D10 - error(0.5) D7 L0 - error(0.5) D8 - error(0.5) D8 D11 - error(0.5) D0 D1 D2 - error(0.5) D0 D1 L0 - error(0.5) D0 D2 - error(0.5) D0 D3 - error(0.5) D0 L0 - error(0.5) D1 D2 - error(0.5) D1 D4 - error(0.5) D1 L0 - error(0.5) D2 - error(0.5) D2 D5 - error(0.5) D3 D4 D5 - error(0.5) D3 D4 L0 - error(0.5) D3 D5 - error(0.5) D3 D6 - error(0.5) D3 L0 - error(0.5) D4 D5 - error(0.5) D4 D7 - error(0.5) D4 L0 - error(0.5) D5 - error(0.5) D5 D8 - error(0.5) D6 D7 D8 - error(0.5) D6 D7 L0 - error(0.5) D6 D8 - error(0.5) D6 D9 - error(0.5) D6 L0 - error(0.5) D7 D8 - error(0.5) D7 D10 - error(0.5) D7 L0 - error(0.5) D8 - error(0.5) D8 D11 - error(0.5) D0 D1 D2 - error(0.5) D0 D1 L0 - error(0.5) D0 D2 - error(0.5) D0 D3 - error(0.5) D0 L0 - error(0.5) D1 D2 - error(0.5) D1 D4 - error(0.5) D1 L0 - error(0.5) D2 - error(0.5) D2 D5 - error(0.5) D3 D4 D5 - error(0.5) D3 D4 L0 - error(0.5) D3 D5 - error(0.5) D3 D6 - error(0.5) D3 L0 - error(0.5) D4 D5 - error(0.5) D4 D7 - error(0.5) D4 L0 - error(0.5) D5 - error(0.5) D5 D8 - error(0.5) D6 D7 D8 - error(0.5) D6 D7 L0 - error(0.5) D6 D8 - error(0.5) D6 D9 - error(0.5) D6 L0 - error(0.5) D7 D8 - error(0.5) D7 D10 - error(0.5) D7 L0 - error(0.5) D8 - error(0.5) D8 D11 - error(0.5) D0 D1 D2 - error(0.5) D0 D1 L0 - error(0.5) D0 D2 - error(0.5) D0 D3 - error(0.5) D0 L0 - error(0.5) D1 D2 - error(0.5) D1 D4 - error(0.5) D1 L0 - error(0.5) D2 - error(0.5) D2 D5 - error(0.5) D3 D4 D5 - error(0.5) D3 D4 L0 - error(0.5) D3 D5 - error(0.5) D3 D6 - error(0.5) D3 L0 - error(0.5) D4 D5 - error(0.5) D4 D7 - error(0.5) D4 L0 - error(0.5) D5 - error(0.5) D5 D8 - error(0.5) D6 D7 D8 - error(0.5) D6 D7 L0 - error(0.5) D6 D8 - error(0.5) D6 D9 - error(0.5) D6 L0 - error(0.5) D7 D8 - error(0.5) D7 D10 - error(0.5) D7 L0 - error(0.5) D8 - error(0.5) D8 D11 - error(0.5) D0 D1 D2 - error(0.5) D0 D1 L0 - error(0.5) D0 D2 - error(0.5) D0 D3 - error(0.5) D0 L0 - error(0.5) D1 D2 - error(0.5) D1 D4 - error(0.5) D1 L0 - error(0.5) D2 - error(0.5) D2 D5 - error(0.5) D3 D4 D5 - error(0.5) D3 D4 L0 - error(0.5) D3 D5 - error(0.5) D3 D6 - error(0.5) D3 L0 - error(0.5) D4 D5 - error(0.5) D4 D7 - error(0.5) D4 L0 - error(0.5) D5 - error(0.5) D5 D8 - error(0.5) D6 D7 D8 - error(0.5) D6 D7 L0 - error(0.5) D6 D8 - error(0.5) D6 D9 - error(0.5) D6 L0 - error(0.5) D7 D8 - error(0.5) D7 D10 - error(0.5) D7 L0 - error(0.5) D8 - error(0.5) D8 D11 - error(0.5) D0 D1 D2 - error(0.5) D0 D1 L0 - error(0.5) D0 D2 - error(0.5) D0 D3 - error(0.5) D0 L0 - error(0.5) D1 D2 - error(0.5) D1 D4 - error(0.5) D1 L0 - error(0.5) D2 - error(0.5) D2 D5 - error(0.5) D3 D4 D5 - error(0.5) D3 D4 L0 - error(0.5) D3 D5 - error(0.5) D3 D6 - error(0.5) D3 L0 - error(0.5) D4 D5 - error(0.5) D4 D7 - error(0.5) D4 L0 - error(0.5) D5 - error(0.5) D5 D8 - error(0.5) D6 D7 D8 - error(0.5) D6 D7 L0 - error(0.5) D6 D8 - error(0.5) D6 D9 - error(0.5) D6 L0 - error(0.5) D7 D8 - error(0.5) D7 D10 - error(0.5) D7 L0 - error(0.5) D8 - error(0.5) D8 D11 - error(0.5) D0 D1 D2 - error(0.5) D0 D1 L0 - error(0.5) D0 D2 - error(0.5) D0 D3 - error(0.5) D0 L0 - error(0.5) D1 D2 - error(0.5) D1 D4 - error(0.5) D1 L0 - error(0.5) D2 - error(0.5) D2 D5 - error(0.5) D3 D4 D5 - error(0.5) D3 D4 L0 - error(0.5) D3 D5 - error(0.5) D3 D6 - error(0.5) D3 L0 - error(0.5) D4 D5 - error(0.5) D4 D7 - error(0.5) D4 L0 - error(0.5) D5 - error(0.5) D5 D8 - error(0.5) D6 D7 D8 - error(0.5) D6 D7 L0 - error(0.5) D6 D8 - error(0.5) D6 D9 - error(0.5) D6 L0 - error(0.5) D7 D8 - error(0.5) D7 D10 - error(0.5) D7 L0 - error(0.5) D8 - error(0.5) D8 D11 - error(0.5) D0 D1 D2 - error(0.5) D0 D1 L0 - error(0.5) D0 D2 - error(0.5) D0 D3 - error(0.5) D0 L0 - error(0.5) D1 D2 - error(0.5) D1 D4 - error(0.5) D1 L0 - error(0.5) D2 - error(0.5) D2 D5 - error(0.5) D3 D4 D5 - error(0.5) D3 D4 L0 - error(0.5) D3 D5 - error(0.5) D3 D6 - error(0.5) D3 L0 - error(0.5) D4 D5 - error(0.5) D4 D7 - error(0.5) D4 L0 - error(0.5) D5 - error(0.5) D5 D8 - error(0.5) D6 D7 D8 - error(0.5) D6 D7 L0 - error(0.5) D6 D8 - error(0.5) D6 D9 - error(0.5) D6 L0 - error(0.5) D7 D8 - error(0.5) D7 D10 - error(0.5) D7 L0 - error(0.5) D8 - error(0.5) D8 D11 - error(0.5) D0 D1 D2 - error(0.5) D0 D1 L0 - error(0.5) D0 D2 - error(0.5) D0 D3 - error(0.5) D0 L0 - error(0.5) D1 D2 - error(0.5) D1 D4 - error(0.5) D1 L0 - error(0.5) D2 - error(0.5) D2 D5 - error(0.5) D3 D4 D5 - error(0.5) D3 D4 L0 - error(0.5) D3 D5 - error(0.5) D3 D6 - error(0.5) D3 L0 - error(0.5) D4 D5 - error(0.5) D4 D7 - error(0.5) D4 L0 - error(0.5) D5 - error(0.5) D5 D8 - error(0.5) D6 D7 D8 - error(0.5) D6 D7 L0 - error(0.5) D6 D8 - error(0.5) D6 D9 - error(0.5) D6 L0 - error(0.5) D7 D8 - error(0.5) D7 D10 - error(0.5) D7 L0 - error(0.5) D8 - error(0.5) D8 D11 - error(0.5) D0 D1 D2 - error(0.5) D0 D1 L0 - error(0.5) D0 D2 - error(0.5) D0 D3 - error(0.5) D0 L0 - error(0.5) D1 D2 - error(0.5) D1 D4 - error(0.5) D1 L0 - error(0.5) D2 - error(0.5) D2 D5 - error(0.5) D3 D4 D5 - error(0.5) D3 D4 L0 - error(0.5) D3 D5 - error(0.5) D3 D6 - error(0.5) D3 L0 - error(0.5) D4 D5 - error(0.5) D4 D7 - error(0.5) D4 L0 - error(0.5) D5 - error(0.5) D5 D8 - error(0.5) D6 D7 D8 - error(0.5) D6 D7 L0 - error(0.5) D6 D8 - error(0.5) D6 D9 - error(0.5) D6 L0 - error(0.5) D7 D8 - error(0.5) D7 D10 - error(0.5) D7 L0 - error(0.5) D8 - error(0.5) D8 D11""") - - @pytest.fixture def detector_error_model() -> stim.DetectorErrorModel: + """ return d=3 color code dem. """ return stim.DetectorErrorModel(""" error(0.5) D0 D1 D2 error(0.5) D0 D1 L0 @@ -630,7 +326,8 @@ def detector_error_model() -> stim.DetectorErrorModel: error(0.5) D8 D11""") -def test_check_matrix_to_adj_lists(hamming_code) -> None: +def test_check_matrix_to_adj_lists(hamming_code:NDArray[bool]) -> None: + """ test the matrix to adjacency lists function. """ expected_qft = {0: [0], 1: [0, 1], 3: [0, 2], 4: [0, 1, 2], 2: [1], 5: [1, 2], 6: [2]} expected_ftq = {0: [0, 1, 3, 4], 1: [1, 2, 4, 5], 2: [3, 4, 5, 6]} qft, ftq = MaxSatStim.check_matrix_to_adj_lists(hamming_code) @@ -638,7 +335,8 @@ def test_check_matrix_to_adj_lists(hamming_code) -> None: assert expected_ftq == ftq -def test_decode_batch(detector_error_model) -> None: +def test_decode_batch(detector_error_model:stim.DetectorErrorModel) -> None: + """ test the batch decoding function integration. """ shots = np.array([[0, 0]]).astype(np.uint8) maxsatstim = MaxSatStim(detector_error_model) res_pred, res_conv, res_not_cong_cnt = maxsatstim.decode_batch( From eca979d1c81b019e2220b720054da4d062324db2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 19 Nov 2024 15:09:21 +0000 Subject: [PATCH 67/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stim_interface/max_sat_sinter_decoder.py | 2 +- .../python/cc_decoder/test_color_code_stim.py | 19 ++++---- .../python/cc_decoder/test_dem_to_matrices.py | 43 ++++++++++--------- .../cc_decoder/test_max_sat_stim_decoder.py | 17 +++++--- 4 files changed, 43 insertions(+), 38 deletions(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index 80875841..f97ea17e 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -79,7 +79,7 @@ def compile_decoder_for_dem(self, *, dem: stim.DetectorErrorModel) -> CompiledDe ) return SinterCompiledDecoderMaxSat(maxsat, **self.maxsat_kwargs) - def decode_via_files( # noqa: PLR6301 + def decode_via_files( # noqa: PLR6301 self, *, num_shots: int, # noqa: ARG002 diff --git a/test/python/cc_decoder/test_color_code_stim.py b/test/python/cc_decoder/test_color_code_stim.py index a4eb370f..a433d843 100644 --- a/test/python/cc_decoder/test_color_code_stim.py +++ b/test/python/cc_decoder/test_color_code_stim.py @@ -1,4 +1,5 @@ -""" tests for the color code stim decoder main functionality """ +"""tests for the color code stim decoder main functionality.""" + from __future__ import annotations from typing import TYPE_CHECKING @@ -20,7 +21,7 @@ @pytest.fixture def hamming_code() -> NDArray[bool]: - """ return hamming code parity check matrix. """ + """Return hamming code parity check matrix.""" return np.array([ [True, True, False, True, True, False, False], [False, True, True, False, True, True, False], @@ -28,8 +29,8 @@ def hamming_code() -> NDArray[bool]: ]) -def test_gen_pcm_and_logical(hamming_code:NDArray[bool]) -> None: - """ test parity check matrix and logical matrix generation""" +def test_gen_pcm_and_logical(hamming_code: NDArray[bool]) -> None: + """Test parity check matrix and logical matrix generation.""" distance = 3 expected_logicals = {2, 5, 6} @@ -40,14 +41,14 @@ def test_gen_pcm_and_logical(hamming_code:NDArray[bool]) -> None: def test_neighbours() -> None: - """ test neighbour computation for color code grid. """ + """Test neighbour computation for color code grid.""" input_perm = np.array([1, 2, 3]) expected = np.array([[2, 2, 2], [1, 3, 2], [0, 3, 3], [0, 2, 4], [1, 1, 4], [2, 1, 3]]) assert array_equal(expected, neighbors(input_perm)) -def test_add_checks_one_round(hamming_code:NDArray[bool]) -> None: - """ test stim circuit generation for one stabilizer round """ +def test_add_checks_one_round(hamming_code: NDArray[bool]) -> None: + """Test stim circuit generation for one stabilizer round.""" expected_circuit = stim.Circuit() circuit = stim.Circuit() expected_circuit.append_from_stim_program_text("MPP Z0*Z1*Z3*Z4") @@ -56,8 +57,8 @@ def test_add_checks_one_round(hamming_code:NDArray[bool]) -> None: assert expected_circuit == add_checks_one_round(hamming_code, circuit, False, 0) -def test_gen_stim_memory_experiment(hamming_code:NDArray[bool]) -> None: - """ test generation of stim circuit for a memory experiment. """ +def test_gen_stim_memory_experiment(hamming_code: NDArray[bool]) -> None: + """Test generation of stim circuit for a memory experiment.""" expected_circuit = stim.Circuit() stim.Circuit() expected_circuit.append_from_stim_program_text("R 0 1 2 3 4 5 6") diff --git a/test/python/cc_decoder/test_dem_to_matrices.py b/test/python/cc_decoder/test_dem_to_matrices.py index e4975d7b..7ddfdb46 100644 --- a/test/python/cc_decoder/test_dem_to_matrices.py +++ b/test/python/cc_decoder/test_dem_to_matrices.py @@ -1,4 +1,5 @@ -""" testing detector error model (dem) to check matries glue code. """ +"""testing detector error model (dem) to check matries glue code.""" + from __future__ import annotations from typing import TYPE_CHECKING @@ -18,7 +19,7 @@ @pytest.fixture def dem_matrix() -> NDArray[NDArray[int]]: - """ return detector error model matrix for d=3 color code. """ + """Return detector error model matrix for d=3 color code.""" return np.array([ [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], @@ -37,7 +38,7 @@ def dem_matrix() -> NDArray[NDArray[int]]: @pytest.fixture def hyperedges() -> dict[int, frozenset[int]]: - """ return adjacency dict of hyperedges for d=3 color code dem. """ + """Return adjacency dict of hyperedges for d=3 color code dem.""" return { 0: frozenset({0, 1, 2}), 1: frozenset({0, 1}), @@ -74,13 +75,13 @@ def hyperedges() -> dict[int, frozenset[int]]: @pytest.fixture def hypergraph_shape() -> tuple[int, int]: - """ return hypergraph shape for d=3 color code dem. """ + """Return hypergraph shape for d=3 color code dem.""" return (12, 30) @pytest.fixture def priors() -> NDArray[np.float32]: - """ return list of priors for dem errors. """ + """Return list of priors for dem errors.""" return np.array([ 0.5, 0.5, @@ -117,7 +118,7 @@ def priors() -> NDArray[np.float32]: @pytest.fixture def hyperedge_to_edge_matrix() -> NDArray[NDArray[np.int32]]: - """ return hyperedge to edge matrix for dem. """ + """Return hyperedge to edge matrix for dem.""" return np.array([ [ 0, @@ -988,13 +989,13 @@ def hyperedge_to_edge_matrix() -> NDArray[NDArray[np.int32]]: @pytest.fixture def edge_obsbl_matrix() -> NDArray[NDArray[np.int32]]: - """ return the edge observable matrix. """ + """Return the edge observable matrix.""" return np.array([[1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0]]) @pytest.fixture def edge_check_matrix() -> NDArray[NDArray.np.int32]: - """ return the edge adjacency matrix. """ + """Return the edge adjacency matrix.""" return np.array([ [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], @@ -1013,13 +1014,13 @@ def edge_check_matrix() -> NDArray[NDArray.np.int32]: @pytest.fixture def obsble_matrix() -> NDArray[NDArray[np.int32]]: - """ return the observable matrix""" + """Return the observable matrix.""" return np.array([[0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0]]) @pytest.fixture def hamming_code() -> NDArray[bool]: - """ return hamming code check matrix. """ + """Return hamming code check matrix.""" return np.array([ [True, True, False, True, True, False, False], [False, True, True, False, True, True, False], @@ -1029,7 +1030,7 @@ def hamming_code() -> NDArray[bool]: @pytest.fixture def detector_error_model() -> stim.DetectorErrorModel: - """ return d=3 color code dem. """ + """Return d=3 color code dem.""" return stim.DetectorErrorModel(""" error(0.5) D0 D1 D2 error(0.5) D0 D1 L0 @@ -1334,23 +1335,23 @@ def detector_error_model() -> stim.DetectorErrorModel: def test_dict_to_csc_matrix( - hypergraph_shape:Tuple[int,int], hyperedges: dict[int, frozenset[int]], dem_matrix: NDArray[NDArray[int]] + hypergraph_shape: Tuple[int, int], hyperedges: dict[int, frozenset[int]], dem_matrix: NDArray[NDArray[int]] ) -> None: - """ test the dictionary to sparse matrix function. """ + """Test the dictionary to sparse matrix function.""" result = dict_to_csc_matrix(hyperedges, hypergraph_shape).todense() assert array_equal(result, dem_matrix) def test_detector_error_model_to_check_matrices( - detector_error_model:stim.DetectorErrorModel, - priors:NDArray[np.float32], - dem_matrix:NDArray[NDArray[int]], - obsble_matrix:NDArray[NDArray[int]], - edge_check_matrix:NDArray[NDArray[int]], - edge_obsbl_matrix:NDArray[NDArray[int]], - hyperedge_to_edge_matrix:NDArray[NDArray[int]], + detector_error_model: stim.DetectorErrorModel, + priors: NDArray[np.float32], + dem_matrix: NDArray[NDArray[int]], + obsble_matrix: NDArray[NDArray[int]], + edge_check_matrix: NDArray[NDArray[int]], + edge_obsbl_matrix: NDArray[NDArray[int]], + hyperedge_to_edge_matrix: NDArray[NDArray[int]], ) -> None: - """ test dem to check matrices function. """ + """Test dem to check matrices function.""" result = detector_error_model_to_check_matrices(detector_error_model, True) assert array_equal(result.priors, priors) assert array_equal(result.check_matrix.todense(), dem_matrix) diff --git a/test/python/cc_decoder/test_max_sat_stim_decoder.py b/test/python/cc_decoder/test_max_sat_stim_decoder.py index 2204e994..ca5f897c 100644 --- a/test/python/cc_decoder/test_max_sat_stim_decoder.py +++ b/test/python/cc_decoder/test_max_sat_stim_decoder.py @@ -1,4 +1,5 @@ -""" test the max sat stim decoder integration. """ +"""test the max sat stim decoder integration.""" + from __future__ import annotations from typing import TYPE_CHECKING @@ -14,15 +15,17 @@ @pytest.fixture def hamming_code() -> NDArray[bool]: - """ return the hamming code check matrix. """ + """Return the hamming code check matrix.""" return np.array([ [True, True, False, True, True, False, False], [False, True, True, False, True, True, False], [False, False, False, True, True, True, True], ]) + + @pytest.fixture def detector_error_model() -> stim.DetectorErrorModel: - """ return d=3 color code dem. """ + """Return d=3 color code dem.""" return stim.DetectorErrorModel(""" error(0.5) D0 D1 D2 error(0.5) D0 D1 L0 @@ -326,8 +329,8 @@ def detector_error_model() -> stim.DetectorErrorModel: error(0.5) D8 D11""") -def test_check_matrix_to_adj_lists(hamming_code:NDArray[bool]) -> None: - """ test the matrix to adjacency lists function. """ +def test_check_matrix_to_adj_lists(hamming_code: NDArray[bool]) -> None: + """Test the matrix to adjacency lists function.""" expected_qft = {0: [0], 1: [0, 1], 3: [0, 2], 4: [0, 1, 2], 2: [1], 5: [1, 2], 6: [2]} expected_ftq = {0: [0, 1, 3, 4], 1: [1, 2, 4, 5], 2: [3, 4, 5, 6]} qft, ftq = MaxSatStim.check_matrix_to_adj_lists(hamming_code) @@ -335,8 +338,8 @@ def test_check_matrix_to_adj_lists(hamming_code:NDArray[bool]) -> None: assert expected_ftq == ftq -def test_decode_batch(detector_error_model:stim.DetectorErrorModel) -> None: - """ test the batch decoding function integration. """ +def test_decode_batch(detector_error_model: stim.DetectorErrorModel) -> None: + """Test the batch decoding function integration.""" shots = np.array([[0, 0]]).astype(np.uint8) maxsatstim = MaxSatStim(detector_error_model) res_pred, res_conv, res_not_cong_cnt = maxsatstim.decode_batch( From cf87d42432fd47e89d3905861eadd5bd7c9cf85a Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 20 Nov 2024 12:39:52 +0100 Subject: [PATCH 68/79] fix tuple include --- pyproject.toml | 2 +- test/python/cc_decoder/test_dem_to_matrices.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 33cfb1ff..798a2ce1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -278,7 +278,7 @@ isort.required-imports = ["from __future__ import annotations"] "E402", # Allow imports to appear anywhere in Jupyter notebooks "I002", # Allow missing `from __future__ import annotations` import ] -"scripts/**" = ["T201"] +"scripts/**" = ["T201","PTH", "FURB", "PERF"] [tool.ruff.lint.pydocstyle] convention = "google" diff --git a/test/python/cc_decoder/test_dem_to_matrices.py b/test/python/cc_decoder/test_dem_to_matrices.py index 7ddfdb46..eebbf0a7 100644 --- a/test/python/cc_decoder/test_dem_to_matrices.py +++ b/test/python/cc_decoder/test_dem_to_matrices.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Tuple import numpy as np import pytest From 610d2e916258b4ce2277b549a3c00cd240849559 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2024 11:40:14 +0000 Subject: [PATCH 69/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/python/cc_decoder/test_dem_to_matrices.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/python/cc_decoder/test_dem_to_matrices.py b/test/python/cc_decoder/test_dem_to_matrices.py index eebbf0a7..022b738c 100644 --- a/test/python/cc_decoder/test_dem_to_matrices.py +++ b/test/python/cc_decoder/test_dem_to_matrices.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Tuple +from typing import TYPE_CHECKING import numpy as np import pytest @@ -1335,7 +1335,7 @@ def detector_error_model() -> stim.DetectorErrorModel: def test_dict_to_csc_matrix( - hypergraph_shape: Tuple[int, int], hyperedges: dict[int, frozenset[int]], dem_matrix: NDArray[NDArray[int]] + hypergraph_shape: tuple[int, int], hyperedges: dict[int, frozenset[int]], dem_matrix: NDArray[NDArray[int]] ) -> None: """Test the dictionary to sparse matrix function.""" result = dict_to_csc_matrix(hyperedges, hypergraph_shape).todense() From fb7642e2a8655843ae87e86320c5561a65ce3c66 Mon Sep 17 00:00:00 2001 From: burgholzer Date: Mon, 25 Nov 2024 13:27:06 +0100 Subject: [PATCH 70/79] =?UTF-8?q?=F0=9F=94=92=20update=20lockfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: burgholzer --- uv.lock | 240 +++++++++++++++++++++++++++----------------------------- 1 file changed, 114 insertions(+), 126 deletions(-) diff --git a/uv.lock b/uv.lock index be41e373..a56d9371 100644 --- a/uv.lock +++ b/uv.lock @@ -402,71 +402,71 @@ wheels = [ [[package]] name = "coverage" -version = "7.6.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bf/68/26895f8b068e384b1ec9ab122565b913b735e6b4c618b3d265a280607edc/coverage-7.6.7.tar.gz", hash = "sha256:d79d4826e41441c9a118ff045e4bccb9fdbdcb1d02413e7ea6eb5c87b5439d24", size = 799938 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/c9/84898713e61208ddbe71b991d8f311d9ca175629ce5f1a46018acc643572/coverage-7.6.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:108bb458827765d538abcbf8288599fee07d2743357bdd9b9dad456c287e121e", size = 206875 }, - { url = "https://files.pythonhosted.org/packages/f0/69/7dfd65f0e284617f72d974f6dfedc7bc16f86172e5bc6ebc8b63430263f3/coverage-7.6.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c973b2fe4dc445cb865ab369df7521df9c27bf40715c837a113edaa2aa9faf45", size = 207307 }, - { url = "https://files.pythonhosted.org/packages/d1/ce/6e356b2bc751bdaadd77c714336b98ec45ccaf0cfe085b6b25d34f7cceb8/coverage-7.6.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c6b24007c4bcd0b19fac25763a7cac5035c735ae017e9a349b927cfc88f31c1", size = 235744 }, - { url = "https://files.pythonhosted.org/packages/35/49/a7ab3d5a507d32344994cab856784e8d603c0b698070f7667c3ae41e8e50/coverage-7.6.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acbb8af78f8f91b3b51f58f288c0994ba63c646bc1a8a22ad072e4e7e0a49f1c", size = 233645 }, - { url = "https://files.pythonhosted.org/packages/bd/41/de07328d2e79916fcc6cd53a5a1d18d163483519ab95f7f60fe15276811c/coverage-7.6.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad32a981bcdedb8d2ace03b05e4fd8dace8901eec64a532b00b15217d3677dd2", size = 234807 }, - { url = "https://files.pythonhosted.org/packages/e4/cc/2a669319b1295e0c52e8cfbbb163b32188b62f3b0bbe7014ef402b24b7cf/coverage-7.6.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:34d23e28ccb26236718a3a78ba72744212aa383141961dd6825f6595005c8b06", size = 233902 }, - { url = "https://files.pythonhosted.org/packages/68/71/a1bb90cb177358a2d364b3968a2069225f614d6824c3d959dee688ca0902/coverage-7.6.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e25bacb53a8c7325e34d45dddd2f2fbae0dbc230d0e2642e264a64e17322a777", size = 232363 }, - { url = "https://files.pythonhosted.org/packages/eb/dc/87551219d3437214523d1c7de0a717bead7a3369ed9bae05a7fd2854476f/coverage-7.6.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af05bbba896c4472a29408455fe31b3797b4d8648ed0a2ccac03e074a77e2314", size = 233493 }, - { url = "https://files.pythonhosted.org/packages/ca/a4/d74ae3a3fb9e55fe5d9b811ce68a6bd8df3ae0a92c336acbc00075bc24fa/coverage-7.6.7-cp310-cp310-win32.whl", hash = "sha256:796c9b107d11d2d69e1849b2dfe41730134b526a49d3acb98ca02f4985eeff7a", size = 209593 }, - { url = "https://files.pythonhosted.org/packages/77/cb/7984c4d0404e8fcc4ada226b240965ef056e7a20e61a18c9038bf88e7624/coverage-7.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:987a8e3da7da4eed10a20491cf790589a8e5e07656b6dc22d3814c4d88faf163", size = 210398 }, - { url = "https://files.pythonhosted.org/packages/c6/d7/1bf7bb0943237149ad01977190ac5c2e17add1f4fe7cabc06401682137f6/coverage-7.6.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e61b0e77ff4dddebb35a0e8bb5a68bf0f8b872407d8d9f0c726b65dfabe2469", size = 206979 }, - { url = "https://files.pythonhosted.org/packages/83/eb/863b2cd654353b94c6ad834008df813424bf3e8f110e5f655fe5dc4c423b/coverage-7.6.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a5407a75ca4abc20d6252efeb238377a71ce7bda849c26c7a9bece8680a5d99", size = 207431 }, - { url = "https://files.pythonhosted.org/packages/35/c9/d7a02a9654c41174fb99402c0fbd9583d0d2cb8714e7f948117fa7f919c4/coverage-7.6.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df002e59f2d29e889c37abd0b9ee0d0e6e38c24f5f55d71ff0e09e3412a340ec", size = 239368 }, - { url = "https://files.pythonhosted.org/packages/11/64/6c43a0ec43e5ddc5e09b0b589e3fd31def05fc463920d084e5af35fe527d/coverage-7.6.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:673184b3156cba06154825f25af33baa2671ddae6343f23175764e65a8c4c30b", size = 236769 }, - { url = "https://files.pythonhosted.org/packages/1c/dc/e77d98ae433c556c29328712a07fed0e6d159a63b2ec81039ce0a13a24a3/coverage-7.6.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e69ad502f1a2243f739f5bd60565d14a278be58be4c137d90799f2c263e7049a", size = 238634 }, - { url = "https://files.pythonhosted.org/packages/cc/84/50df3a8426d686057496171b4ccdb64528dacc4f42e94dceb7de3c598a69/coverage-7.6.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:60dcf7605c50ea72a14490d0756daffef77a5be15ed1b9fea468b1c7bda1bc3b", size = 237562 }, - { url = "https://files.pythonhosted.org/packages/2e/0f/9560196247574c1ccdab64cb923d69119fd5abd5b3db28d601ab2b452861/coverage-7.6.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9c2eb378bebb2c8f65befcb5147877fc1c9fbc640fc0aad3add759b5df79d55d", size = 236197 }, - { url = "https://files.pythonhosted.org/packages/df/14/38b7c081e86e845df1867143ddb6e05bf8395f60ab3923c023a56d97cca1/coverage-7.6.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c0317288f032221d35fa4cbc35d9f4923ff0dfd176c79c9b356e8ef8ef2dff4", size = 236970 }, - { url = "https://files.pythonhosted.org/packages/8b/f3/af34f814ca3814f798878ae368b638edb91298595470614f5265f3f416fa/coverage-7.6.7-cp311-cp311-win32.whl", hash = "sha256:951aade8297358f3618a6e0660dc74f6b52233c42089d28525749fc8267dccd2", size = 209557 }, - { url = "https://files.pythonhosted.org/packages/5a/9e/5d1080d83d752873bd9dedea5524c0f5fe68a3d5e1e58c590865bd724591/coverage-7.6.7-cp311-cp311-win_amd64.whl", hash = "sha256:5e444b8e88339a2a67ce07d41faabb1d60d1004820cee5a2c2b54e2d8e429a0f", size = 210402 }, - { url = "https://files.pythonhosted.org/packages/84/30/30e9df650b9038962c62d900b093a17414d5b43b4d07d47b8698d9e7ce26/coverage-7.6.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f07ff574986bc3edb80e2c36391678a271d555f91fd1d332a1e0f4b5ea4b6ea9", size = 207172 }, - { url = "https://files.pythonhosted.org/packages/88/8b/e28f86412317b9514692fd6f9d8ac6faa12494c3f470c3c63f202e10c756/coverage-7.6.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:49ed5ee4109258973630c1f9d099c7e72c5c36605029f3a91fe9982c6076c82b", size = 207406 }, - { url = "https://files.pythonhosted.org/packages/ac/46/da1bd9a3a893f74f5ce85f35e2755fcb00a80ed21e18d300c54f64938b1c/coverage-7.6.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3e8796434a8106b3ac025fd15417315d7a58ee3e600ad4dbcfddc3f4b14342c", size = 240424 }, - { url = "https://files.pythonhosted.org/packages/f6/12/af8e932496de1997bf4a36785d025ddac6427cbaf6954f26c2edaf21a58a/coverage-7.6.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3b925300484a3294d1c70f6b2b810d6526f2929de954e5b6be2bf8caa1f12c1", size = 237456 }, - { url = "https://files.pythonhosted.org/packages/60/a2/23eb11eb60f825a84397cb94701d6f41d2e8e88ad7d0ba2b4339f38435fb/coverage-7.6.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c42ec2c522e3ddd683dec5cdce8e62817afb648caedad9da725001fa530d354", size = 239527 }, - { url = "https://files.pythonhosted.org/packages/47/9e/63b318bc469308a32b0fbd6c80e2ea05dd7a2b7e840a46b3974843083a8c/coverage-7.6.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0266b62cbea568bd5e93a4da364d05de422110cbed5056d69339bd5af5685433", size = 239011 }, - { url = "https://files.pythonhosted.org/packages/99/47/1e84b067df3f021dfbc9cba09ec9acd4cb64938648a234e5bdf3006fd08b/coverage-7.6.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e5f2a0f161d126ccc7038f1f3029184dbdf8f018230af17ef6fd6a707a5b881f", size = 237316 }, - { url = "https://files.pythonhosted.org/packages/12/9d/96baaafc948d4a0ef2248a611d41051eea0917ef881d744879dd20be7c4a/coverage-7.6.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c132b5a22821f9b143f87446805e13580b67c670a548b96da945a8f6b4f2efbb", size = 238980 }, - { url = "https://files.pythonhosted.org/packages/87/d9/97af1886ca3f612d0cea2999d33e90d2f5b8fdf9bedc2d3bc75883efec4c/coverage-7.6.7-cp312-cp312-win32.whl", hash = "sha256:7c07de0d2a110f02af30883cd7dddbe704887617d5c27cf373362667445a4c76", size = 209801 }, - { url = "https://files.pythonhosted.org/packages/f8/4d/1e31c2018b1b3738154639f94188b1f54098fbf0f80c7ec104928576d0bb/coverage-7.6.7-cp312-cp312-win_amd64.whl", hash = "sha256:fd49c01e5057a451c30c9b892948976f5d38f2cbd04dc556a82743ba8e27ed8c", size = 210587 }, - { url = "https://files.pythonhosted.org/packages/21/87/c590d0c7eeb884995d9d06b429c5e88e9fcd65d3a6a686d9476cb50b72a9/coverage-7.6.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:46f21663e358beae6b368429ffadf14ed0a329996248a847a4322fb2e35d64d3", size = 207199 }, - { url = "https://files.pythonhosted.org/packages/40/ee/c88473c4f69c952f4425fabe045cb78d2027634ce50c9d7f7987d389b604/coverage-7.6.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40cca284c7c310d622a1677f105e8507441d1bb7c226f41978ba7c86979609ab", size = 207454 }, - { url = "https://files.pythonhosted.org/packages/b8/07/afda6e10c50e3a8c21020c5c1d1b4f3d7eff1c190305cef2962adf8de018/coverage-7.6.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77256ad2345c29fe59ae861aa11cfc74579c88d4e8dbf121cbe46b8e32aec808", size = 239971 }, - { url = "https://files.pythonhosted.org/packages/85/43/bd1934b75e31f2a49665be6a6b7f8bfaff7266ba19721bdb90239f5e9ed7/coverage-7.6.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87ea64b9fa52bf395272e54020537990a28078478167ade6c61da7ac04dc14bc", size = 237119 }, - { url = "https://files.pythonhosted.org/packages/2b/19/7a70458c1624724086195b40628e91bc5b9ca180cdfefcc778285c49c7b2/coverage-7.6.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d608a7808793e3615e54e9267519351c3ae204a6d85764d8337bd95993581a8", size = 239109 }, - { url = "https://files.pythonhosted.org/packages/f3/2c/3dee671415ff13c05ca68243b2264fc95a5eea57697cffa7986b68b8f608/coverage-7.6.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdd94501d65adc5c24f8a1a0eda110452ba62b3f4aeaba01e021c1ed9cb8f34a", size = 238769 }, - { url = "https://files.pythonhosted.org/packages/37/ad/e0d1228638711aeacacc98d1197af6226b6d062d12c81a6bcc17d3234533/coverage-7.6.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:82c809a62e953867cf57e0548c2b8464207f5f3a6ff0e1e961683e79b89f2c55", size = 236854 }, - { url = "https://files.pythonhosted.org/packages/90/95/6467e9d9765a63c7f142703a7f212f6af114bd73a6c1cffeb7ad7f003a86/coverage-7.6.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb684694e99d0b791a43e9fc0fa58efc15ec357ac48d25b619f207c41f2fd384", size = 238701 }, - { url = "https://files.pythonhosted.org/packages/b2/7a/fc11a163f0fd6ce8539d0f1b565873fe6903b900214ff71b5d80d16154c3/coverage-7.6.7-cp313-cp313-win32.whl", hash = "sha256:963e4a08cbb0af6623e61492c0ec4c0ec5c5cf74db5f6564f98248d27ee57d30", size = 209865 }, - { url = "https://files.pythonhosted.org/packages/f2/91/58be3a56efff0c3481e48e2caa56d5d6f3c5c8d385bf4adbecdfd85484b0/coverage-7.6.7-cp313-cp313-win_amd64.whl", hash = "sha256:14045b8bfd5909196a90da145a37f9d335a5d988a83db34e80f41e965fb7cb42", size = 210597 }, - { url = "https://files.pythonhosted.org/packages/34/7e/fed983809c2eccb09c5ddccfdb08efb7f2dd1ae3454dabf1c92c5a2e9946/coverage-7.6.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f2c7a045eef561e9544359a0bf5784b44e55cefc7261a20e730baa9220c83413", size = 207944 }, - { url = "https://files.pythonhosted.org/packages/c7/e0/2c1a157986a3927c3920e8e3938a3fdf33ea22b6f371dc3b679f13f619e2/coverage-7.6.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dd4e4a49d9c72a38d18d641135d2fb0bdf7b726ca60a103836b3d00a1182acd", size = 208215 }, - { url = "https://files.pythonhosted.org/packages/35/2f/77b086b228f6443ae5499467d1629c7428925b390cd171350c403bc00f14/coverage-7.6.7-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c95e0fa3d1547cb6f021ab72f5c23402da2358beec0a8e6d19a368bd7b0fb37", size = 250930 }, - { url = "https://files.pythonhosted.org/packages/60/d8/2ffea937d89ee328fc6e47c2515b890735bdf3f195d507d1c78b5fa96939/coverage-7.6.7-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f63e21ed474edd23f7501f89b53280014436e383a14b9bd77a648366c81dce7b", size = 246647 }, - { url = "https://files.pythonhosted.org/packages/b2/81/efbb3b00a7f7eb5f54a3b3b9f19b26d770a0b7d3870d651f07d2451c5504/coverage-7.6.7-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead9b9605c54d15be228687552916c89c9683c215370c4a44f1f217d2adcc34d", size = 249006 }, - { url = "https://files.pythonhosted.org/packages/eb/91/ce36990cbefaf7909e96c888ed4d83f3471fc1be3273a5beda10896cde0f/coverage-7.6.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0573f5cbf39114270842d01872952d301027d2d6e2d84013f30966313cadb529", size = 248500 }, - { url = "https://files.pythonhosted.org/packages/75/3f/b8c87dfdd96276870fb4abc7e2957cba7d20d8a435fcd816d807869ec833/coverage-7.6.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:e2c8e3384c12dfa19fa9a52f23eb091a8fad93b5b81a41b14c17c78e23dd1d8b", size = 246388 }, - { url = "https://files.pythonhosted.org/packages/a0/51/62273e1d5c25bb8fbef5fbbadc75b4a3e08c11b80516d0a97c25e5cced5b/coverage-7.6.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:70a56a2ec1869e6e9fa69ef6b76b1a8a7ef709972b9cc473f9ce9d26b5997ce3", size = 247669 }, - { url = "https://files.pythonhosted.org/packages/75/e5/d7772e56a7eace80e98ac39f2756d4b690fc0ce2384418174e02519a26a8/coverage-7.6.7-cp313-cp313t-win32.whl", hash = "sha256:dbba8210f5067398b2c4d96b4e64d8fb943644d5eb70be0d989067c8ca40c0f8", size = 210510 }, - { url = "https://files.pythonhosted.org/packages/2d/12/f2666e4e36b43221391ffcd971ab0c50e19439c521c2c87cd7e0b49ddba2/coverage-7.6.7-cp313-cp313t-win_amd64.whl", hash = "sha256:dfd14bcae0c94004baba5184d1c935ae0d1231b8409eb6c103a5fd75e8ecdc56", size = 211660 }, - { url = "https://files.pythonhosted.org/packages/4c/3d/5ee1ccc37d39e4c06194492e15cd6327d0a85b6c4f14c112fd19b65dc6a7/coverage-7.6.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37a15573f988b67f7348916077c6d8ad43adb75e478d0910957394df397d2874", size = 206870 }, - { url = "https://files.pythonhosted.org/packages/c2/91/cfdf3c9f4c141d2172b5abd9631853144537d4849d00d08eff2b7e3a8318/coverage-7.6.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b6cce5c76985f81da3769c52203ee94722cd5d5889731cd70d31fee939b74bf0", size = 207305 }, - { url = "https://files.pythonhosted.org/packages/0f/67/6b0460017083bd9330d2d74e3b5aff3e85f9918c96ae8eae8135a262cc34/coverage-7.6.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ab9763d291a17b527ac6fd11d1a9a9c358280adb320e9c2672a97af346ac2c", size = 235338 }, - { url = "https://files.pythonhosted.org/packages/92/59/0c3a8a3f5ef007862774cb8d25580ba8cc3a60e79d2e0798efb117eaea7b/coverage-7.6.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cf96ceaa275f071f1bea3067f8fd43bec184a25a962c754024c973af871e1b7", size = 233259 }, - { url = "https://files.pythonhosted.org/packages/cd/fc/68d19fb8688d976cb0da7713ca632ca5a5423c92aeae377161d9b888bb38/coverage-7.6.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee9cf6b0134d6f932d219ce253ef0e624f4fa588ee64830fcba193269e4daa3", size = 234387 }, - { url = "https://files.pythonhosted.org/packages/9d/8a/e76da4084c59420f4f9fac8a5d4b08f0281774f56375c59e76e27eafdb8d/coverage-7.6.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2bc3e45c16564cc72de09e37413262b9f99167803e5e48c6156bccdfb22c8327", size = 233539 }, - { url = "https://files.pythonhosted.org/packages/61/b7/cc00329039500147d3b5724ca412e6b5b8124da7c2865b673a09f04e71fa/coverage-7.6.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:623e6965dcf4e28a3debaa6fcf4b99ee06d27218f46d43befe4db1c70841551c", size = 232021 }, - { url = "https://files.pythonhosted.org/packages/a1/af/1710b65f590d52c9c5f1a238142feb2ef1ff61915fa41531b372e920bee3/coverage-7.6.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:850cfd2d6fc26f8346f422920ac204e1d28814e32e3a58c19c91980fa74d8289", size = 233013 }, - { url = "https://files.pythonhosted.org/packages/fc/99/32773e1f26cbfe11a0cadc4a4163a2249f04e83f0b8def93d85c572d0628/coverage-7.6.7-cp39-cp39-win32.whl", hash = "sha256:c296263093f099da4f51b3dff1eff5d4959b527d4f2f419e16508c5da9e15e8c", size = 209597 }, - { url = "https://files.pythonhosted.org/packages/d7/ef/4b86263d312da7df483a84b69b4e0575fd777fb673fbef95a4df8a68a07c/coverage-7.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:90746521206c88bdb305a4bf3342b1b7316ab80f804d40c536fc7d329301ee13", size = 210367 }, - { url = "https://files.pythonhosted.org/packages/e1/ec/dc663f7d34651aca74a531d10800595d9ec28a78b8306705721900b17a23/coverage-7.6.7-pp39.pp310-none-any.whl", hash = "sha256:0ddcb70b3a3a57581b450571b31cb774f23eb9519c2aaa6176d3a84c9fc57671", size = 199113 }, +version = "7.6.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/75/aecfd0a3adbec6e45753976bc2a9fed62b42cea9a206d10fd29244a77953/coverage-7.6.8.tar.gz", hash = "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc", size = 801425 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/86/6ed22e101badc8eedf181f0c2f65500df5929c44c79991cf45b9bf741424/coverage-7.6.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50", size = 206988 }, + { url = "https://files.pythonhosted.org/packages/3b/04/16853c58bacc02b3ff5405193dfc6c66632442d931b23dd7b9452dc55cf3/coverage-7.6.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf", size = 207418 }, + { url = "https://files.pythonhosted.org/packages/f8/eb/8a91520d04215eb549d6a7d7d3a79cbb1d78b5dd0814f4b23bf97521d580/coverage-7.6.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee", size = 235860 }, + { url = "https://files.pythonhosted.org/packages/00/10/bf1ede5b54ae1bbf39921a5dd4cc84aee79041ed301ec8955064785ddb90/coverage-7.6.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6", size = 233766 }, + { url = "https://files.pythonhosted.org/packages/5c/ea/741d9233eb502906e0d18ccf4c15c4fb74ff0e85fd8ee967590194b889a1/coverage-7.6.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d", size = 234924 }, + { url = "https://files.pythonhosted.org/packages/18/43/b2cfd4413a5b64ab27c289228b0c45b4527d1b99381cc9d6a00bfd515da4/coverage-7.6.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331", size = 234019 }, + { url = "https://files.pythonhosted.org/packages/8e/95/8b2fbb9d1a79277963b6095cd51a90fb7088cd3618faf75550038331f78b/coverage-7.6.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638", size = 232481 }, + { url = "https://files.pythonhosted.org/packages/4d/d7/9e939508a39ef67605b715ca89c6522214aceb27c2db9152ae3ae1cf8626/coverage-7.6.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed", size = 233609 }, + { url = "https://files.pythonhosted.org/packages/ba/e2/1c5fb52eafcffeebaa9db084bff47e7c3cf4f97db752226c232cee4d530b/coverage-7.6.8-cp310-cp310-win32.whl", hash = "sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e", size = 209669 }, + { url = "https://files.pythonhosted.org/packages/31/31/6a56469609a252549dd4b090815428d5521edd4642440d987573a450c069/coverage-7.6.8-cp310-cp310-win_amd64.whl", hash = "sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a", size = 210509 }, + { url = "https://files.pythonhosted.org/packages/ab/9f/e98211980f6e2f439e251737482aa77906c9b9c507824c71a2ce7eea0402/coverage-7.6.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4", size = 207093 }, + { url = "https://files.pythonhosted.org/packages/fd/c7/8bab83fb9c20f7f8163c5a20dcb62d591b906a214a6dc6b07413074afc80/coverage-7.6.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94", size = 207536 }, + { url = "https://files.pythonhosted.org/packages/1e/d6/00243df625f1b282bb25c83ce153ae2c06f8e7a796a8d833e7235337b4d9/coverage-7.6.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4", size = 239482 }, + { url = "https://files.pythonhosted.org/packages/1e/07/faf04b3eeb55ffc2a6f24b65dffe6e0359ec3b283e6efb5050ea0707446f/coverage-7.6.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1", size = 236886 }, + { url = "https://files.pythonhosted.org/packages/43/23/c79e497bf4d8fcacd316bebe1d559c765485b8ec23ac4e23025be6bfce09/coverage-7.6.8-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb", size = 238749 }, + { url = "https://files.pythonhosted.org/packages/b5/e5/791bae13be3c6451e32ef7af1192e711c6a319f3c597e9b218d148fd0633/coverage-7.6.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8", size = 237679 }, + { url = "https://files.pythonhosted.org/packages/05/c6/bbfdfb03aada601fb8993ced17468c8c8e0b4aafb3097026e680fabb7ce1/coverage-7.6.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a", size = 236317 }, + { url = "https://files.pythonhosted.org/packages/67/f9/f8e5a4b2ce96d1b0e83ae6246369eb8437001dc80ec03bb51c87ff557cd8/coverage-7.6.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0", size = 237084 }, + { url = "https://files.pythonhosted.org/packages/f0/70/b05328901e4debe76e033717e1452d00246c458c44e9dbd893e7619c2967/coverage-7.6.8-cp311-cp311-win32.whl", hash = "sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801", size = 209638 }, + { url = "https://files.pythonhosted.org/packages/70/55/1efa24f960a2fa9fbc44a9523d3f3c50ceb94dd1e8cd732168ab2dc41b07/coverage-7.6.8-cp311-cp311-win_amd64.whl", hash = "sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9", size = 210506 }, + { url = "https://files.pythonhosted.org/packages/76/ce/3edf581c8fe429ed8ced6e6d9ac693c25975ef9093413276dab6ed68a80a/coverage-7.6.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee", size = 207285 }, + { url = "https://files.pythonhosted.org/packages/09/9c/cf102ab046c9cf8895c3f7aadcde6f489a4b2ec326757e8c6e6581829b5e/coverage-7.6.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a", size = 207522 }, + { url = "https://files.pythonhosted.org/packages/39/06/42aa6dd13dbfca72e1fd8ffccadbc921b6e75db34545ebab4d955d1e7ad3/coverage-7.6.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d", size = 240543 }, + { url = "https://files.pythonhosted.org/packages/a0/20/2932971dc215adeca8eeff446266a7fef17a0c238e881ffedebe7bfa0669/coverage-7.6.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb", size = 237577 }, + { url = "https://files.pythonhosted.org/packages/ac/85/4323ece0cd5452c9522f4b6e5cc461e6c7149a4b1887c9e7a8b1f4e51146/coverage-7.6.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649", size = 239646 }, + { url = "https://files.pythonhosted.org/packages/77/52/b2537487d8f36241e518e84db6f79e26bc3343b14844366e35b090fae0d4/coverage-7.6.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787", size = 239128 }, + { url = "https://files.pythonhosted.org/packages/7c/99/7f007762012186547d0ecc3d328da6b6f31a8c99f05dc1e13dcd929918cd/coverage-7.6.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c", size = 237434 }, + { url = "https://files.pythonhosted.org/packages/97/53/e9b5cf0682a1cab9352adfac73caae0d77ae1d65abc88975d510f7816389/coverage-7.6.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443", size = 239095 }, + { url = "https://files.pythonhosted.org/packages/0c/50/054f0b464fbae0483217186478eefa2e7df3a79917ed7f1d430b6da2cf0d/coverage-7.6.8-cp312-cp312-win32.whl", hash = "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad", size = 209895 }, + { url = "https://files.pythonhosted.org/packages/df/d0/09ba870360a27ecf09e177ca2ff59d4337fc7197b456f22ceff85cffcfa5/coverage-7.6.8-cp312-cp312-win_amd64.whl", hash = "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4", size = 210684 }, + { url = "https://files.pythonhosted.org/packages/9a/84/6f0ccf94a098ac3d6d6f236bd3905eeac049a9e0efcd9a63d4feca37ac4b/coverage-7.6.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb", size = 207313 }, + { url = "https://files.pythonhosted.org/packages/db/2b/e3b3a3a12ebec738c545897ac9f314620470fcbc368cdac88cf14974ba20/coverage-7.6.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63", size = 207574 }, + { url = "https://files.pythonhosted.org/packages/db/c0/5bf95d42b6a8d21dfce5025ce187f15db57d6460a59b67a95fe8728162f1/coverage-7.6.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365", size = 240090 }, + { url = "https://files.pythonhosted.org/packages/57/b8/d6fd17d1a8e2b0e1a4e8b9cb1f0f261afd422570735899759c0584236916/coverage-7.6.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002", size = 237237 }, + { url = "https://files.pythonhosted.org/packages/d4/e4/a91e9bb46809c8b63e68fc5db5c4d567d3423b6691d049a4f950e38fbe9d/coverage-7.6.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3", size = 239225 }, + { url = "https://files.pythonhosted.org/packages/31/9c/9b99b0591ec4555b7292d271e005f27b465388ce166056c435b288db6a69/coverage-7.6.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022", size = 238888 }, + { url = "https://files.pythonhosted.org/packages/a6/85/285c2df9a04bc7c31f21fd9d4a24d19e040ec5e2ff06e572af1f6514c9e7/coverage-7.6.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e", size = 236974 }, + { url = "https://files.pythonhosted.org/packages/cb/a1/95ec8522206f76cdca033bf8bb61fff56429fb414835fc4d34651dfd29fc/coverage-7.6.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b", size = 238815 }, + { url = "https://files.pythonhosted.org/packages/8d/ac/687e9ba5e6d0979e9dab5c02e01c4f24ac58260ef82d88d3b433b3f84f1e/coverage-7.6.8-cp313-cp313-win32.whl", hash = "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146", size = 209957 }, + { url = "https://files.pythonhosted.org/packages/2f/a3/b61cc8e3fcf075293fb0f3dee405748453c5ba28ac02ceb4a87f52bdb105/coverage-7.6.8-cp313-cp313-win_amd64.whl", hash = "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28", size = 210711 }, + { url = "https://files.pythonhosted.org/packages/ee/4b/891c8b9acf1b62c85e4a71dac142ab9284e8347409b7355de02e3f38306f/coverage-7.6.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d", size = 208053 }, + { url = "https://files.pythonhosted.org/packages/18/a9/9e330409b291cc002723d339346452800e78df1ce50774ca439ade1d374f/coverage-7.6.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451", size = 208329 }, + { url = "https://files.pythonhosted.org/packages/9c/0d/33635fd429f6589c6e1cdfc7bf581aefe4c1792fbff06383f9d37f59db60/coverage-7.6.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764", size = 251052 }, + { url = "https://files.pythonhosted.org/packages/23/32/8a08da0e46f3830bbb9a5b40614241b2e700f27a9c2889f53122486443ed/coverage-7.6.8-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf", size = 246765 }, + { url = "https://files.pythonhosted.org/packages/56/3f/3b86303d2c14350fdb1c6c4dbf9bc76000af2382f42ca1d4d99c6317666e/coverage-7.6.8-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5", size = 249125 }, + { url = "https://files.pythonhosted.org/packages/36/cb/c4f081b9023f9fd8646dbc4ef77be0df090263e8f66f4ea47681e0dc2cff/coverage-7.6.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4", size = 248615 }, + { url = "https://files.pythonhosted.org/packages/32/ee/53bdbf67760928c44b57b2c28a8c0a4bf544f85a9ee129a63ba5c78fdee4/coverage-7.6.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83", size = 246507 }, + { url = "https://files.pythonhosted.org/packages/57/49/5a57910bd0af6d8e802b4ca65292576d19b54b49f81577fd898505dee075/coverage-7.6.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b", size = 247785 }, + { url = "https://files.pythonhosted.org/packages/bd/37/e450c9f6b297c79bb9858407396ed3e084dcc22990dd110ab01d5ceb9770/coverage-7.6.8-cp313-cp313t-win32.whl", hash = "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71", size = 210605 }, + { url = "https://files.pythonhosted.org/packages/44/79/7d0c7dd237c6905018e2936cd1055fe1d42e7eba2ebab3c00f4aad2a27d7/coverage-7.6.8-cp313-cp313t-win_amd64.whl", hash = "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc", size = 211777 }, + { url = "https://files.pythonhosted.org/packages/2e/db/5c7008bcd8858c2dea02702ef0fee761f23780a6be7cd1292840f3e165b1/coverage-7.6.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e", size = 206983 }, + { url = "https://files.pythonhosted.org/packages/1c/30/e1be5b6802baa55967e83bdf57bd51cd2763b72cdc591a90aa0b465fffee/coverage-7.6.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c", size = 207422 }, + { url = "https://files.pythonhosted.org/packages/f6/df/19c0e12f9f7b976cd7b92ae8200d26f5b6cd3f322d17ac7b08d48fbf5bc5/coverage-7.6.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0", size = 235455 }, + { url = "https://files.pythonhosted.org/packages/e8/7a/a80b0c4fb48e8bce92bcfe3908e47e6c7607fb8f618a4e0de78218e42d9b/coverage-7.6.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779", size = 233376 }, + { url = "https://files.pythonhosted.org/packages/8c/0e/1a4ecee734d70b78fc458ff611707f804605721467ef45fc1f1a684772ad/coverage-7.6.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92", size = 234509 }, + { url = "https://files.pythonhosted.org/packages/24/42/6eadd73adc0163cb18dee4fef80baefeb3faa11a1e217a2db80e274e784d/coverage-7.6.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4", size = 233659 }, + { url = "https://files.pythonhosted.org/packages/68/5f/10b825f39ecfe6fc5ee3120205daaa0950443948f0d0a538430f386fdf58/coverage-7.6.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc", size = 232138 }, + { url = "https://files.pythonhosted.org/packages/56/72/ad92bdad934de103e19a128a349ef4a0560892fd33d62becb1140885e44c/coverage-7.6.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea", size = 233131 }, + { url = "https://files.pythonhosted.org/packages/f4/1d/d61d9b2d17628c4db834e9650b776663535b4258d0dc204ec475188b5b2a/coverage-7.6.8-cp39-cp39-win32.whl", hash = "sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e", size = 209695 }, + { url = "https://files.pythonhosted.org/packages/0f/d1/ef43852a998c41183dbffed4ab0dd658f9975d570c6106ea43fdcb5dcbf4/coverage-7.6.8-cp39-cp39-win_amd64.whl", hash = "sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076", size = 210475 }, + { url = "https://files.pythonhosted.org/packages/32/df/0d2476121cd0bfb9ca2413efe02289c474b82c4b134863bef4b89ec7bcfa/coverage-7.6.8-pp39.pp310-none-any.whl", hash = "sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce", size = 199230 }, ] [package.optional-dependencies] @@ -485,31 +485,31 @@ wheels = [ [[package]] name = "debugpy" -version = "1.8.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/5e/7667b95c9d7ddb25c047143a3a47685f9be2a5d3d177a85a730b22dc6e5c/debugpy-1.8.8.zip", hash = "sha256:e6355385db85cbd666be703a96ab7351bc9e6c61d694893206f8001e22aee091", size = 4928684 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/77/79/677d71c342d5f24baf81d262c9e0c19cac3b17b4e4587c0574eaa3964ab1/debugpy-1.8.8-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:e59b1607c51b71545cb3496876544f7186a7a27c00b436a62f285603cc68d1c6", size = 2088337 }, - { url = "https://files.pythonhosted.org/packages/11/b3/4119fa89b66bcc64a3b186ea52ee7c22bccc5d1765ee890887678b0e3e76/debugpy-1.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6531d952b565b7cb2fbd1ef5df3d333cf160b44f37547a4e7cf73666aca5d8d", size = 3567953 }, - { url = "https://files.pythonhosted.org/packages/e8/4a/01f70b44af27c13d720446ce9bf14467c90411e90e6c6ffbb7c45845d23d/debugpy-1.8.8-cp310-cp310-win32.whl", hash = "sha256:b01f4a5e5c5fb1d34f4ccba99a20ed01eabc45a4684f4948b5db17a319dfb23f", size = 5128658 }, - { url = "https://files.pythonhosted.org/packages/2b/a5/c4210f3842db0911a49b3030bfc217e0772bfd33d7aa50996bc762e8a334/debugpy-1.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:535f4fb1c024ddca5913bb0eb17880c8f24ba28aa2c225059db145ee557035e9", size = 5157545 }, - { url = "https://files.pythonhosted.org/packages/38/55/6b5596ea6d5490e17abc2896f1fbe83d31205a22629805daccd30686721c/debugpy-1.8.8-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:c399023146e40ae373753a58d1be0a98bf6397fadc737b97ad612886b53df318", size = 2187057 }, - { url = "https://files.pythonhosted.org/packages/3f/f7/c2ee07f6335c3620c1435aef2c4d3d4853f6b7fb0789aa2c52a84498ef90/debugpy-1.8.8-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09cc7b162586ea2171eea055985da2702b0723f6f907a423c9b2da5996ad67ba", size = 3139844 }, - { url = "https://files.pythonhosted.org/packages/0d/68/01d335338b68bdebab11de573f4631c7bf0404666ccbf474621123497702/debugpy-1.8.8-cp311-cp311-win32.whl", hash = "sha256:eea8821d998ebeb02f0625dd0d76839ddde8cbf8152ebbe289dd7acf2cdc6b98", size = 5049405 }, - { url = "https://files.pythonhosted.org/packages/22/1d/3f69460b4b8f01dace3882513de71a446eb37ee57fe2112be948fadebde8/debugpy-1.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:d4483836da2a533f4b1454dffc9f668096ac0433de855f0c22cdce8c9f7e10c4", size = 5075025 }, - { url = "https://files.pythonhosted.org/packages/c2/04/8e79824c4d9100049bda056aeaf8f2765d1325a4521a87f8bb373c977236/debugpy-1.8.8-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:0cc94186340be87b9ac5a707184ec8f36547fb66636d1029ff4f1cc020e53996", size = 2514549 }, - { url = "https://files.pythonhosted.org/packages/a5/6b/c336d1eba1aedc9f654aefcdfe47ec41657d149f28ca1477c5f9009681c6/debugpy-1.8.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64674e95916e53c2e9540a056e5f489e0ad4872645399d778f7c598eacb7b7f9", size = 4229617 }, - { url = "https://files.pythonhosted.org/packages/63/9c/d9276c41e9e14164b31bcba789c87a355c091d0fc2d4e4e36a4881c9aa54/debugpy-1.8.8-cp312-cp312-win32.whl", hash = "sha256:5c6e885dbf12015aed73770f29dec7023cb310d0dc2ba8bfbeb5c8e43f80edc9", size = 5167033 }, - { url = "https://files.pythonhosted.org/packages/6d/1c/fd4bc22196b2d0defaa9f644ea4d676d0cb53b6434091b5fa2d4e49c85f2/debugpy-1.8.8-cp312-cp312-win_amd64.whl", hash = "sha256:19ffbd84e757a6ca0113574d1bf5a2298b3947320a3e9d7d8dc3377f02d9f864", size = 5209968 }, - { url = "https://files.pythonhosted.org/packages/90/45/6745f342bbf41bde7eb5dbf5567b794a4a5498a7a729146cb3101b875b30/debugpy-1.8.8-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:705cd123a773d184860ed8dae99becd879dfec361098edbefb5fc0d3683eb804", size = 2499523 }, - { url = "https://files.pythonhosted.org/packages/5c/39/0374610062a384648db9b7b315d0c906facf23613bfd19527135a7c0a420/debugpy-1.8.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890fd16803f50aa9cb1a9b9b25b5ec321656dd6b78157c74283de241993d086f", size = 4218219 }, - { url = "https://files.pythonhosted.org/packages/cc/19/5b8a68eb9bbafd6bfd27ba0ed93d411f3fd50935ecdd2df242de2110a7c9/debugpy-1.8.8-cp313-cp313-win32.whl", hash = "sha256:90244598214bbe704aa47556ec591d2f9869ff9e042e301a2859c57106649add", size = 5171845 }, - { url = "https://files.pythonhosted.org/packages/cd/04/7381dab68e40ca877d5beffc25ad1a0d3d2557cf7465405435fac9e27ef5/debugpy-1.8.8-cp313-cp313-win_amd64.whl", hash = "sha256:4b93e4832fd4a759a0c465c967214ed0c8a6e8914bced63a28ddb0dd8c5f078b", size = 5206890 }, - { url = "https://files.pythonhosted.org/packages/3d/c8/7b1b654f7c21bac0e77272ee503b00f75e8acc8753efa542d4495591c741/debugpy-1.8.8-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:53709d4ec586b525724819dc6af1a7703502f7e06f34ded7157f7b1f963bb854", size = 2089581 }, - { url = "https://files.pythonhosted.org/packages/2d/87/57eb80944ce75f383946d79d9dd3ff0e0cd7c737f446be11661e3b963fbf/debugpy-1.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a9c013077a3a0000e83d97cf9cc9328d2b0bbb31f56b0e99ea3662d29d7a6a2", size = 3562815 }, - { url = "https://files.pythonhosted.org/packages/45/e1/23f65fbf5564cd8b3f126ab4a82c8a1a4728bdfd1b7fb0e2a856f794790e/debugpy-1.8.8-cp39-cp39-win32.whl", hash = "sha256:ffe94dd5e9a6739a75f0b85316dc185560db3e97afa6b215628d1b6a17561cb2", size = 5121656 }, - { url = "https://files.pythonhosted.org/packages/7c/f8/751ea54bb878fe965010d0492776671a7aab045937118b356027235e59ce/debugpy-1.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5c0e5a38c7f9b481bf31277d2f74d2109292179081f11108e668195ef926c0f9", size = 5175678 }, - { url = "https://files.pythonhosted.org/packages/03/99/ec2190d03df5dbd610418919bd1c3d8e6f61d0a97894e11ade6d3260cfb8/debugpy-1.8.8-py2.py3-none-any.whl", hash = "sha256:ec684553aba5b4066d4de510859922419febc710df7bba04fe9e7ef3de15d34f", size = 5157124 }, +version = "1.8.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/88/92/15b454c516c4c53cc8c03967e4be12b65a1ea36db3bb4513a7453f75c8d8/debugpy-1.8.9.zip", hash = "sha256:1339e14c7d980407248f09824d1b25ff5c5616651689f1e0f0e51bdead3ea13e", size = 4921695 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/2e/92fda96b1b773e454daae3e2962726dd9f7aedb1f26d7f2ca353d91a930b/debugpy-1.8.9-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:cfe1e6c6ad7178265f74981edf1154ffce97b69005212fbc90ca22ddfe3d017e", size = 2080529 }, + { url = "https://files.pythonhosted.org/packages/87/c0/d13cdbae394c7ae65ef93d7ccde2ff364445248e367bda93fc0650c08849/debugpy-1.8.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada7fb65102a4d2c9ab62e8908e9e9f12aed9d76ef44880367bc9308ebe49a0f", size = 3565151 }, + { url = "https://files.pythonhosted.org/packages/23/40/237c0a7a68cb982dcced4a0199b7c464630f75b9280d6bebde32490135d1/debugpy-1.8.9-cp310-cp310-win32.whl", hash = "sha256:c36856343cbaa448171cba62a721531e10e7ffb0abff838004701454149bc037", size = 5117068 }, + { url = "https://files.pythonhosted.org/packages/00/89/e0be9f01ee461e3369dde418492244acb1b67adaf04cb5ea98f1380ab101/debugpy-1.8.9-cp310-cp310-win_amd64.whl", hash = "sha256:17c5e0297678442511cf00a745c9709e928ea4ca263d764e90d233208889a19e", size = 5149364 }, + { url = "https://files.pythonhosted.org/packages/f7/bf/c41b688ad490d644b3bcca505a87ea58ec0442234def9a641ba62dce9c11/debugpy-1.8.9-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:b74a49753e21e33e7cf030883a92fa607bddc4ede1aa4145172debc637780040", size = 2179080 }, + { url = "https://files.pythonhosted.org/packages/f4/dd/e9de11423db7bde62469fbd932243c64f66d6d87924976f49ec336415522/debugpy-1.8.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62d22dacdb0e296966d7d74a7141aaab4bec123fa43d1a35ddcb39bf9fd29d70", size = 3137893 }, + { url = "https://files.pythonhosted.org/packages/2c/bf/e1f2c81220591728f35585b4abd67e71e9b39b3cb983f428b23d4ca6c22e/debugpy-1.8.9-cp311-cp311-win32.whl", hash = "sha256:8138efff315cd09b8dcd14226a21afda4ca582284bf4215126d87342bba1cc66", size = 5042644 }, + { url = "https://files.pythonhosted.org/packages/96/20/a407252954fd2812771e4ea3ab523f73889fd5027e305dec5ee4f0af149a/debugpy-1.8.9-cp311-cp311-win_amd64.whl", hash = "sha256:ff54ef77ad9f5c425398efb150239f6fe8e20c53ae2f68367eba7ece1e96226d", size = 5066943 }, + { url = "https://files.pythonhosted.org/packages/da/ab/1420baf8404d2b499349a44de5037133e06d489009032ce016fedb66eea1/debugpy-1.8.9-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:957363d9a7a6612a37458d9a15e72d03a635047f946e5fceee74b50d52a9c8e2", size = 2504180 }, + { url = "https://files.pythonhosted.org/packages/58/ec/e0f88c6764314bda7887274e0b980812709b3d6363dcae124a49a9ceaa3c/debugpy-1.8.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e565fc54b680292b418bb809f1386f17081d1346dca9a871bf69a8ac4071afe", size = 4224563 }, + { url = "https://files.pythonhosted.org/packages/dd/49/d9ea004ee2e4531d2b528841689ee2ba01c6a4b58840efd15e57dd866a86/debugpy-1.8.9-cp312-cp312-win32.whl", hash = "sha256:3e59842d6c4569c65ceb3751075ff8d7e6a6ada209ceca6308c9bde932bcef11", size = 5163641 }, + { url = "https://files.pythonhosted.org/packages/b1/63/c8b0718024c1187a446316037680e1564bf063c6665c815f17b42c244aba/debugpy-1.8.9-cp312-cp312-win_amd64.whl", hash = "sha256:66eeae42f3137eb428ea3a86d4a55f28da9bd5a4a3d369ba95ecc3a92c1bba53", size = 5203862 }, + { url = "https://files.pythonhosted.org/packages/cc/8d/eb12dcb977a2d166aac6614e60daddd1eef72881a0343717d7deb0d4868c/debugpy-1.8.9-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:957ecffff80d47cafa9b6545de9e016ae8c9547c98a538ee96ab5947115fb3dd", size = 2489077 }, + { url = "https://files.pythonhosted.org/packages/87/2b/3b7a00d8d2bb891cfa33240575c2d5fc3fa6e0bc75567f4ece59b9d3d6ea/debugpy-1.8.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1efbb3ff61487e2c16b3e033bc8595aea578222c08aaf3c4bf0f93fadbd662ee", size = 4219198 }, + { url = "https://files.pythonhosted.org/packages/5f/a1/f489026a65fabfff8c73bd51b880c130d636e02b1847564141fe3957d94f/debugpy-1.8.9-cp313-cp313-win32.whl", hash = "sha256:7c4d65d03bee875bcb211c76c1d8f10f600c305dbd734beaed4077e902606fee", size = 5163014 }, + { url = "https://files.pythonhosted.org/packages/e6/84/6070908dd163121358eb9d76fcc94f05bc99d2f89a85fe1b86167bc34ec6/debugpy-1.8.9-cp313-cp313-win_amd64.whl", hash = "sha256:e46b420dc1bea64e5bbedd678148be512442bc589b0111bd799367cde051e71a", size = 5203529 }, + { url = "https://files.pythonhosted.org/packages/54/15/dee8442113909afa027deec443b75e55e8476c13608621e636b5a3888bf7/debugpy-1.8.9-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:7e8b079323a56f719977fde9d8115590cb5e7a1cba2fcee0986ef8817116e7c1", size = 2081714 }, + { url = "https://files.pythonhosted.org/packages/50/bd/1a90c7800a4e2ddb30beec175e2537a008e863801ccc5747ace42703c60c/debugpy-1.8.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6953b335b804a41f16a192fa2e7851bdcfd92173cbb2f9f777bb934f49baab65", size = 3560386 }, + { url = "https://files.pythonhosted.org/packages/a6/88/17d62d82a9b62f4ae433d03718e55a432ddc5bd7ee8000734a607856b23c/debugpy-1.8.9-cp39-cp39-win32.whl", hash = "sha256:7e646e62d4602bb8956db88b1e72fe63172148c1e25c041e03b103a25f36673c", size = 5117926 }, + { url = "https://files.pythonhosted.org/packages/36/75/072d69872357b57a6f5c454486fb78595f5d13b04a9b78a073ed70b9fa87/debugpy-1.8.9-cp39-cp39-win_amd64.whl", hash = "sha256:3d9755e77a2d680ce3d2c5394a444cf42be4a592caaf246dbfbdd100ffcf7ae5", size = 5150203 }, + { url = "https://files.pythonhosted.org/packages/2d/23/3f5804202da11c950dc0caae4a62d0c9aadabdb2daeb5f7aa09838647b5d/debugpy-1.8.9-py2.py3-none-any.whl", hash = "sha256:cc37a6c9987ad743d9c3a14fa1b1a14b7e4e6041f9dd0c8abf8895fe7a97b899", size = 5166094 }, ] [[package]] @@ -1203,7 +1203,7 @@ wheels = [ [[package]] name = "mqt-qecc" -version = "1.8.3.dev8+g033066f" +version = "1.8.2.dev116+g610d2e9.d20241125" source = { editable = "." } dependencies = [ { name = "bposd" }, @@ -2281,9 +2281,9 @@ wheels = [ [[package]] name = "rpds-py" -version = "0.20.1" +version = "0.21.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/25/cb/8e919951f55d109d658f81c9b49d0cc3b48637c50792c5d2e77032b8c5da/rpds_py-0.20.1.tar.gz", hash = "sha256:e1791c4aabd117653530dccd24108fa03cc6baf21f58b950d0a73c3b3b29a350", size = 25931 } +sdist = { url = "https://files.pythonhosted.org/packages/23/80/afdf96daf9b27d61483ef05b38f282121db0e38f5fd4e89f40f5c86c2a4f/rpds_py-0.21.0.tar.gz", hash = "sha256:ed6378c9d66d0de903763e7706383d60c33829581f0adff47b6535f1802fa6db", size = 26335 } wheels = [ { url = "https://files.pythonhosted.org/packages/4c/a4/91747f902f166c589f1753cbd8bda713aceb75817c8bb597058a38aa85e6/rpds_py-0.21.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a017f813f24b9df929674d0332a374d40d7f0162b326562daae8066b502d0590", size = 327473 }, { url = "https://files.pythonhosted.org/packages/8a/72/75a30a07f96ae210e732c50c7339e742945fdc83661e65a1c80fcf39ceea/rpds_py-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:20cc1ed0bcc86d8e1a7e968cce15be45178fd16e2ff656a243145e0b439bd250", size = 318359 }, @@ -2449,11 +2449,11 @@ wheels = [ [[package]] name = "setuptools" -version = "75.5.0" +version = "75.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c8/db/722a42ffdc226e950c4757b3da7b56ff5c090bb265dccd707f7b8a3c6fee/setuptools-75.5.0.tar.gz", hash = "sha256:5c4ccb41111392671f02bb5f8436dfc5a9a7185e80500531b133f5775c4163ef", size = 1336032 } +sdist = { url = "https://files.pythonhosted.org/packages/43/54/292f26c208734e9a7f067aea4a7e282c080750c4546559b58e2e45413ca0/setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6", size = 1337429 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/df/88ccbee85aefbca071db004fdc8f8d2507d55d5a9dc27ebb93c92edb1bd8/setuptools-75.5.0-py3-none-any.whl", hash = "sha256:87cb777c3b96d638ca02031192d40390e0ad97737e27b6b4fa831bea86f2f829", size = 1222710 }, + { url = "https://files.pythonhosted.org/packages/55/21/47d163f615df1d30c094f6c8bbb353619274edccf0327b185cc2493c2c33/setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d", size = 1224032 }, ] [[package]] @@ -2480,18 +2480,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/e9/e58082fbb8cecbb6fb4133033c40cc50c248b1a331582be3a0f39138d65b/simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38", size = 15762 }, ] -[[package]] -name = "sinter" -version = "1.14.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "matplotlib" }, - { name = "numpy" }, - { name = "scipy" }, - { name = "stim" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cf/47/4968b5c570d03c116c475b18420cfe8d2ae15a2449016d6852e3f92a131f/sinter-1.14.0.tar.gz", hash = "sha256:b40498d9bb7752e28a18bcc06875b34f45befc9f957d7c51c240a37124e8c4d3", size = 174330 } - [[package]] name = "six" version = "1.16.0" @@ -2683,14 +2671,14 @@ wheels = [ [[package]] name = "stevedore" -version = "5.3.0" +version = "5.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pbr" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c4/59/f8aefa21020054f553bf7e3b405caec7f8d1f432d9cb47e34aaa244d8d03/stevedore-5.3.0.tar.gz", hash = "sha256:9a64265f4060312828151c204efbe9b7a9852a0d9228756344dbc7e4023e375a", size = 513768 } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e9/4eedccff8332cc40cc60ddd3b28d4c3e255ee7e9c65679fa4533ab98f598/stevedore-5.4.0.tar.gz", hash = "sha256:79e92235ecb828fe952b6b8b0c6c87863248631922c8e8e0fa5b17b232c4514d", size = 513899 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/50/70762bdb23f6c2b746b90661f461d33c4913a22a46bb5265b10947e85ffb/stevedore-5.3.0-py3-none-any.whl", hash = "sha256:1efd34ca08f474dad08d9b19e934a22c68bb6fe416926479ba29e5013bcc8f78", size = 49661 }, + { url = "https://files.pythonhosted.org/packages/8f/73/d0091d22a65b55e8fb6aca7b3b6713b5a261dd01cec4cfd28ed127ac0cfc/stevedore-5.4.0-py3-none-any.whl", hash = "sha256:b0be3c4748b3ea7b854b265dcb4caa891015e442416422be16f8b31756107857", size = 49534 }, ] [[package]] @@ -2798,32 +2786,32 @@ wheels = [ [[package]] name = "tornado" -version = "6.4.1" +version = "6.4.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/66/398ac7167f1c7835406888a386f6d0d26ee5dbf197d8a571300be57662d3/tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9", size = 500623 } +sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135 } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/d9/c33be3c1a7564f7d42d87a8d186371a75fd142097076767a5c27da941fef/tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8", size = 435924 }, - { url = "https://files.pythonhosted.org/packages/2e/0f/721e113a2fac2f1d7d124b3279a1da4c77622e104084f56119875019ffab/tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14", size = 433883 }, - { url = "https://files.pythonhosted.org/packages/13/cf/786b8f1e6fe1c7c675e79657448178ad65e41c1c9765ef82e7f6f765c4c5/tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4", size = 437224 }, - { url = "https://files.pythonhosted.org/packages/e4/8e/a6ce4b8d5935558828b0f30f3afcb2d980566718837b3365d98e34f6067e/tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842", size = 436597 }, - { url = "https://files.pythonhosted.org/packages/22/d4/54f9d12668b58336bd30defe0307e6c61589a3e687b05c366f804b7faaf0/tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3", size = 436797 }, - { url = "https://files.pythonhosted.org/packages/cf/3f/2c792e7afa7dd8b24fad7a2ed3c2f24a5ec5110c7b43a64cb6095cc106b8/tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f", size = 437516 }, - { url = "https://files.pythonhosted.org/packages/71/63/c8fc62745e669ac9009044b889fc531b6f88ac0f5f183cac79eaa950bb23/tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4", size = 436958 }, - { url = "https://files.pythonhosted.org/packages/94/d4/f8ac1f5bd22c15fad3b527e025ce219bd526acdbd903f52053df2baecc8b/tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698", size = 436882 }, - { url = "https://files.pythonhosted.org/packages/4b/3e/a8124c21cc0bbf144d7903d2a0cadab15cadaf683fa39a0f92bc567f0d4d/tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d", size = 438092 }, - { url = "https://files.pythonhosted.org/packages/d9/2f/3f2f05e84a7aff787a96d5fb06821323feb370fe0baed4db6ea7b1088f32/tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7", size = 438532 }, + { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299 }, + { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253 }, + { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602 }, + { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972 }, + { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173 }, + { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892 }, + { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334 }, + { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261 }, + { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463 }, + { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 }, ] [[package]] name = "tqdm" -version = "4.67.0" +version = "4.67.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "platform_system == 'Windows'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e8/4f/0153c21dc5779a49a0598c445b1978126b1344bab9ee71e53e44877e14e0/tqdm-4.67.0.tar.gz", hash = "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a", size = 169739 } +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/78/57043611a16c655c8350b4c01b8d6abfb38cc2acb475238b62c2146186d7/tqdm-4.67.0-py3-none-any.whl", hash = "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be", size = 78590 }, + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, ] [[package]] From f004891e95cef505ec12d933985aa32ce13a4c25 Mon Sep 17 00:00:00 2001 From: burgholzer Date: Mon, 25 Nov 2024 13:27:31 +0100 Subject: [PATCH 71/79] =?UTF-8?q?=F0=9F=8E=A8=20remove=20uncommented=20cod?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: burgholzer --- scripts/cc_decoder/run_color_code_phenomenological_noise.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/scripts/cc_decoder/run_color_code_phenomenological_noise.py b/scripts/cc_decoder/run_color_code_phenomenological_noise.py index 6a4052e6..4561986d 100644 --- a/scripts/cc_decoder/run_color_code_phenomenological_noise.py +++ b/scripts/cc_decoder/run_color_code_phenomenological_noise.py @@ -11,9 +11,6 @@ from mqt.qecc.cc_decoder.stim_interface.color_code_stim import gen_pcm_and_logical, gen_stim_circuit_memory_experiment from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import sinter_decoders -# from mqt.qecc.cc_decoder.stim_interface.color_code_stim import gen_pcm_and_logical, gen_stim_circuit_memory_experiment -# from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import sinter_decoders - def generate_example_tasks() -> Any: # noqa: ANN401 """Generate example stim tasks.""" From 330830c1ac755ad8967a31d1f3095bfa829c5e19 Mon Sep 17 00:00:00 2001 From: burgholzer Date: Mon, 25 Nov 2024 13:28:05 +0100 Subject: [PATCH 72/79] =?UTF-8?q?=F0=9F=9A=A8=20remove=20lint=20ignores=20?= =?UTF-8?q?and=20fix=20warnings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: burgholzer --- pyproject.toml | 2 +- scripts/cc_decoder/plotting/plot_convergence_rate.ipynb | 9 +++------ scripts/cc_decoder/plotting/plot_pseudothresholds.ipynb | 4 ++-- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 798a2ce1..33cfb1ff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -278,7 +278,7 @@ isort.required-imports = ["from __future__ import annotations"] "E402", # Allow imports to appear anywhere in Jupyter notebooks "I002", # Allow missing `from __future__ import annotations` import ] -"scripts/**" = ["T201","PTH", "FURB", "PERF"] +"scripts/**" = ["T201"] [tool.ruff.lint.pydocstyle] convention = "google" diff --git a/scripts/cc_decoder/plotting/plot_convergence_rate.ipynb b/scripts/cc_decoder/plotting/plot_convergence_rate.ipynb index aef9c358..4270f244 100644 --- a/scripts/cc_decoder/plotting/plot_convergence_rate.ipynb +++ b/scripts/cc_decoder/plotting/plot_convergence_rate.ipynb @@ -6,14 +6,13 @@ "metadata": {}, "outputs": [], "source": [ - "import locale\n", - "import os\n", "from collections import defaultdict\n", + "from pathlib import Path\n", "\n", "import matplotlib.pyplot as plt\n", "from matplotlib import ticker\n", "\n", - "with open(f\"{os.getcwd()}/convergence_rate.txt\", encoding=locale.getpreferredencoding(False)) as file:\n", + "with Path(f\"{Path.cwd()}/convergence_rate.txt\", encoding=\"utf-8\").open(encoding=\"utf-8\") as file:\n", " content = file.read()\n", "\n", "convergence_rate_dict = defaultdict(lambda: defaultdict(int))\n", @@ -29,10 +28,8 @@ "outputs": [], "source": [ "for d in convergence_rate_dict:\n", - " pers = []\n", " convergence_rates = []\n", - " for per in convergence_rate_dict[d]:\n", - " pers.append(per)\n", + " pers = list(convergence_rate_dict[d])\n", " pers.sort()\n", "\n", " for per in pers:\n", diff --git a/scripts/cc_decoder/plotting/plot_pseudothresholds.ipynb b/scripts/cc_decoder/plotting/plot_pseudothresholds.ipynb index 1f62d6fe..26c46e17 100644 --- a/scripts/cc_decoder/plotting/plot_pseudothresholds.ipynb +++ b/scripts/cc_decoder/plotting/plot_pseudothresholds.ipynb @@ -6,13 +6,13 @@ "metadata": {}, "outputs": [], "source": [ - "import os\n", + "from pathlib import Path\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import sinter\n", "\n", - "samples = sinter.read_stats_from_csv_files(f\"{os.getcwd()}/pseudothreshold_plot.csv\")" + "samples = sinter.read_stats_from_csv_files(f\"{Path.cwd()}/pseudothreshold_plot.csv\")" ] }, { From 8f87743a22d17c9510564d80d42fc41a5453fe75 Mon Sep 17 00:00:00 2001 From: lucas Date: Thu, 5 Dec 2024 15:27:04 +0100 Subject: [PATCH 73/79] sinter tests --- pyproject.toml | 3 +- .../run_color_code_phenomenological_noise.py | 5 +- .../stim_interface/max_sat_sinter_decoder.py | 6 +- .../cc_decoder/max_sat_sinter_decoder.py | 335 ++++++++++++++++++ 4 files changed, 341 insertions(+), 8 deletions(-) create mode 100644 test/python/cc_decoder/max_sat_sinter_decoder.py diff --git a/pyproject.toml b/pyproject.toml index 33cfb1ff..6de3b733 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,7 +58,8 @@ dependencies = [ "pymatching>=2.2.1", "qsample>=0.0.2", "urllib3>=1.26.20,<2.0", # Required by qsample - "fastcore>=1.7.10" # Required by qsample (to be removed) + "fastcore>=1.7.10", # Required by qsample (to be removed) + "sinter" ] dynamic = ["version"] diff --git a/scripts/cc_decoder/run_color_code_phenomenological_noise.py b/scripts/cc_decoder/run_color_code_phenomenological_noise.py index 4561986d..017bdb83 100644 --- a/scripts/cc_decoder/run_color_code_phenomenological_noise.py +++ b/scripts/cc_decoder/run_color_code_phenomenological_noise.py @@ -11,11 +11,10 @@ from mqt.qecc.cc_decoder.stim_interface.color_code_stim import gen_pcm_and_logical, gen_stim_circuit_memory_experiment from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import sinter_decoders - def generate_example_tasks() -> Any: # noqa: ANN401 """Generate example stim tasks.""" - for p in np.arange(0.001, 0.03, 0.001): - for d in [3, 4, 5]: + for p in np.arange(0.001, 0.005, 0.002): + for d in [3]: pcm, l_op = gen_pcm_and_logical(d) cc_circuit = gen_stim_circuit_memory_experiment(pcm, l_op, d, p) yield sinter.Task( diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py index f97ea17e..f6db014c 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_sinter_decoder.py @@ -9,7 +9,7 @@ import stim from sinter import CompiledDecoder, Decoder -from .max_sat_stim_decoder import MaxSatStim +from mqt.qecc.cc_decoder.stim_interface.max_sat_stim_decoder import MaxSatStim if TYPE_CHECKING: import numpy as np @@ -34,7 +34,6 @@ def __init__(self, decoder: MaxSatStim, **kwargs: dict[str, Any]) -> None: def decode_shots_bit_packed( self, - *, bit_packed_detection_event_data: NDArray[NDArray[np.uint8]], ) -> NDArray[np.uint8]: """Decode bitpacked shots from sinter simulation using batch decoder.""" @@ -71,7 +70,7 @@ def __init__( """Init sinter decoder with kwargs.""" self.maxsat_kwargs = maxsat_kwargs - def compile_decoder_for_dem(self, *, dem: stim.DetectorErrorModel) -> CompiledDecoder: + def compile_decoder_for_dem(self, dem: stim.DetectorErrorModel) -> CompiledDecoder: """Return sinter compiled decoder initialized with the given DEM.""" maxsat = MaxSatStim( model=dem, @@ -81,7 +80,6 @@ def compile_decoder_for_dem(self, *, dem: stim.DetectorErrorModel) -> CompiledDe def decode_via_files( # noqa: PLR6301 self, - *, num_shots: int, # noqa: ARG002 num_dets: int, # noqa: ARG002 num_obs: int, # noqa: ARG002 diff --git a/test/python/cc_decoder/max_sat_sinter_decoder.py b/test/python/cc_decoder/max_sat_sinter_decoder.py new file mode 100644 index 00000000..273a0dde --- /dev/null +++ b/test/python/cc_decoder/max_sat_sinter_decoder.py @@ -0,0 +1,335 @@ +"""tests for the color code stim decoder main functionality.""" + +from __future__ import annotations +import pytest +from mqt.qecc.cc_decoder.stim_interface.max_sat_stim_decoder import MaxSatStim +import numpy as np +from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import SinterCompiledDecoderMaxSat +from numpy.core.numeric import array_equal + +import stim + +from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import SinterDecoderMaxSat + + +@pytest.fixture +def detector_error_model() -> stim.DetectorErrorModel: + """Return d=3 color code dem.""" + return stim.DetectorErrorModel(""" + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11 + error(0.5) D0 D1 D2 + error(0.5) D0 D1 L0 + error(0.5) D0 D2 + error(0.5) D0 D3 + error(0.5) D0 L0 + error(0.5) D1 D2 + error(0.5) D1 D4 + error(0.5) D1 L0 + error(0.5) D2 + error(0.5) D2 D5 + error(0.5) D3 D4 D5 + error(0.5) D3 D4 L0 + error(0.5) D3 D5 + error(0.5) D3 D6 + error(0.5) D3 L0 + error(0.5) D4 D5 + error(0.5) D4 D7 + error(0.5) D4 L0 + error(0.5) D5 + error(0.5) D5 D8 + error(0.5) D6 D7 D8 + error(0.5) D6 D7 L0 + error(0.5) D6 D8 + error(0.5) D6 D9 + error(0.5) D6 L0 + error(0.5) D7 D8 + error(0.5) D7 D10 + error(0.5) D7 L0 + error(0.5) D8 + error(0.5) D8 D11""") + +def test_decode_shots_bit_packed(detector_error_model:stim.DetectorErrorModel) -> None: + bit_packed_shots = np.array([[0,0]]).astype(np.uint8) + max_sat_stim = MaxSatStim(detector_error_model) + sinter_decoder = SinterCompiledDecoderMaxSat(max_sat_stim) + result = sinter_decoder.decode_shots_bit_packed(bit_packed_shots) + + assert len(result) == 1 + assert result[0][0] == 1 or result[0][0] + +def test_decode_via_files(detector_error_model:stim.DetectorErrorModel) -> None: + decoder = SinterDecoderMaxSat() + result = decoder.compile_decoder_for_dem(detector_error_model) + assert result.decoder is not None + assert result.decoder.num_detectors == detector_error_model.num_detectors + assert result.decoder.observables.shape == (1,30) + assert len(result.decoder.problem.helper_vars) == detector_error_model.num_detectors \ No newline at end of file From b75d0129ad08a68825454203719d0c7f84566ad0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 5 Dec 2024 14:28:01 +0000 Subject: [PATCH 74/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../run_color_code_phenomenological_noise.py | 1 + .../cc_decoder/max_sat_sinter_decoder.py | 22 +++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/scripts/cc_decoder/run_color_code_phenomenological_noise.py b/scripts/cc_decoder/run_color_code_phenomenological_noise.py index 017bdb83..3987d9db 100644 --- a/scripts/cc_decoder/run_color_code_phenomenological_noise.py +++ b/scripts/cc_decoder/run_color_code_phenomenological_noise.py @@ -11,6 +11,7 @@ from mqt.qecc.cc_decoder.stim_interface.color_code_stim import gen_pcm_and_logical, gen_stim_circuit_memory_experiment from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import sinter_decoders + def generate_example_tasks() -> Any: # noqa: ANN401 """Generate example stim tasks.""" for p in np.arange(0.001, 0.005, 0.002): diff --git a/test/python/cc_decoder/max_sat_sinter_decoder.py b/test/python/cc_decoder/max_sat_sinter_decoder.py index 273a0dde..2d3660d3 100644 --- a/test/python/cc_decoder/max_sat_sinter_decoder.py +++ b/test/python/cc_decoder/max_sat_sinter_decoder.py @@ -1,15 +1,13 @@ """tests for the color code stim decoder main functionality.""" from __future__ import annotations -import pytest -from mqt.qecc.cc_decoder.stim_interface.max_sat_stim_decoder import MaxSatStim -import numpy as np -from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import SinterCompiledDecoderMaxSat -from numpy.core.numeric import array_equal +import numpy as np +import pytest import stim -from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import SinterDecoderMaxSat +from mqt.qecc.cc_decoder.stim_interface.max_sat_sinter_decoder import SinterCompiledDecoderMaxSat, SinterDecoderMaxSat +from mqt.qecc.cc_decoder.stim_interface.max_sat_stim_decoder import MaxSatStim @pytest.fixture @@ -317,8 +315,9 @@ def detector_error_model() -> stim.DetectorErrorModel: error(0.5) D8 error(0.5) D8 D11""") -def test_decode_shots_bit_packed(detector_error_model:stim.DetectorErrorModel) -> None: - bit_packed_shots = np.array([[0,0]]).astype(np.uint8) + +def test_decode_shots_bit_packed(detector_error_model: stim.DetectorErrorModel) -> None: + bit_packed_shots = np.array([[0, 0]]).astype(np.uint8) max_sat_stim = MaxSatStim(detector_error_model) sinter_decoder = SinterCompiledDecoderMaxSat(max_sat_stim) result = sinter_decoder.decode_shots_bit_packed(bit_packed_shots) @@ -326,10 +325,11 @@ def test_decode_shots_bit_packed(detector_error_model:stim.DetectorErrorModel) - assert len(result) == 1 assert result[0][0] == 1 or result[0][0] -def test_decode_via_files(detector_error_model:stim.DetectorErrorModel) -> None: + +def test_decode_via_files(detector_error_model: stim.DetectorErrorModel) -> None: decoder = SinterDecoderMaxSat() result = decoder.compile_decoder_for_dem(detector_error_model) assert result.decoder is not None assert result.decoder.num_detectors == detector_error_model.num_detectors - assert result.decoder.observables.shape == (1,30) - assert len(result.decoder.problem.helper_vars) == detector_error_model.num_detectors \ No newline at end of file + assert result.decoder.observables.shape == (1, 30) + assert len(result.decoder.problem.helper_vars) == detector_error_model.num_detectors From 7e15ff3e447a9ea044915800243e1315100c9b52 Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 11 Dec 2024 10:49:19 +0100 Subject: [PATCH 75/79] add docstrings --- test/python/cc_decoder/max_sat_sinter_decoder.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/python/cc_decoder/max_sat_sinter_decoder.py b/test/python/cc_decoder/max_sat_sinter_decoder.py index 2d3660d3..15ba22b0 100644 --- a/test/python/cc_decoder/max_sat_sinter_decoder.py +++ b/test/python/cc_decoder/max_sat_sinter_decoder.py @@ -317,6 +317,7 @@ def detector_error_model() -> stim.DetectorErrorModel: def test_decode_shots_bit_packed(detector_error_model: stim.DetectorErrorModel) -> None: + """ test bit packed shot decoding """ bit_packed_shots = np.array([[0, 0]]).astype(np.uint8) max_sat_stim = MaxSatStim(detector_error_model) sinter_decoder = SinterCompiledDecoderMaxSat(max_sat_stim) @@ -327,6 +328,7 @@ def test_decode_shots_bit_packed(detector_error_model: stim.DetectorErrorModel) def test_decode_via_files(detector_error_model: stim.DetectorErrorModel) -> None: + """ test via file decoding """ decoder = SinterDecoderMaxSat() result = decoder.compile_decoder_for_dem(detector_error_model) assert result.decoder is not None From b7f7c4b483fba74ab17a026f18a121073353bb0d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 09:50:09 +0000 Subject: [PATCH 76/79] =?UTF-8?q?=F0=9F=8E=A8=20pre-commit=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/python/cc_decoder/max_sat_sinter_decoder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/python/cc_decoder/max_sat_sinter_decoder.py b/test/python/cc_decoder/max_sat_sinter_decoder.py index 15ba22b0..39359fe2 100644 --- a/test/python/cc_decoder/max_sat_sinter_decoder.py +++ b/test/python/cc_decoder/max_sat_sinter_decoder.py @@ -317,7 +317,7 @@ def detector_error_model() -> stim.DetectorErrorModel: def test_decode_shots_bit_packed(detector_error_model: stim.DetectorErrorModel) -> None: - """ test bit packed shot decoding """ + """Test bit packed shot decoding.""" bit_packed_shots = np.array([[0, 0]]).astype(np.uint8) max_sat_stim = MaxSatStim(detector_error_model) sinter_decoder = SinterCompiledDecoderMaxSat(max_sat_stim) @@ -328,7 +328,7 @@ def test_decode_shots_bit_packed(detector_error_model: stim.DetectorErrorModel) def test_decode_via_files(detector_error_model: stim.DetectorErrorModel) -> None: - """ test via file decoding """ + """Test via file decoding.""" decoder = SinterDecoderMaxSat() result = decoder.compile_decoder_for_dem(detector_error_model) assert result.decoder is not None From c830bd2d38dca7a66ab322ee1b5c705df005f29c Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 11 Dec 2024 10:59:38 +0100 Subject: [PATCH 77/79] rename testfile --- .../{max_sat_sinter_decoder.py => test_max_sat_sinter_decoder.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/python/cc_decoder/{max_sat_sinter_decoder.py => test_max_sat_sinter_decoder.py} (100%) diff --git a/test/python/cc_decoder/max_sat_sinter_decoder.py b/test/python/cc_decoder/test_max_sat_sinter_decoder.py similarity index 100% rename from test/python/cc_decoder/max_sat_sinter_decoder.py rename to test/python/cc_decoder/test_max_sat_sinter_decoder.py From e85c2f94ea72caf4b692e425bfc7c1ee0c857003 Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 11 Dec 2024 13:06:26 +0100 Subject: [PATCH 78/79] try fix sinter dependency --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 11bd931b..c4fbe4e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,7 +59,7 @@ dependencies = [ "qsample>=0.0.2", "urllib3>=1.26.20,<2.0", # Required by qsample (to be removed) "fastcore>=1.7.10", # Required by qsample (to be removed) - "sinter" + "sinter>=1.14.0" ] dynamic = ["version"] From c1ec0349d2e27879ab3a54406575d33efb5981c7 Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 11 Dec 2024 14:17:59 +0100 Subject: [PATCH 79/79] try fix linter warning --- src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py index de5d58c4..32328bfb 100644 --- a/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py +++ b/src/mqt/qecc/cc_decoder/stim_interface/max_sat_stim_decoder.py @@ -54,7 +54,7 @@ def check_matrix_to_adj_lists(check_matrix: Any) -> tuple[dict[int, list[int]], @staticmethod def weight_function(x: np.float64) -> np.float64: """Return log likelihood weighting.""" - return np.log((1 - x) / x) + return np.log([(1 - x) / x])[0].astype(np.float64) def decode(self, syndrome: NDArray[int]) -> tuple[NDArray[int], int]: """Decode the syndrome and return a prediction of which observables were flipped.