diff --git a/indica/configs/workflows/__init__.py b/indica/configs/workflows/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/indica/configs/workflows/bda_run/__init__.py b/indica/configs/workflows/bda_run/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/indica/configs/workflows/bda_run/experiment/p11089.yaml b/indica/configs/workflows/bda_run/experiment/p11089.yaml deleted file mode 100644 index 8556a412..00000000 --- a/indica/configs/workflows/bda_run/experiment/p11089.yaml +++ /dev/null @@ -1,9 +0,0 @@ -# @package _global_ - -defaults: - - override /model: tws_c - -pulse: 11089 -tstart: 0.05 -tend: 0.11 -dt: 0.01 diff --git a/indica/configs/workflows/bda_run/model/pi.yaml b/indica/configs/workflows/bda_run/model/pi.yaml deleted file mode 100644 index 0254a1c2..00000000 --- a/indica/configs/workflows/bda_run/model/pi.yaml +++ /dev/null @@ -1,13 +0,0 @@ -defaults: - - settings: default - - -diagnostics: [ - "xrcs", - "cxff_pi", - ] - -quantities: [ - "xrcs.raw_spectra", - "cxff_pi.ti", - ] diff --git a/indica/configs/workflows/bda_run/model/settings/default.yaml b/indica/configs/workflows/bda_run/model/settings/default.yaml deleted file mode 100644 index 66779d9b..00000000 --- a/indica/configs/workflows/bda_run/model/settings/default.yaml +++ /dev/null @@ -1,8 +0,0 @@ - -xrcs: - window_masks: [[0.394, 0.3954],] - background: 0 - -cxff_pi: {} -cxff_tws_c: {} -cxff_tws_b: {} diff --git a/indica/configs/workflows/bda_run/model/tws_b.yaml b/indica/configs/workflows/bda_run/model/tws_b.yaml deleted file mode 100644 index 87e81528..00000000 --- a/indica/configs/workflows/bda_run/model/tws_b.yaml +++ /dev/null @@ -1,15 +0,0 @@ -defaults: - - settings: default - - -diagnostics: [ - "xrcs", - "cxff_tws_b", -# "efit", - ] - -quantities: [ - "xrcs.raw_spectra", - "cxff_tws_b.ti", -# "efit.wp", - ] diff --git a/indica/configs/workflows/bda_run/model/tws_c.yaml b/indica/configs/workflows/bda_run/model/tws_c.yaml deleted file mode 100644 index f17d3fec..00000000 --- a/indica/configs/workflows/bda_run/model/tws_c.yaml +++ /dev/null @@ -1,13 +0,0 @@ -defaults: - - settings: default - - -diagnostics: [ - "xrcs", - "cxff_tws_c", - ] - -quantities: [ - "xrcs.raw_spectra", - "cxff_tws_c.ti", - ] diff --git a/indica/configs/workflows/bda_run/model/xrcs.yaml b/indica/configs/workflows/bda_run/model/xrcs.yaml deleted file mode 100644 index f44d91e4..00000000 --- a/indica/configs/workflows/bda_run/model/xrcs.yaml +++ /dev/null @@ -1,11 +0,0 @@ -defaults: - - settings: default - - -diagnostics: [ - "xrcs", - ] - -quantities: [ - "xrcs.raw_spectra", - ] diff --git a/indica/configs/workflows/bda_run/optimisation/bo_default.yaml b/indica/configs/workflows/bda_run/optimisation/bo_default.yaml deleted file mode 100644 index 6d5dabdf..00000000 --- a/indica/configs/workflows/bda_run/optimisation/bo_default.yaml +++ /dev/null @@ -1,19 +0,0 @@ -method: "bo" - -param_names: ["ion_temperature.y0", "ion_temperature.peaking", "ion_temperature.wcenter", "impurity_density:ar.peaking", -"xrcs.scale_spectra"] -pca_profiles: [] -pca_components: 2 - -n_calls: 40 -n_initial_points: 10 -noise: 1.0E-20 -acq_func: "LCB" -xi: 0.20 -kappa: 2 -initial_point_generator: "lhs" -use_previous_best: True - -boundary_samples: 3000 -model_samples: 100 -posterior_samples: 100000 diff --git a/indica/configs/workflows/bda_run/optimisation/bo_test.yaml b/indica/configs/workflows/bda_run/optimisation/bo_test.yaml deleted file mode 100644 index 4a91f624..00000000 --- a/indica/configs/workflows/bda_run/optimisation/bo_test.yaml +++ /dev/null @@ -1,18 +0,0 @@ -method: "bo" - -param_names: ["ion_temperature.y0", ] -pca_profiles: [] -pca_components: 2 - -n_calls: 2 -n_initial_points: 1 -noise: 1.0E-10 -acq_func: "LCB" -xi: 0.20 -kappa: 5 -initial_point_generator: "lhs" -use_previous_best: False - -boundary_samples: 1000 -model_samples: 10 -posterior_samples: 1000 diff --git a/indica/configs/workflows/bda_run/optimisation/emcee_default.yaml b/indica/configs/workflows/bda_run/optimisation/emcee_default.yaml deleted file mode 100644 index 8f4ddc99..00000000 --- a/indica/configs/workflows/bda_run/optimisation/emcee_default.yaml +++ /dev/null @@ -1,14 +0,0 @@ -method: "emcee" - -param_names: ["impurity_density:ar.y0", "impurity_density:ar.peaking" -] -pca_profiles: ["ion_temperature", ] -pca_components: 3 - -starting_samples: 200 -iterations: 1000 -nwalkers: 40 -stopping_criteria_factor: 0.005 -sample_method: "high_density" -stopping_criteria: "mode" -burn_frac: 0.20 diff --git a/indica/configs/workflows/bda_run/optimisation/emcee_test.yaml b/indica/configs/workflows/bda_run/optimisation/emcee_test.yaml deleted file mode 100644 index e419fe8d..00000000 --- a/indica/configs/workflows/bda_run/optimisation/emcee_test.yaml +++ /dev/null @@ -1,13 +0,0 @@ -method: "emcee" - -param_names: ["ion_temperature.y0"] -pca_profiles: [] -pca_components: 2 - -starting_samples: 20 -iterations: 2 -nwalkers: 8 -stopping_criteria_factor: 0.5 -sample_method: "random" -stopping_criteria: "mode" -burn_frac: 0.001 diff --git a/indica/configs/workflows/bda_run/plasma/default.yaml b/indica/configs/workflows/bda_run/plasma/default.yaml deleted file mode 100644 index 12f500d6..00000000 --- a/indica/configs/workflows/bda_run/plasma/default.yaml +++ /dev/null @@ -1,4 +0,0 @@ - -defaults: - - profiles: default - - settings: default diff --git a/indica/configs/workflows/bda_run/plasma/profiles/default.yaml b/indica/configs/workflows/bda_run/plasma/profiles/default.yaml deleted file mode 100644 index 716fba87..00000000 --- a/indica/configs/workflows/bda_run/plasma/profiles/default.yaml +++ /dev/null @@ -1,56 +0,0 @@ -electron_density: - y0: 5.0e+19 - y1: 2.0e+18 - yend: 1.0e+18 - wped: 3 - wcenter: 0.3 - peaking: 2 -impurity_density:ar: - y0: 1.0e+17 - y1: 1.0e+15 - yend: 1.0e+15 - wcenter: 0.3 - wped: 3 - peaking: 3 -impurity_density:c: - y0: 5.0e+17 - y1: 2.0e+17 - yend: 2.0e+17 - wcenter: 0.3 - wped: 3 - peaking: 3 -impurity_density:he: - y0: 5.0e+17 - y1: 2.0e+17 - yend: 2.0e+17 - wcenter: 0.3 - wped: 3 - peaking: 3 -electron_temperature: - y0: 2000 - y1: 50 - yend: 10 - wcenter: 0.2 - wped: 3 - peaking: 2 -ion_temperature: - y0: 5.0e+3 - y1: 50 - yend: 10 - wcenter: 0.25 - wped: 1.5 - peaking: 2 -neutral_density: - y0: 1.0e+13 - y1: 5.0e+15 - yend: 5.0e+15 - wcenter: 0.01 - wped: 18 - peaking: 1 -toroidal_rotation: - y0: 500.0e+3 - y1: 1.0e+3 - yend: 1.0e+3 - peaking: 0.4 - wcenter: 2 - wped: 3 diff --git a/indica/configs/workflows/bda_run/plasma/settings/default.yaml b/indica/configs/workflows/bda_run/plasma/settings/default.yaml deleted file mode 100644 index ba3baa16..00000000 --- a/indica/configs/workflows/bda_run/plasma/settings/default.yaml +++ /dev/null @@ -1,4 +0,0 @@ -main_ion: "h" -impurities: ["ar",] -impurity_concentration: [0.001,] -n_rad: 20 diff --git a/indica/configs/workflows/bda_run/priors/default.yaml b/indica/configs/workflows/bda_run/priors/default.yaml deleted file mode 100644 index 084e7cfc..00000000 --- a/indica/configs/workflows/bda_run/priors/default.yaml +++ /dev/null @@ -1,38 +0,0 @@ -basic_prior_info: - ion_temperature.y0: ["get_uniform", 800, 10000] - ion_temperature.y1: ["get_uniform", 50, 100] - ion_temperature.wped: ["get_uniform", 1, 2] - ion_temperature.wcenter: ["get_uniform", 0.2, 0.4] - ion_temperature.peaking: ["get_uniform", 1, 2] - - electron_density.y0: ["get_uniform", 1e19, 2e20] - electron_density.y1: ["get_uniform", 1e18, 1e19] - electron_density.wped: ["loguniform", 2, 20] - electron_density.wcenter: ["get_uniform", 0.2, 0.4] - electron_density.peaking: ["get_uniform", 1, 2] - - electron_temperature.y0: ["get_uniform", 1000, 4000] - electron_temperature.y1: ["get_uniform", 50, 100] - electron_temperature.wped: ["get_uniform", 1, 2] - electron_temperature.wcenter: ["get_uniform", 0.2, 0.4] - electron_temperature.peaking: ["get_uniform", 1, 2] - - impurity_density:ar.y0: ["loguniform", 2e16, 1e18] - impurity_density:ar.y1: ["loguniform", 1e16, 1.01e16] - impurity_density:ar.wped: ["get_uniform", 1, 2] - impurity_density:ar.wcenter: ["get_uniform", 0.2, 0.4] - impurity_density:ar.peaking: ["get_uniform", 1, 2] - - neutral_density.y0: ["loguniform", 1e13, 1e15] - neutral_density.y1: ["loguniform", 1e13, 1e16] - neutral_density.wped: ["get_uniform", 16, 17] - neutral_density.wcenter: ["get_uniform", 0.2, 0.4] - neutral_density.peaking: ["get_uniform", 1, 10] - - xrcs.scale_spectra: ["get_uniform", 0.95, 1.05] - -cond_prior_info: - electron_temperature.y0/electron_temperature.y1: "greater_than" - electron_density.y0/electron_density.y1: "greater_than" - impurity_density:ar.y0/impurity_density:ar.y1: "greater_than" - ion_temperature.y0/ion_temperature.y1: "greater_than" diff --git a/indica/configs/workflows/bda_run/reader/equilibrium/astra.yaml b/indica/configs/workflows/bda_run/reader/equilibrium/astra.yaml deleted file mode 100644 index 089d0ae4..00000000 --- a/indica/configs/workflows/bda_run/reader/equilibrium/astra.yaml +++ /dev/null @@ -1,4 +0,0 @@ -modelling_number: 33000000 -code: astra -revisions: - astra: 0 diff --git a/indica/configs/workflows/bda_run/reader/equilibrium/efit.yaml b/indica/configs/workflows/bda_run/reader/equilibrium/efit.yaml deleted file mode 100644 index 104e5d8b..00000000 --- a/indica/configs/workflows/bda_run/reader/equilibrium/efit.yaml +++ /dev/null @@ -1,4 +0,0 @@ -modelling_number: 0 -code: efit -revisions: - efit: 0 diff --git a/indica/configs/workflows/bda_run/reader/exp.yaml b/indica/configs/workflows/bda_run/reader/exp.yaml deleted file mode 100644 index 6cc3d9cc..00000000 --- a/indica/configs/workflows/bda_run/reader/exp.yaml +++ /dev/null @@ -1,13 +0,0 @@ -defaults: - - equilibrium: efit - - filters: default - -phantom: False -mock: False - -ppts_modelling_number: 0 -set_ts: True -apply_rshift: True -map_vtor: True - -revisions: {} diff --git a/indica/configs/workflows/bda_run/reader/filters/default.yaml b/indica/configs/workflows/bda_run/reader/filters/default.yaml deleted file mode 100644 index 4bf17bfc..00000000 --- a/indica/configs/workflows/bda_run/reader/filters/default.yaml +++ /dev/null @@ -1,12 +0,0 @@ -filter_coords: - cxff_pi: - ti: [ "channel", [ 4, 5 ] ] - vtor: [ "channel", [ 4, 5 ] ] - cxff_tws_c: - ti: [ "channel", [ 0, 2 ] ] - vtor: [ "channel", [ 0, 2 ] ] - cxff_tws_b: - ti: [ "channel", [ 1, 3 ] ] - vtor: [ "channel", [ 1, 3 ] ] - -filter_limits: {} diff --git a/indica/configs/workflows/bda_run/reader/mock.yaml b/indica/configs/workflows/bda_run/reader/mock.yaml deleted file mode 100644 index 3e0d7106..00000000 --- a/indica/configs/workflows/bda_run/reader/mock.yaml +++ /dev/null @@ -1,13 +0,0 @@ -defaults: - - equilibrium: efit - - filters: default - -phantom: True -mock: True - -ppts_modelling_number: 0 -set_ts: False -apply_rshift: False -map_vtor: False - -revisions: {} diff --git a/indica/configs/workflows/bda_run/reader/phantom.yaml b/indica/configs/workflows/bda_run/reader/phantom.yaml deleted file mode 100644 index b44c08a8..00000000 --- a/indica/configs/workflows/bda_run/reader/phantom.yaml +++ /dev/null @@ -1,13 +0,0 @@ -defaults: - - equilibrium: efit - - filters: default - -phantom: True -mock: False - -ppts_modelling_number: 0 -set_ts: True -apply_rshift: True -map_vtor: True - -revisions: {} diff --git a/indica/configs/workflows/bda_run/template_bo.yaml b/indica/configs/workflows/bda_run/template_bo.yaml deleted file mode 100644 index 9e849249..00000000 --- a/indica/configs/workflows/bda_run/template_bo.yaml +++ /dev/null @@ -1,17 +0,0 @@ - -defaults: - - model: tws_c - - plasma: default - - priors: default - - optimisation: bo_default - - reader: exp - - writer: default - -pulse: 11560 -tstart: 0.05 -tend: 0.06 -dt: 0.01 - -writer: - pulse_to_write: 43000000 - run_info: "Bayesian Optimisation test" diff --git a/indica/configs/workflows/bda_run/template_exp.yaml b/indica/configs/workflows/bda_run/template_exp.yaml deleted file mode 100644 index 365bf7e8..00000000 --- a/indica/configs/workflows/bda_run/template_exp.yaml +++ /dev/null @@ -1,12 +0,0 @@ -pulse: 11089 -tstart: 0.12 -tend: 0.13 -dt: 0.01 - -defaults: - - model: xrcs - - optimisation: emcee_default - - plasma: default - - priors: default - - reader: exp - - writer: default diff --git a/indica/configs/workflows/bda_run/template_mock.yaml b/indica/configs/workflows/bda_run/template_mock.yaml deleted file mode 100644 index 9ded95db..00000000 --- a/indica/configs/workflows/bda_run/template_mock.yaml +++ /dev/null @@ -1,13 +0,0 @@ - -defaults: - - model: pi - - optimisation: bo_default - - plasma: default - - priors: default - - reader: mock - - writer: default - -pulse: None -tstart: 0.05 -tend: 0.06 -dt: 0.01 diff --git a/indica/configs/workflows/bda_run/template_phantom.yaml b/indica/configs/workflows/bda_run/template_phantom.yaml deleted file mode 100644 index 97ba0051..00000000 --- a/indica/configs/workflows/bda_run/template_phantom.yaml +++ /dev/null @@ -1,14 +0,0 @@ - -pulse: 11089 -tstart: 0.12 -tend: 0.13 -dt: 0.01 - - -defaults: - - model: xrcs - - optimisation: emcee_test - - plasma: default - - priors: default - - reader: phantom - - writer: default diff --git a/indica/configs/workflows/bda_run/test_bo.yaml b/indica/configs/workflows/bda_run/test_bo.yaml deleted file mode 100644 index 4ce07499..00000000 --- a/indica/configs/workflows/bda_run/test_bo.yaml +++ /dev/null @@ -1,23 +0,0 @@ - -defaults: - - model: xrcs - - plasma: default - - priors: default - - optimisation: bo_test - - reader: mock - - writer: test - -pulse: null -tstart: 0.05 -tend: 0.06 -dt: 0.01 - -model: - diagnostics: ["cxff_pi", "cxff_tws_c", ] - quantities: [ "cxff_pi.ti", "cxff_tws_c.ti", ] - -#reader: -# filters: -# filter_coords: -# cxff_pi: -# ti: ["channel", [3, 5]] diff --git a/indica/configs/workflows/bda_run/test_emcee.yaml b/indica/configs/workflows/bda_run/test_emcee.yaml deleted file mode 100644 index 3e8d9c13..00000000 --- a/indica/configs/workflows/bda_run/test_emcee.yaml +++ /dev/null @@ -1,20 +0,0 @@ - -defaults: - - model: pi - - optimisation: emcee_test - - plasma: default - - priors: default - - reader: mock - - writer: test - -diagnostics: [ - "cxff_pi", - ] -quantities: [ - "cxff_pi.ti", - ] - -pulse: None -tstart: 0.05 -tend: 0.06 -dt: 0.01 diff --git a/indica/configs/workflows/bda_run/writer/default.yaml b/indica/configs/workflows/bda_run/writer/default.yaml deleted file mode 100644 index 728bafa3..00000000 --- a/indica/configs/workflows/bda_run/writer/default.yaml +++ /dev/null @@ -1,6 +0,0 @@ -pulse_to_write: null -mds_write: True -best: True -plot: True -run: "RUN01" -run_info: "Default run" diff --git a/indica/configs/workflows/bda_run/writer/test.yaml b/indica/configs/workflows/bda_run/writer/test.yaml deleted file mode 100644 index efe9fe65..00000000 --- a/indica/configs/workflows/bda_run/writer/test.yaml +++ /dev/null @@ -1,6 +0,0 @@ -pulse_to_write: 43000000 -mds_write: False -best: False -plot: False -run: "TEST" -run_info: "Testing run" diff --git a/indica/configs/workflows/priors/__init__.py b/indica/configs/workflows/priors/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/indica/configs/workflows/priors/config.yaml b/indica/configs/workflows/priors/config.yaml deleted file mode 100644 index 3664da96..00000000 --- a/indica/configs/workflows/priors/config.yaml +++ /dev/null @@ -1,36 +0,0 @@ -basic_prior_info: - ion_temperature.y0: ["get_uniform", 1000, 10000] - ion_temperature.y1: ["get_uniform", 50, 50.1] - ion_temperature.wped: ["get_uniform", 1, 2] - ion_temperature.wcenter: ["get_uniform", 0.2, 0.4] - ion_temperature.peaking: ["get_uniform", 1, 3] - - electron_density.y0: ["get_uniform", 2e19, 2e20] - electron_density.y1: ["get_uniform", 1e18, 1e19] - electron_density.wped: ["loguniform", 2, 20] - electron_density.wcenter: ["get_uniform", 0.2, 0.4] - electron_density.peaking: ["get_uniform", 1, 4] - - electron_temperature.y0: ["get_uniform", 1000, 5000] - electron_temperature.y1: ["get_uniform", 50, 50.1] - electron_temperature.wped: ["get_uniform", 1, 10] - electron_temperature.wcenter: ["get_uniform", 0.2, 0.4] - electron_temperature.peaking: ["get_uniform", 1, 5] - - impurity_density:ar.y0: ["loguniform", 1e16, 1e18] - impurity_density:ar.y1: ["loguniform", 1e16, 1.01e16] - impurity_density:ar.wped: ["get_uniform", 1, 2] - impurity_density:ar.wcenter: ["get_uniform", 0.2, 0.4] - impurity_density:ar.peaking: ["get_uniform", 1, 5] - - neutral_density.y0: ["loguniform", 1e13, 1e15] - neutral_density.y1: ["loguniform", 1e13, 1e16] - neutral_density.wped: ["get_uniform", 16, 17] - neutral_density.wcenter: ["get_uniform", 0.2, 0.4] - neutral_density.peaking: ["get_uniform", 1, 10] - -cond_prior_info: - electron_temperature.y0/electron_temperature.y1: "greater_than" - electron_density.y0/electron_density.y1: "greater_than" - impurity_density:ar.y0/impurity_density:ar.y1: "greater_than" - ion_temperature.y0/ion_temperature.y1: "greater_than" diff --git a/indica/models/plasma.py b/indica/models/plasma.py index 5eb2f401..92d63077 100644 --- a/indica/models/plasma.py +++ b/indica/models/plasma.py @@ -807,8 +807,6 @@ def __init__( self, plasma: Plasma, profilers: dict[ProfilerBase], - plasma_attribute_names=None, - map_vtor: bool = False, ): """ Interface Profiler objects with Plasma object to generate plasma profiles @@ -822,30 +820,8 @@ def __init__( dictionary of Profiler objects to generate profiles """ - if plasma_attribute_names is None: - plasma_attribute_names = [ - "electron_temperature", - "electron_density", - "ion_temperature", - "ion_density", - "impurity_density", - "fast_density", - "pressure_fast", - "neutral_density", - "zeff", - "meanz", - "wp", - "wth", - "pressure_tot", - "pressure_th", - "toroidal_rotation", - ] self.plasma = plasma self.profilers = profilers - self.plasma_attribute_names = plasma_attribute_names - self.map_vtor = map_vtor - self.phantom = None - self.phantom_profiles = None def update_profilers(self, profilers: dict): for profile_name, profiler in profilers.items(): @@ -872,16 +848,6 @@ def set_profiles(self, profiles: dict[xr.DataArray], t: float = None): else: getattr(self.plasma, profile_name).loc[dict(t=t)] = profile - def save_phantoms(self, phantom=False): - # if phantoms return profiles otherwise return empty arrays - self.phantom = phantom - phantom_profiles = self.plasma_attributes() - if not phantom: - for key, value in phantom_profiles.items(): - phantom_profiles[key] = value * 0 - self.phantom_profiles = phantom_profiles - return phantom_profiles - def map_plasma_profile_to_midplane(self, profiles: dict): """ Map profiles from flux space to real space on z=0 @@ -901,24 +867,6 @@ def map_plasma_profile_to_midplane(self, profiles: dict): midplane_profiles[key] = value.interp(rho_poloidal=rho) return midplane_profiles - def plasma_attributes(self): - plasma_attributes = {} - for attribute in self.plasma_attribute_names: - plasma_attributes[attribute] = getattr(self.plasma, attribute).sel( - t=self.plasma.time_to_calculate - ) - return plasma_attributes - - def map_toroidal_rotation_to_ion_temperature( - self, - ): - - self.plasma.toroidal_rotation = ( - self.plasma.ion_temperature - / self.plasma.ion_temperature.max("rho_poloidal") - * self.plasma.toroidal_rotation.max("rho_poloidal") - ) - def __call__(self, parameters: dict = None, t=None): """ Set parameters of given profilers and assign to plasma profiles @@ -962,6 +910,3 @@ def __call__(self, parameters: dict = None, t=None): for profile_to_update in profiles_to_update } self.set_profiles(updated_profiles, t) - - if "ion_temperature" in _profiles_to_update and self.map_vtor: - self.map_toroidal_rotation_to_ion_temperature() diff --git a/indica/plotters/plot_bda.py b/indica/plotters/plot_bda.py deleted file mode 100644 index a4d703ba..00000000 --- a/indica/plotters/plot_bda.py +++ /dev/null @@ -1,518 +0,0 @@ -import os -from pathlib import Path -import pickle - -import corner -import flatdict -import matplotlib.pyplot as plt -import numpy as np -from skopt.plots import plot_evaluations -import xarray as xr - -from indica.utilities import set_axis_sci -from indica.utilities import set_plot_rcparams - - -def plot_profile( - profile: xr.DataArray, - phantom_profile: xr.DataArray, - label: str, - figheader="./results/test/", - logscale=False, - sharefig=False, - filename="", - filetype=".png", - linestyle="--", - color="blue", -): - set_plot_rcparams("profiles") - plt.fill_between( - profile.rho_poloidal, - profile.quantile(0.16, dim="sample_idx"), - profile.quantile(0.84, dim="sample_idx"), - label=f"{label}, 68% Confidence", - zorder=3, - color=color, - alpha=0.9, - ) - if label != "NFAST": - plt.fill_between( - profile.rho_poloidal, - profile.quantile(0.025, dim="sample_idx"), - profile.quantile(0.975, dim="sample_idx"), - label=f"{label}, 95% Confidence", - zorder=2, - color="grey", - alpha=0.4, - ) - plt.fill_between( - profile.rho_poloidal, - profile.quantile(0.005, dim="sample_idx"), - profile.quantile(0.995, dim="sample_idx"), - label=f"{label}, Max-Min", - zorder=1, - color="lightgrey", - alpha=0.2, - ) - - if phantom_profile.any(): - phantom_profile.plot( - label=f"{label}, phantom profile", - linestyle=linestyle, - color="black", - zorder=4, - ) - - plt.legend() - if sharefig: - return - - set_axis_sci() - if logscale: - plt.yscale("log") - - plt.xlabel("Rho poloidal") - # plt.ylabel(f"{profile.datatype[0].capitalize()} [{profile.units}]") - if filename: - plt.savefig(figheader + f"{filename}{filetype}") - else: - plt.savefig(figheader + f"{label}{filetype}") - plt.close("all") - - -def _plot_1d( - data: xr.DataArray, - diag_data: xr.DataArray, - filename: str, - figheader="./results/test/", - label="", - ylabel="a.u.", - xlabel="[]", - xlim=None, - figsize=(6.4, 4.8), - hide_legend=False, - capsize=3, - markersize=4, - elinewidth=2, - **kwargs, -): - set_plot_rcparams("multi") - plt.figure(figsize=figsize) - dims = tuple(name for name in data.dims if name != "sample_idx") - plt.fill_between( - data.__getattr__(dims[0]), - data.quantile(0.16, dim="sample_idx"), - data.quantile(0.84, dim="sample_idx"), - label=f"{label}, 68% Confidence", - zorder=3, - color="blue", - ) - plt.fill_between( - data.__getattr__(dims[0]), - data.quantile(0.025, dim="sample_idx"), - data.quantile(0.975, dim="sample_idx"), - label=f"{label}, 95% Confidence", - zorder=2, - color="grey", - ) - plt.fill_between( - data.__getattr__(dims[0]), - data.quantile(0.005, dim="sample_idx"), - data.quantile(0.995, dim="sample_idx"), - label=f"{label}, Max-Min", - zorder=1, - color="lightgrey", - ) - plt.errorbar( - diag_data.__getattr__(dims[0]), - diag_data, - diag_data.error, - fmt="k*", - label=f"{label} data", - zorder=4, - capsize=capsize, - markersize=markersize, - elinewidth=elinewidth, - ) - - plt.gca().set_ylim(bottom=0) - set_axis_sci() - plt.ylabel(ylabel) - plt.xlabel(xlabel) - plt.xlim(xlim) - if not hide_legend: - plt.legend() - plt.savefig(figheader + filename) - plt.close() - - -def violinplot( - data, - diag_data, - filename: str, - xlabel="", - ylabel="[a.u.]", - figheader="./results/test/", - **kwargs, -): - set_plot_rcparams("multi") - fig, axs = plt.subplots( - 1, - 1, - ) - data = data[~np.isnan(data)] - _data = data[((data > np.quantile(data, 0.16)) & (data < np.quantile(data, 0.84)))] - - violin = axs.violinplot( - _data, - showextrema=False, - # quantiles=[0.025, 0.975, 0.16, 0.84], - # showmedians=True, - ) - axs.errorbar( - 1, - y=diag_data, - yerr=diag_data.error, - fmt="D", - ecolor="black", - capsize=10, - color="black", - ) - violin["bodies"][0].set_edgecolor("black") - axs.set_xlabel(xlabel) - top = axs.get_ylim()[1] - # bot = axs.get_ylim()[0] - axs.set_ylim(top=top * 1.1, bottom=0) - axs.set_ylabel(f"{ylabel}") - - set_axis_sci() - plt.setp([axs.get_xticklabels()], visible=False) - plt.savefig(figheader + filename) - plt.close() - - -def histograms(data, diag_data, filename): - nfig = len(data) - fig, axs = plt.subplots(1, nfig, figsize=(16, 6)) - for idx, key in enumerate(data.keys()): - n, bins, patches = axs[idx].hist(data[key], 50, density=True) - q1 = (np.percentile(data[key], 16), np.percentile(data[key], 84)) - q2 = (np.percentile(data[key], 2.5), np.percentile(data[key], 97.5)) - idx_high = np.argwhere((bins > q1[0]) & (bins < q1[1])).flatten() - idx_low = np.argwhere((bins > q2[0]) & (bins < q2[1])).flatten() - for patch in patches: - patch.set_facecolor("lightgrey") - for i in idx_low: - patches[i].set_facecolor("grey") - for i in idx_high: - patches[i].set_facecolor("red") - - # axs[idx].set_xlabel(f"{key} ({data[key].datatype[0]})") - - axs[idx].axvline( - x=diag_data[key].sel(t=data[key].t).values, - color="black", - linestyle="-.", - label=f"{key} data", - ) - axs[0].set_ylabel("pdf ()") - - plt.savefig(filename) - plt.close() - - -def plot_autocorr(autocorr, param_names, figheader, filetype=".png"): - plt.figure() - - x_data = ( - np.ones(shape=(autocorr.shape)) - * np.arange(0, autocorr[:, 0].__len__())[:, None] - ) - plt.plot(np.where(np.isfinite(autocorr), x_data, np.nan), autocorr, "x") - plt.legend(param_names) - plt.xlabel("iterations") - plt.ylabel("auto-correlation time (iterations)") - plt.savefig(figheader + "average_tau" + filetype) - plt.close() - - -# flake8: noqa: C901 -def plot_bayes_result( - results=None, - filepath="./results/test/", - filetype=".png", - **kwargs, -): - # delete all but pickle in directory and remove empty directories - for root, dirs, files in os.walk(filepath): - for dir in dirs: - if not os.listdir(root + dir): - print(f"Deleting {os.path.join(root, dir)}") - os.rmdir(os.path.join(root, dir)) - for f in files: - if f.endswith(".pkl"): - continue - else: - print(f"Deleting {os.path.join(root, f)}") - os.remove(os.path.join(root, f)) - - if results is None: - with open(filepath + "results.pkl", "rb") as handle: - results = pickle.load(handle) - - # Create time directories - time = results["TIME"] - element = results["ELEMENT"] - for t in time: - Path(filepath + f"/t:{t:.2f}").mkdir(parents=True, exist_ok=True) - - diag_data = flatdict.FlatDict(results["DIAG_DATA"], ".") - model_data = flatdict.FlatDict(results["MODEL_DATA"], ".") - profiles = flatdict.FlatDict(results["PROFILE_STAT"], ".") - post_sample = results["OPTIMISATION"]["POST_SAMPLE"] - prior_sample = results["OPTIMISATION"]["PRIOR_SAMPLE"] - gp_regression = results["OPTIMISATION"].get("GP_REGRESSION", {}) - auto_corr = results["OPTIMISATION"]["AUTO_CORR"] - param_names = results["OPTIMISATION"]["PARAM_NAMES"] - phantom_profiles = flatdict.FlatDict(results["PHANTOMS"], ".") - - # select time sample_idx for plotting - for t_idx, t in enumerate(time): - figheader = filepath + f"t:{t:.2f}/" - - if any(gp_regression): - plot_evaluations(gp_regression[t_idx], dimensions=param_names) - plt.savefig(figheader + "gp_evaluations") - plt.close() - # plot_objective(gp_regression[t_idx], dimensions=param_names ) - # plt.savefig(figheader + "gp_objective") - # plt.close() - - plot_autocorr( - auto_corr[ - t_idx, - ], - param_names, - figheader, - filetype=filetype, - ) - # set_plot_rcparams("multi") - key = "EFIT.WP" - if key in model_data.keys(): - violinplot( - model_data[key].sel(t=t), - diag_data[key].sel(t=t), - f"{key.replace('.', '_')}" + filetype, - xlabel=key, - figheader=figheader, - ylabel="Energy [J]", - ) - key = "SMMH1.NE" - if key in model_data.keys(): - violinplot( - model_data[key].sel(t=t), - diag_data[key].sel(t=t), - f"{key.replace('.', '_')}" + filetype, - figheader=figheader, - xlabel=key, - ylabel=r"Line Integrated Density [$m^{-2}$]", - ) - key = "XRCS.TE_KW" - if key in model_data.keys(): - violinplot( - model_data[key].sel(t=t), - diag_data[key].sel(t=t), - f"{key.replace('.', '_')}" + filetype, - figheader=figheader, - xlabel=key, - ylabel="Temperature [eV]", - ) - key = "XRCS.TI_W" - if key in model_data.keys(): - violinplot( - model_data[key].sel(t=t), - diag_data[key].sel(t=t), - f"{key.replace('.', '_')}" + filetype, - figheader=figheader, - xlabel=key, - ylabel="Temperature [eV]", - ) - - key = "XRCS.RAW_SPECTRA" - if key in model_data.keys(): - _plot_1d( - model_data[key].sel(t=t), - diag_data[key].sel(t=t), - f"{key.replace('.', '_')}" + filetype, - label=key, - figheader=figheader, - ylabel="Intensity [count/s]", - xlabel="Wavelength [nm]", - xlim=(0.394, 0.401), - figsize=(15, 6), - elinewidth=0, - capsize=0, - ) - - cxff_quantites = [key for key in model_data.keys() if "CXFF" in key] - for key in cxff_quantites: - if "TI" in key: - ylabel = "Temperature [eV]" - elif "VTOR" in key: - ylabel = "Toroidal Velocity [m/s]" - else: - ylabel = "[None]" - _plot_1d( - model_data[key].sel(t=t), - diag_data[key].sel(t=t), - f"{key.replace('.', '_')}" + filetype, - label=key, - figheader=figheader, - ylabel=ylabel, - xlabel="Channel", - # hide_legend=True, - ) - - key = "TS.TE" - if key in model_data.keys(): - _plot_1d( - model_data[key].sel(t=t), - diag_data[key].sel(t=t), - f"{key.replace('.', '_')}" + filetype, - label=key, - figheader=figheader, - ylabel="Temperature [eV]", - xlabel="Channel", - ) - key = "TS.NE" - if key in model_data.keys(): - _plot_1d( - model_data[key].sel(t=t), - diag_data[key].sel(t=t), - f"{key.replace('.', '_')}" + filetype, - label=key, - figheader=figheader, - ylabel="Density [m^-3]", - xlabel="Channel", - ) - - key = "TE" - plot_profile( - profiles[key].sel(t=t), - phantom_profiles[key].sel(t=t), - key, - figheader=figheader, - filetype=filetype, - sharefig=True, - color="blue", - linestyle="dashdot", - ) - key = "TI" - plot_profile( - profiles[key].sel( - t=t, - ), - phantom_profiles[key].sel( - t=t, - ), - key, - figheader=figheader, - filename="temperature", - filetype=filetype, - color="red", - linestyle="dotted", - ) - - key = "VTOR" - plot_profile( - profiles[key].sel( - t=t, - ), - phantom_profiles[key].sel( - t=t, - ), - key, - figheader=figheader, - filename="toroidal_rotation", - filetype=filetype, - color="blue", - linestyle="dotted", - ) - - key = "NE" - plot_profile( - profiles[key].sel(t=t), - phantom_profiles[key].sel(t=t), - key, - figheader=figheader, - filetype=filetype, - color="blue", - sharefig=True, - ) - key = "NI" - plot_profile( - profiles[key].sel(t=t, element=element[0]), - phantom_profiles[key].sel(t=t, element=element[0]), - key, - figheader=figheader, - filetype=filetype, - sharefig=True, - color="red", - ) - key = "NFAST" - plot_profile( - profiles[key].sel(t=t), - phantom_profiles[key].sel(t=t), - key, - figheader=figheader, - filename="densities", - filetype=filetype, - color="green", - ) - - key = "NI" - for elem in element[1:]: - plot_profile( - profiles[key].sel(t=t, element=elem), - phantom_profiles[key].sel(t=t, element=elem), - key, - figheader=figheader, - filename=f"{elem} density", - filetype=filetype, - color="red", - ) - - key = "NNEUTR" - plot_profile( - profiles[key].sel(t=t), - phantom_profiles[key].sel(t=t), - key, - filename="neutral density", - figheader=figheader, - filetype=filetype, - logscale=True, - ) - - post_sample_filtered = post_sample[t_idx,][ - ~np.isnan( - post_sample[ - t_idx, - ] - ).any(axis=1) - ] - corner.corner(post_sample_filtered, labels=param_names) - plt.savefig(figheader + "posterior" + filetype) - - corner.corner( - prior_sample[ - t_idx, - ], - labels=param_names, - ) - plt.savefig(figheader + "prior" + filetype) - plt.close("all") - - -if __name__ == "__main__": - filehead = "./results/example/" - plot_bayes_result(filepath=filehead, filetype=".png") diff --git a/indica/workflows/bda/__init__.py b/indica/workflows/bda/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/indica/workflows/bda/bayes_workflow.py b/indica/workflows/bda/bayes_workflow.py deleted file mode 100644 index a7fa8ec2..00000000 --- a/indica/workflows/bda/bayes_workflow.py +++ /dev/null @@ -1,387 +0,0 @@ -from datetime import datetime -import getpass -import logging -from pathlib import Path -import pickle - -import git -import numpy as np -import xarray as xr - -from indica.models.plasma import PlasmaProfiler -from indica.plotters.plot_bda import plot_bayes_result -from indica.workflows.bda.bayesblackbox import BayesBlackBox -from indica.workflows.bda.model_coordinator import ModelCoordinator -from indica.workflows.bda.optimiser_context import EmceeOptimiser -from indica.workflows.bda.priors import PriorManager -from indica.writers.bda_tree import create_nodes -from indica.writers.bda_tree import does_tree_exist -from indica.writers.bda_tree import write_nodes - - -def dict_of_dataarray_to_numpy(dict_of_dataarray): - """ - Mutates input dictionary to change xr.DataArray objects to np.array - - """ - for key, value in dict_of_dataarray.items(): - if isinstance(value, dict): - dict_of_dataarray_to_numpy(value) - elif isinstance(value, xr.DataArray): - dict_of_dataarray[key] = dict_of_dataarray[key].values - return dict_of_dataarray - - -def save_pickle(result, filepath): - Path(filepath).mkdir(parents=True, exist_ok=True) - with open(filepath + "results.pkl", "wb") as handle: - pickle.dump(result, handle) - - -class BayesWorkflow: - def __init__( - self, - quant_to_optimise: list, - opt_data: dict, - plasma_profiler: PlasmaProfiler, - prior_manager: PriorManager, - model_coordinator: ModelCoordinator, - optimiser_context: EmceeOptimiser, - ): - self.quant_to_optimise = quant_to_optimise - self.opt_data = opt_data - self.plasma_profiler = plasma_profiler - self.prior_manager = prior_manager - self.model_coordinator = model_coordinator - self.optimiser_context = optimiser_context - - self.blackbox = BayesBlackBox( - opt_data=self.opt_data, - quant_to_optimise=quant_to_optimise, - prior_manager=self.prior_manager, - plasma_profiler=self.plasma_profiler, - build_bckc=self.model_coordinator.__call__, - ) - - self.optimiser_context.init_optimiser(self.blackbox.ln_posterior) - - def _build_inputs_dict(self): - """ - - Returns - ------- - - dictionary of inputs in MDS+ structure - - """ - - result = {} - quant_list = [item.split(".") for item in self.quant_to_optimise] - - result["ELEMENT"] = self.plasma_profiler.plasma.elements - result["TIME"] = self.plasma_profiler.plasma.t.values - git_id = git.Repo(search_parent_directories=True).head.object.hexsha - - result["INPUT"] = { - "GIT_ID": f"{git_id}", - "USER": f"{getpass.getuser()}", - "SETTINGS": self.config, - "DATETIME": datetime.utcnow().__str__(), - } - # TODO fix workflow - # result["INPUT"]["WORKFLOW"] = { - # diag_name.upper(): { - # # "PULSE": self.pulse, - # "USAGE": "".join( - # [quantity[1] for quantity in quant_list - # if quantity[0] == diag_name] - # ), - # "RUN": "PLACEHOLDER", - # } - # for diag_name in self.model_coordinator.models.keys() - # } - - result["DIAG_DATA"] = { - diag_name.upper(): { - quantity[1].upper(): self.opt_data[f"{quantity[0]}.{quantity[1]}"] - for quantity in quant_list - if quantity[0] == diag_name - } - for diag_name in self.model_coordinator.model_names - } - - return result - - def _build_result_dict( - self, - ): - result = {} - quant_list = [item.split(".") for item in self.quant_to_optimise] - - result["MODEL_DATA"] = { - diag_name.upper(): { - quantity[1].upper(): self.blobs[f"{quantity[0]}.{quantity[1]}"] - for quantity in quant_list - if quantity[0] == diag_name - } - for diag_name in self.model_coordinator.model_names - } - result["MODEL_DATA"]["SAMPLE_IDX"] = np.arange( - 0, self.opt_samples["post_sample"].shape[1] - ) - - result["PHANTOMS"] = { - "FLAG": self.plasma_profiler.phantom, - "NE": self.plasma_profiler.phantom_profiles["electron_density"], - "TE": self.plasma_profiler.phantom_profiles["electron_temperature"], - "TI": self.plasma_profiler.phantom_profiles["ion_temperature"], - "NI": self.plasma_profiler.phantom_profiles["ion_density"], - "NNEUTR": self.plasma_profiler.phantom_profiles["neutral_density"], - "NFAST": self.plasma_profiler.phantom_profiles["fast_density"], - "ZEFF": self.plasma_profiler.phantom_profiles["zeff"].sum(dim="element"), - "MEANZ": self.plasma_profiler.phantom_profiles["meanz"], - "PTH": self.plasma_profiler.phantom_profiles["pressure_th"], - "PFAST": self.plasma_profiler.phantom_profiles["pressure_fast"], - "P": self.plasma_profiler.phantom_profiles["pressure_tot"], - "VTOR": self.plasma_profiler.phantom_profiles["toroidal_rotation"], - } - - result["PROFILES"] = { - "PSI_NORM": { - "RHOP": self.plasma_profiler.plasma.rho, - "RHOT": self.plasma_profiler.plasma.equilibrium.rhotor.interp( - t=self.plasma_profiler.plasma.t - ), - "VOLUME": self.plasma_profiler.plasma.volume, - "NE": self.blobs["electron_density"].median(dim="sample_idx"), - "NI": self.blobs["ion_density"].median(dim="sample_idx"), - "TE": self.blobs["electron_temperature"].median(dim="sample_idx"), - "TI": self.blobs["ion_temperature"].median(dim="sample_idx"), - "NFAST": self.blobs["fast_density"].median(dim="sample_idx"), - "NNEUTR": self.blobs["neutral_density"].median(dim="sample_idx"), - "P": self.blobs["pressure_tot"].median(dim="sample_idx"), - "PTH": self.blobs["pressure_th"].median(dim="sample_idx"), - "PFAST": self.blobs["pressure_fast"].median(dim="sample_idx"), - "ZEFF": self.blobs["zeff"].sum("element").median(dim="sample_idx"), - "MEANZ": self.blobs["meanz"].median(dim="sample_idx"), - "NE_ERR": self.blobs["electron_density"].std(dim="sample_idx"), - "NI_ERR": self.blobs["ion_density"].std(dim="sample_idx"), - "TE_ERR": self.blobs["electron_temperature"].std(dim="sample_idx"), - "TI_ERR": self.blobs["ion_temperature"].std(dim="sample_idx"), - "NFAST_ERR": self.blobs["fast_density"].std(dim="sample_idx"), - "NNEUTR_ERR": self.blobs["neutral_density"].std(dim="sample_idx"), - "P_ERR": self.blobs["pressure_tot"].std(dim="sample_idx"), - "PTH_ERR": self.blobs["pressure_th"].std(dim="sample_idx"), - "PFAST_ERR": self.blobs["pressure_fast"].std(dim="sample_idx"), - "ZEFF_ERR": self.blobs["zeff"].sum("element").std(dim="sample_idx"), - "MEANZ_ERR": self.blobs["meanz"].std(dim="sample_idx"), - "VTOR": self.blobs["toroidal_rotation"].median(dim="sample_idx"), - "VTOR_ERR": self.blobs["toroidal_rotation"].std(dim="sample_idx"), - }, - "R_MIDPLANE": { - "RPOS": self.plasma_profiler.plasma.R_midplane, - "ZPOS": self.plasma_profiler.plasma.z_midplane, - "NE": self.midplane_blobs["electron_density"].median(dim="sample_idx"), - "NI": self.midplane_blobs["ion_density"].median(dim="sample_idx"), - "TE": self.midplane_blobs["electron_temperature"].median( - dim="sample_idx" - ), - "TI": self.midplane_blobs["ion_temperature"].median(dim="sample_idx"), - "NFAST": self.midplane_blobs["fast_density"].median(dim="sample_idx"), - "NNEUTR": self.midplane_blobs["neutral_density"].median( - dim="sample_idx" - ), - "P": self.midplane_blobs["pressure_tot"].median(dim="sample_idx"), - "PTH": self.midplane_blobs["pressure_th"].median(dim="sample_idx"), - "PFAST": self.midplane_blobs["pressure_fast"].median(dim="sample_idx"), - "ZEFF": self.midplane_blobs["zeff"] - .sum("element") - .median(dim="sample_idx"), - "MEANZ": self.midplane_blobs["meanz"].median(dim="sample_idx"), - "NE_ERR": self.midplane_blobs["electron_density"].std(dim="sample_idx"), - "NI_ERR": self.midplane_blobs["ion_density"].std(dim="sample_idx"), - "TE_ERR": self.midplane_blobs["electron_temperature"].std( - dim="sample_idx" - ), - "TI_ERR": self.midplane_blobs["ion_temperature"].std(dim="sample_idx"), - "NFAST_ERR": self.midplane_blobs["fast_density"].std(dim="sample_idx"), - "NNEUTR_ERR": self.midplane_blobs["neutral_density"].std( - dim="sample_idx" - ), - "P_ERR": self.midplane_blobs["pressure_tot"].std(dim="sample_idx"), - "PTH_ERR": self.midplane_blobs["pressure_th"].std(dim="sample_idx"), - "PFAST_ERR": self.midplane_blobs["pressure_fast"].std(dim="sample_idx"), - "ZEFF_ERR": self.midplane_blobs["zeff"] - .sum("element") - .std(dim="sample_idx"), - "MEANZ_ERR": self.midplane_blobs["meanz"].std(dim="sample_idx"), - "VTOR": self.midplane_blobs["toroidal_rotation"].median( - dim="sample_idx" - ), - "VTOR_ERR": self.midplane_blobs["toroidal_rotation"].std( - dim="sample_idx" - ), - }, - } - - result["PROFILE_STAT"] = { - "SAMPLE_IDX": np.arange(0, self.opt_samples["post_sample"].shape[1]), - "RHOP": self.plasma_profiler.plasma.rho, - "NE": self.blobs["electron_density"], - "NI": self.blobs["ion_density"], - "TE": self.blobs["electron_temperature"], - "TI": self.blobs["ion_temperature"], - "NFAST": self.blobs["fast_density"], - "NNEUTR": self.blobs["neutral_density"], - "P": self.blobs["pressure_tot"], - "PTH": self.blobs["pressure_th"], - "PFAST": self.blobs["pressure_fast"], - "ZEFF": self.blobs["zeff"].sum("element"), - "MEANZ": self.blobs["meanz"], - "VTOR": self.blobs["toroidal_rotation"], - } - - result["OPTIMISATION"] = { - "ACCEPT_FRAC": self.opt_samples["accept_frac"], - "PRIOR_SAMPLE": self.opt_samples["prior_sample"], - "POST_SAMPLE": self.opt_samples["post_sample"], - "AUTO_CORR": self.opt_samples["auto_corr"], - "PARAM_NAMES": self.optimiser_context.optimiser_settings.param_names, - "GP_REGRESSION": self.opt_samples.get("gp_regression", {}) - # "GELMAN_RUBIN": gelman_rubin(self.sampler.get_chain(flat=False)) - } - - result["GLOBAL"] = { - "VOLUME": self.plasma_profiler.plasma.volume.max(dim="rho_poloidal"), - "TI0": self.blobs["ion_temperature"] - .sel(rho_poloidal=0, method="nearest") - .median(dim="sample_idx"), - "TE0": self.blobs["electron_temperature"] - .sel(rho_poloidal=0, method="nearest") - .median(dim="sample_idx"), - "NE0": self.blobs["electron_density"] - .sel(rho_poloidal=0, method="nearest") - .median(dim="sample_idx"), - "NI0": self.blobs[ - "ion_density" - ] # TODO: where to concat the impurity_density onto this - .sel(rho_poloidal=0, method="nearest") - .median(dim="sample_idx"), - "WP": self.blobs["wp"].median(dim="sample_idx"), - "WTH": self.blobs["wth"].median(dim="sample_idx"), - "ZEFF_AVG": self.midplane_blobs["zeff"] - .sum(dim="element") - .median(dim="sample_idx") - .mean(dim="R"), - "NNEUTR0": self.blobs["neutral_density"] - .sel(rho_poloidal=0, method="nearest") - .median(dim="sample_idx"), - "NNEUTRB": self.blobs["neutral_density"] - .sel(rho_poloidal=1, method="nearest") - .median(dim="sample_idx"), - "TI0_ERR": self.blobs["ion_temperature"] - .sel(rho_poloidal=0, method="nearest") - .std(dim="sample_idx"), - "TE0_ERR": self.blobs["electron_temperature"] - .sel(rho_poloidal=0, method="nearest") - .std(dim="sample_idx"), - "NE0_ERR": self.blobs["electron_density"] - .sel(rho_poloidal=0, method="nearest") - .std(dim="sample_idx"), - "NI0_ERR": self.blobs["ion_density"] - .sel(rho_poloidal=0, method="nearest") - .std(dim="sample_idx"), - "WTH_ERR": self.blobs["wth"].std(dim="sample_idx"), - "WP_ERR": self.blobs["wp"].std(dim="sample_idx"), - "ZEFF_AVG_ERR": self.midplane_blobs["zeff"] - .sum(dim="element") - .std(dim="sample_idx") - .mean(dim="R"), - "NNEUTR0_ERR": self.blobs["neutral_density"] - .sel(rho_poloidal=0, method="nearest") - .std(dim="sample_idx"), - "NNEUTRB_ERR": self.blobs["neutral_density"] - .sel(rho_poloidal=1, method="nearest") - .std(dim="sample_idx"), - "VTOR0": self.blobs["toroidal_rotation"] - .sel(rho_poloidal=0, method="nearest") - .median(dim="sample_idx"), - "VTOR0_ERR": self.blobs["toroidal_rotation"] - .sel(rho_poloidal=0, method="nearest") - .std(dim="sample_idx"), - } - return result - - def __call__( - self, - filepath="./results/test", - run="RUN01", - run_info="Default run", - mds_write=False, - best=True, - pulse_to_write=None, - plot=False, - config=None, - logger=logging.getLogger(), - ): - self.config = config - self.result = self._build_inputs_dict() - results = [] - time_iterator = iter(self.plasma_profiler.plasma.t) - - for time in time_iterator: - self.plasma_profiler.plasma.time_to_calculate = time - logger.info(f"Time: {time.values:.2f}") - self.optimiser_context.sample_start_points() - self.optimiser_context.run() - results.append(self.optimiser_context.post_process_results()) - self.optimiser_context.reset_optimiser() - - # unpack results and add time axis - blobs = {} - for key in results[0]["blobs"].keys(): - _blob = [result["blobs"][key] for result in results] - blobs[key] = xr.concat(_blob, self.plasma_profiler.plasma.t) - self.blobs = blobs - self.midplane_blobs = self.plasma_profiler.map_plasma_profile_to_midplane(blobs) - - opt_samples = {} - for key in results[0].keys(): - if key == "blobs": - continue - _opt_samples = [result[key] for result in results] - opt_samples[key] = np.array(_opt_samples) - self.opt_samples = opt_samples - - result = self._build_result_dict() - self.result = dict(self.result, **result) - - if mds_write or plot: - save_pickle( - self.result, - filepath=filepath, - ) - - self.result = dict_of_dataarray_to_numpy(self.result) - - if mds_write: - logger.info(f"Writing MDS+ for pulse: {pulse_to_write}") - tree_exists = does_tree_exist(pulse_to_write) - if tree_exists: - mode = "EDIT" - else: - mode = "NEW" - self.node_structure = create_nodes( - pulse_to_write=pulse_to_write, - best=best, - run=run, - run_info=run_info, - diagnostic_quantities=self.quant_to_optimise, - mode=mode, - debug=False, - ) - write_nodes(pulse_to_write, self.result, self.node_structure, debug=False) - - if plot: - plot_bayes_result(filepath=filepath) - return diff --git a/indica/workflows/bda/bayesblackbox.py b/indica/workflows/bda/bayesblackbox.py deleted file mode 100644 index 4300db1d..00000000 --- a/indica/workflows/bda/bayesblackbox.py +++ /dev/null @@ -1,119 +0,0 @@ -from copy import deepcopy -from typing import Callable -import warnings - -from flatdict import FlatDict -import mpmath as mp -import numpy as np - -from indica.models.plasma import PlasmaProfiler -from indica.workflows.bda.priors import PriorManager - -np.seterr(all="ignore") -warnings.simplefilter("ignore", category=FutureWarning) - -# using mpmath to handle small numbers as floats insufficient -# wrapping mp functions to process numpy arrays -gaussian = np.frompyfunc(mp.npdf, 3, 1) -log = np.frompyfunc(mp.log, 1, 1) -to_float = np.frompyfunc(float, 1, 1) - - -def mp_log_gauss_wrapper(x, mean, sigma): - # dropping nans to speed up calculation - nan_idx = np.isnan(x) | np.isnan(mean) | np.isnan(sigma) - x_star = x[~nan_idx] * mp.mpf(1) # change dtype to mp float - mean_star = mean[~nan_idx] * mp.mpf(1) - sigma_star = sigma[~nan_idx] * mp.mpf(1) - y = gaussian(x_star, mean_star, sigma_star) - ln_y = to_float(log(y)) # mpf -> float - return np.hstack(ln_y[:]).astype(float) # convert from datatype object to float - - -class BayesBlackBox: - """ - Bayesian black box model that creates _ln_posterior function - from plasma and diagnostic model objects - - Parameters - ---------- - data - processed diagnostic data of format [diagnostic].[quantity] - quant_to_optimise - quantities from data which will be optimised with bckc from diagnostic_models - plasma_profiler - plasma interface has methods for setting profiles in plasma - build_bckc - function to return model data called by ln_posterior - prior_manager - prior class which calculates ln_prior from given parameters - - """ - - def __init__( - self, - opt_data: dict, - quant_to_optimise: list, - prior_manager: PriorManager, - build_bckc: Callable, - plasma_profiler: PlasmaProfiler, - ): - self.opt_data = opt_data - self.quant_to_optimise = quant_to_optimise - self.prior_manager = prior_manager - self.build_bckc = build_bckc - self.plasma_profiler = plasma_profiler - - missing_data = list(set(quant_to_optimise).difference(opt_data.keys())) - if missing_data: - raise ValueError(f"{missing_data} not found in data given") - - def ln_likelihood(self): - ln_likelihood = 0 - time_coord = self.plasma_profiler.plasma.time_to_calculate - - for key in self.quant_to_optimise: - model_data = self.bckc[key].values - exp_data = self.opt_data[key].sel(t=time_coord).values - exp_error = self.opt_data[key].sel(t=time_coord).error.values - - _ln_likelihood = mp_log_gauss_wrapper(model_data, exp_data, exp_error) - ln_likelihood += np.nansum(_ln_likelihood) - - return ln_likelihood - - def ln_posterior(self, parameters: dict, **kwargs): - """ - Posterior probability given to optimisers - - Parameters - ---------- - parameters - inputs to optimise - kwargs - kwargs for models - - Returns - ------- - ln_posterior - log of posterior probability - blob - model outputs from bckc and kinetic profiles - """ - - _ln_prior = self.prior_manager.ln_prior(parameters) - if _ln_prior == -np.inf: # Don't call models if outside priors - return -np.inf, {} - - self.plasma_profiler(parameters) - plasma_attributes = self.plasma_profiler.plasma_attributes() - - self.bckc = FlatDict( - self.build_bckc(flat_kwargs=parameters, **kwargs), "." - ) # model calls - - _ln_likelihood = self.ln_likelihood() # compare results to data - ln_posterior = _ln_likelihood + _ln_prior - - blob = deepcopy({**self.bckc, **plasma_attributes}) - return ln_posterior, blob diff --git a/indica/workflows/bda/bda_run.py b/indica/workflows/bda/bda_run.py deleted file mode 100644 index fbeafec6..00000000 --- a/indica/workflows/bda/bda_run.py +++ /dev/null @@ -1,415 +0,0 @@ -import logging -import os -import pprint - -import flatdict -import hydra -from omegaconf import DictConfig -from omegaconf import OmegaConf - -import indica -from indica.defaults.load_defaults import load_default_objects -from indica.models import ChargeExchangeSpectrometer -from indica.models import EquilibriumReconstruction -from indica.models import HelikeSpectrometer -from indica.models import Interferometer -from indica.models import Plasma -from indica.models import ThomsonScattering -from indica.models.plasma import PlasmaProfiler -from indica.profilers.profiler_gauss import initialise_gauss_profilers -from indica.readers.read_st40 import ReadST40 -from indica.workflows.bda.bayes_workflow import BayesWorkflow -from indica.workflows.bda.model_coordinator import ModelCoordinator -from indica.workflows.bda.optimiser_context import BOOptimiser -from indica.workflows.bda.optimiser_context import BOSettings -from indica.workflows.bda.optimiser_context import EmceeOptimiser -from indica.workflows.bda.optimiser_context import EmceeSettings -from indica.workflows.bda.pca import pca_workflow -from indica.workflows.bda.priors import PriorManager - - -def deep_update(mapping: dict, *updating_mappings: dict) -> dict: - updated_mapping = mapping.copy() - for updating_mapping in updating_mappings: - for k, v in updating_mapping.items(): - if ( - k in updated_mapping - and isinstance(updated_mapping[k], dict) - and isinstance(v, dict) - ): - updated_mapping[k] = deep_update(updated_mapping[k], v) - else: - updated_mapping[k] = v - return updated_mapping - - -ERROR_FUNCTIONS = { - "ts.ne": lambda x: x * 0 + 0.05 * x.max(dim="channel"), - "ts.te": lambda x: x * 0 + 0.05 * x.max(dim="channel"), - "efit.wp": lambda x: x * 0.10, - "xrcs.raw_spectra": lambda x: x * 0.05 - + 0.01 * x.max(dim="wavelength") - + ( - x.where( - (x.wavelength < 0.392) & (x.wavelength > 0.388), - ).std("wavelength") - ).fillna(0), - "cxff_pi.ti": lambda x: x * 0 + 0.20 * x.max(dim="channel"), - "cxff_tws_c.ti": lambda x: x * 0 + 0.10 * x.max(dim="channel"), - "cxff_tws_b.ti": lambda x: x * 0 + 0.10 * x.max(dim="channel"), -} - - -def add_error_to_opt_data(opt_data: dict, error_functions=None, verbose=True): - if error_functions is None: - error_functions = ERROR_FUNCTIONS - - opt_data_with_error = {} - for key, value in opt_data.items(): - if key not in error_functions.keys(): - opt_data_with_error[key] = value - if verbose: - print(f"no error function defined for {key}") - continue - error = error_functions[key](value) - opt_data_with_error[key] = value.assign_coords({"error": error}) - return opt_data_with_error - - -INSTRUMENT_MAPPING: dict = { - "xrcs": HelikeSpectrometer, - "cxff_pi": ChargeExchangeSpectrometer, - "cxff_tws_c": ChargeExchangeSpectrometer, - "cxff_tws_b": ChargeExchangeSpectrometer, - "smmh1": Interferometer, - "efit": EquilibriumReconstruction, - "ts": ThomsonScattering, -} - - -@hydra.main( - version_base=None, - config_path="../../configs/workflows/bda_run", - config_name="template_bo", -) -def bda_run( # noqa: C901 - cfg: DictConfig, -): - if cfg.writer.pulse_to_write is None: - cfg.writer.pulse_to_write = cfg.pulse - - log = logging.getLogger(__name__) - log.info(f"Beginning BDA for pulse {cfg.pulse}") - dirname = f"{cfg.writer.pulse_to_write}.{cfg.writer.run}" - log.info(f"Will write to {cfg.writer.pulse_to_write}.{cfg.writer.run}") - - log.info("Initialising plasma") - plasma = Plasma( - tstart=cfg.tstart, - tend=cfg.tend, - dt=cfg.dt, - **cfg.plasma.settings, - ) - - log.info("Initialising plasma_profiler") - profilers = initialise_gauss_profilers( - plasma.rho, - profile_names=cfg.plasma.profiles.keys(), - profile_params=OmegaConf.to_container(cfg.plasma.profiles), - ) - plasma_profiler = PlasmaProfiler( - plasma=plasma, profilers=profilers, map_vtor=cfg.reader.map_vtor - ) - plasma_profiler() - - if cfg.reader.set_ts or cfg.reader.apply_rshift: - log.info("PPTS reading") - ppts_reader = ReadST40( - pulse=cfg.pulse + cfg.reader.ppts_modelling_number, - tstart=cfg.tstart, - tend=cfg.tend, - dt=cfg.dt, - tree="ppts", - ) - ppts_reader( - ["ppts"], - revisions=OmegaConf.to_container(cfg.reader.revisions), - fetch_equilbrium=False, - ) - - if cfg.reader.set_ts: - # interp ppts profiles as some are empty - log.info("Setting profiles from PPTS") - ppts_profs = ppts_reader.filtered_data["ppts"] - ne = ( - ppts_profs["ne_rho"] - .interpolate_na(dim="t") - .ffill("t") - .bfill("t") - .interp( - t=plasma.t, - ) - .interp(rho_poloidal=plasma.rho) - ) - te = ( - ppts_profs["te_rho"] - .interpolate_na(dim="t") - .ffill("t") - .bfill("t") - .interp( - t=plasma.t, - ) - .interp(rho_poloidal=plasma.rho) - ) - plasma_profiler.set_profiles( - { - "electron_density": ne, - "electron_temperature": te, - } - ) - - plasma_profiler.save_phantoms(phantom=cfg.reader.phantom) - - # if binned data is used then interpolating onto equil.t - # and back to plasma.t causes some time points to be lost - R_shift = 0.0 - if cfg.reader.apply_rshift: - R_shift = ppts_reader.raw_data["ppts"]["R_shift"].drop_vars("error") - log.info("R shift being used") - - if cfg.reader.mock: - log.info("Using mock equilibrium") - equilibrium = load_default_objects("st40", "equilibrium") - else: - log.info("Reading equilibrium") - equil_reader = ReadST40( - pulse=cfg.reader.equilibrium.modelling_number + cfg.pulse, - tstart=cfg.tstart, - tend=cfg.tend, - dt=cfg.dt, - ) - equil_reader( - [cfg.reader.equilibrium.code], - revisions=OmegaConf.to_container(cfg.reader.equilibrium.revisions), - R_shift=R_shift, - ) - equilibrium = equil_reader.equilibrium - - plasma.set_equilibrium(equilibrium=equilibrium) - - if cfg.reader.mock: - log.info("Using mock data reader") - transforms = load_default_objects("st40", "geometry") - models = {diag: INSTRUMENT_MAPPING[diag] for diag in cfg.model.diagnostics} - reader = ModelCoordinator( - models, - OmegaConf.to_container(cfg.model.settings), - ) - reader.set_transforms(transforms) - reader.set_equilibrium( - equilibrium, - ) - reader.set_plasma(plasma) - - elif cfg.reader.phantom: - log.info("Using phantom reader") - phantom_reader = ReadST40( - pulse=cfg.pulse, - tstart=cfg.tstart, - tend=cfg.tend, - dt=cfg.dt, - ) - phantom_reader( - cfg.diagnostics, - revisions=OmegaConf.to_container(cfg.data_info.revisions), - R_shift=R_shift, - **cfg.reader.filters, - ) - models = {diag: INSTRUMENT_MAPPING[diag] for diag in cfg.pulse_info.diagnostics} - if "xrcs" in phantom_reader.binned_data.keys(): - more_model_settings = { - "xrcs": { - "window": phantom_reader.binned_data["xrcs"]["intens"].wavelength - } - } - else: - more_model_settings = {} - - reader = ModelCoordinator( - models, - {**OmegaConf.to_container(cfg.model.settings), **more_model_settings}, - ) - reader.set_transforms(phantom_reader.transforms) - reader.set_equilibrium( - equilibrium, - ) - reader.set_plasma(plasma) - - else: - log.info("Using default reader") - reader = ReadST40( - pulse=cfg.pulse, - tstart=cfg.tstart, - tend=cfg.tend, - dt=cfg.dt, - ) - - reader( - cfg.model.diagnostics, - revisions=OmegaConf.to_container(cfg.reader.revisions), - R_shift=R_shift, - fetch_equilbrium=False, - **cfg.reader.filters, - ) - - vtor = None - if cfg.reader.map_vtor: - for diagnostic in cfg.model.diagnostics: - if "cxff" in diagnostic: - vtor = reader.binned_data[diagnostic]["vtor"] - if vtor is None: - raise ValueError("map_vtor is True but no vtor data to use") - for t in plasma.t: - plasma_profiler( - parameters={ - "toroidal_rotation.y0": vtor.max("channel").sel(t=t).values - }, - t=t, - ) - - # post processing (TODO: where should this be) - flat_data = flatdict.FlatDict(reader.binned_data, ".") - log.info("Applying error to opt_data") - opt_data = add_error_to_opt_data(flat_data, verbose=False) - - models = {diag: INSTRUMENT_MAPPING[diag] for diag in cfg.model.diagnostics} - if "xrcs" in reader.binned_data.keys(): - more_model_settings = { - "xrcs": { - "window": reader.binned_data["xrcs"]["raw_spectra"].wavelength, - "background": reader.binned_data["xrcs"].get("background", 0), - }, - } - else: - more_model_settings = {} - log.info("Initialising ModelCoordinator") - model_coordinator = ModelCoordinator( - models=models, - model_settings=deep_update( - OmegaConf.to_container(cfg.model.settings), - more_model_settings, - ), - verbose=False, - ) - if "xrcs" in reader.binned_data.keys(): - model_call_kwargs = { - "xrcs": { - "pixel_offset": -1, - "norm_spectra": reader.binned_data["xrcs"]["raw_spectra"].max( - "wavelength" - ), - } - } - else: - model_call_kwargs = {} - - model_coordinator.set_transforms(reader.transforms) - model_coordinator.set_equilibrium(equilibrium) - model_coordinator.set_plasma(plasma) - - log.info("initialising PriorManager") - prior_manager = PriorManager(**cfg.priors) - - if any(cfg.optimisation.pca_profiles): - log.info(f"Using PCA profiles: {cfg.optimisation.pca_profiles}") - pca_processor, pca_profilers = pca_workflow( - prior_manager, - cfg.optimisation.pca_profiles, - plasma.rho, - n_components=cfg.optimisation.pca_components, - num_prof_samples=int(5e3), - ) - prior_manager.update_priors(pca_processor.compound_priors) - plasma_profiler.update_profilers(pca_profilers) - opt_params = [ - param - for param in cfg.optimisation.param_names - if param.split(".")[0] not in cfg.optimisation.pca_profiles - ] - opt_params.extend( - prior_manager.get_param_names_for_profiles(cfg.optimisation.pca_profiles) - ) - log.info(f"optimising with: {opt_params}") - else: - opt_params = list(cfg.optimisation.param_names) - - if cfg.optimisation.method == "emcee": - optimiser_settings = EmceeSettings( - param_names=opt_params, - nwalkers=cfg.optimisation.nwalkers, - iterations=cfg.optimisation.iterations, - sample_method=cfg.optimisation.sample_method, - starting_samples=cfg.optimisation.starting_samples, - burn_frac=cfg.optimisation.burn_frac, - stopping_criteria=cfg.optimisation.stopping_criteria, - stopping_criteria_factor=cfg.optimisation.stopping_criteria_factor, - stopping_criteria_debug=True, - ) - - log.info("Initialising Ecmee Optimiser Context") - optimiser_context = EmceeOptimiser( - optimiser_settings=optimiser_settings, - prior_manager=prior_manager, - model_kwargs=model_call_kwargs, - ) - elif cfg.optimisation.method == "bo": - optimiser_settings = BOSettings( - param_names=opt_params, - n_calls=cfg.optimisation.n_calls, - n_initial_points=cfg.optimisation.n_initial_points, - acq_func=cfg.optimisation.acq_func, - xi=cfg.optimisation.xi, - noise=cfg.optimisation.noise, - initial_point_generator=cfg.optimisation.initial_point_generator, - use_previous_best=cfg.optimisation.use_previous_best, - model_samples=cfg.optimisation.model_samples, - boundary_samples=cfg.optimisation.boundary_samples, - posterior_samples=cfg.optimisation.posterior_samples, - ) - log.info("Initialising BO Optimiser Context") - optimiser_context = BOOptimiser( - optimiser_settings, - prior_manager, - model_kwargs=model_call_kwargs, - ) - else: - raise ValueError( - f"cfg.optimisation.method: {cfg.optimisation.method} not implemented" - ) - - workflow = BayesWorkflow( - quant_to_optimise=cfg.model.quantities, - opt_data=opt_data, - optimiser_context=optimiser_context, - plasma_profiler=plasma_profiler, - model_coordinator=model_coordinator, - prior_manager=prior_manager, - ) - - filepath = os.path.dirname(indica.__file__) + f"/../results/{dirname}/" - log.info("Running BDA") - workflow( - pulse_to_write=cfg.writer.pulse_to_write, - run=cfg.writer.run, - run_info=cfg.writer.run_info, - best=cfg.writer.best, - mds_write=cfg.writer.mds_write, - plot=cfg.writer.plot, - filepath=filepath, - config=pprint.pformat(dict(cfg)), - logger=log, - ) - - -if __name__ == "__main__": - bda_run() diff --git a/indica/workflows/bda/model_coordinator.py b/indica/workflows/bda/model_coordinator.py deleted file mode 100644 index 51cef882..00000000 --- a/indica/workflows/bda/model_coordinator.py +++ /dev/null @@ -1,133 +0,0 @@ -from typing import Dict - -import xarray as xr - -from indica.converters.abstractconverter import CoordinateTransform -from indica.equilibrium import Equilibrium -from indica.models import Plasma -from indica.models.abstract_diagnostic import AbstractDiagnostic -from indica.readers.read_st40 import apply_filter -from indica.readers.read_st40 import coord_condition -from indica.readers.read_st40 import limit_condition - - -class ModelCoordinator: - def __init__( - self, - models: dict[str, AbstractDiagnostic], - model_settings: dict = None, - verbose=False, - ): - - self.transforms = None - self.plasma = None - self.equilibrium = None - if model_settings is None: - model_settings = {} - self.model_settings = model_settings - self.model_names = list(models.keys()) - self.verbose = verbose - - self.models: dict[str, AbstractDiagnostic] = {} - for model_name, model in models.items(): - self.models[model_name] = model( - name=model_name, **self.model_settings.get(model_name, {}) - ) - - def set_plasma(self, plasma: Plasma): - self.plasma = plasma - for model_name, model in self.models.items(): - model.set_plasma(plasma) - - def set_transforms(self, transforms: dict[CoordinateTransform]): - self.transforms = transforms - for model_name, model in self.models.items(): - if model_name in transforms.keys(): - model.set_transform(transforms[model_name]) - - def set_equilibrium(self, equilibrium: Equilibrium): - self.equilibrium = equilibrium - for model_name, model in self.models.items(): - if hasattr(model, "transform"): - model.transform.set_equilibrium(equilibrium, force=True) - - def get( - self, - instrument: str, - **kwargs, - ) -> Dict[str, xr.DataArray]: - """ - Method set to replicate the get() method of the readers - """ - if instrument in self.models: - return self.models[instrument](**kwargs) - else: - print(f"{instrument} not in self.models") - return {} - - def __call__( - self, - instruments: list = None, - filter_limits: dict = None, - filter_coords: dict = None, - flat_kwargs: dict = None, - **kwargs, - ): - """ - Parameters - ---------- - instruments - names of instruments to call - filter_limits - filtering data if outside of filter_limits - filter_coords - filtering data if coordinates outside of filter_coords - flat_kwargs - flat kwargs to call models with - - Returns - ------- - nested dictionary of results - """ - - if flat_kwargs is None: - flat_kwargs = {} - if instruments is None: - instruments = self.model_names - if filter_coords is None: - filter_coords = {} - if filter_limits is None: - filter_limits = {} - - call_kwargs = {} - for instrument in instruments: - # format the model settings before calling them - # reformat structure to remove prefix e.g. xrcs.background -> background - _params = { - param_name.replace(instrument + ".", ""): param_value - for param_name, param_value in flat_kwargs.items() - if instrument in param_name - } - call_kwargs[instrument] = {**_params, **kwargs.get(instrument, {})} - self.call_kwargs = call_kwargs - - self.data: dict = {} - for instrument in instruments: - self.data[instrument] = self.get( - instrument, - **call_kwargs[instrument], - ) - - self.filtered_data = apply_filter( - self.data, - filters=filter_limits, - filter_func=limit_condition, - filter_func_name="limits", - verbose=self.verbose, - ) - self.filtered_data = apply_filter( - self.filtered_data, - filters=filter_coords, - filter_func=coord_condition, - filter_func_name="co-ordinate", - verbose=self.verbose, - ) - self.binned_data = self.filtered_data - - return self.binned_data diff --git a/indica/workflows/bda/optimiser_context.py b/indica/workflows/bda/optimiser_context.py deleted file mode 100644 index ee7b3e86..00000000 --- a/indica/workflows/bda/optimiser_context.py +++ /dev/null @@ -1,504 +0,0 @@ -from abc import ABC -from abc import abstractmethod -from collections.abc import Callable -from dataclasses import dataclass -from dataclasses import field -from functools import partial -import logging -from operator import itemgetter - -from dime_sampler import DIMEMove -import emcee -import mpmath as mp -import numpy as np -import pandas as pd -from scipy.stats import describe -from scipy.stats import gaussian_kde -import skopt -import xarray as xr - -from indica.workflows.bda.priors import ln_prior -from indica.workflows.bda.priors import PriorManager -from indica.workflows.bda.priors import sample_best_half -from indica.workflows.bda.priors import sample_from_priors - -exp = np.frompyfunc(mp.exp, 1, 1) -to_float = np.frompyfunc(float, 1, 1) - - -def exp_wrapper(x: np.ndarray): - x_star = x * mp.mpf(1) - y_star = exp(x_star) - # y = to_float(y_star) - return np.hstack(y_star[:]) - - -def sample_with_moments( - sampler, - start_points, - iterations, - n_params, - auto_sample=10, - stopping_factor=0.01, - tune=False, - debug=False, -): - # TODO: Compare old_chain to new_chain - # if moments are different then keep going / convergence diagnostics here - - autocorr = np.ones(shape=(iterations, n_params)) * np.nan - old_mean = np.inf - success_flag = False # requires succeeding check twice in a row - for sample in sampler.sample( - start_points, - iterations=iterations, - progress=True, - skip_initial_state_check=False, - tune=tune, - ): - if sampler.iteration % auto_sample: - continue - new_tau = sampler.get_autocorr_time(tol=0) - autocorr[sampler.iteration - 1] = new_tau - - dist_stats = describe(sampler.get_chain(flat=True)) - - new_mean = dist_stats.mean - - dmean = np.abs(new_mean - old_mean) - rel_dmean = dmean / old_mean - - if debug: - print("") - print(f"rel_dmean: {rel_dmean.max()}") - if rel_dmean.max() < stopping_factor: - if success_flag: - break - else: - success_flag = True - else: - success_flag = False - old_mean = new_mean - - autocorr = autocorr[ - : sampler.iteration, - ] - return autocorr - - -def sample_with_autocorr( - sampler, - start_points, - iterations, - n_params, - auto_sample=5, -): - autocorr = np.ones(shape=(iterations, n_params)) * np.nan - old_tau = np.inf - for sample in sampler.sample( - start_points, - iterations=iterations, - progress=True, - skip_initial_state_check=False, - ): - if sampler.iteration % auto_sample: - continue - new_tau = sampler.get_autocorr_time(tol=0) - autocorr[ - sampler.iteration - 1, - ] = new_tau - converged = np.all(new_tau * 50 < sampler.iteration) - converged &= np.all(np.abs(old_tau - new_tau) / new_tau < 0.01) - if converged: - break - old_tau = new_tau - autocorr = autocorr[ - : sampler.iteration, - ] - return autocorr - - -def sample_from_high_density_region( - param_names: list, priors: dict, optimiser, nwalkers: int, nsamples=100 -): - num_best_points = 2 - index_best_start = [] - - while index_best_start.__len__() < num_best_points: - start_points = sample_from_priors(param_names, priors, size=nsamples) - ln_prob, _ = optimiser.compute_log_prob(start_points) - good_indices = np.argsort(ln_prob)[-num_best_points:] - index_best_start.extend(good_indices) - - index_best_start[:num_best_points] = index_best_start[:num_best_points] - best_start_points = start_points[index_best_start, :] - # Passing samples through ln_prior and redrawing if they fail - samples = np.empty((param_names.__len__(), 0)) - while samples.size < param_names.__len__() * nwalkers: - sample = np.random.uniform( - np.min(best_start_points, axis=0), - np.max(best_start_points, axis=0), - size=(nwalkers * 2, len(param_names)), - ) - start = {name: sample[:, idx] for idx, name in enumerate(param_names)} - _ln_prior = ln_prior( - priors, - start, - ) - # Convert from dictionary of arrays -> array, - # then filtering out where ln_prior is -infinity - accepted_samples = np.array(list(start.values()))[:, _ln_prior != -np.inf] - samples = np.append(samples, accepted_samples, axis=1) - start_points = samples[:, 0:nwalkers].transpose() - return start_points - - -def bo_wrapper(params: list, dims: list = None, blackbox: callable = None, **kwargs): - if dims is None: - raise ValueError("BO wrapper is missing dims") - if blackbox is None: - raise ValueError("BO wrapper is missing blackbox") - params = {dim: params[idx] for idx, dim in enumerate(dims)} - ln_post, blobs = blackbox({**params}, **kwargs) - return -ln_post # probability -> cost function - - -def gelman_rubin(chain): - ssq = np.var(chain, axis=1, ddof=1) - w = np.mean(ssq, axis=0) - theta_b = np.mean(chain, axis=1) - theta_bb = np.mean(theta_b, axis=0) - m = chain.shape[0] - n = chain.shape[1] - B = n / (m - 1) * np.sum((theta_bb - theta_b) ** 2, axis=0) - var_theta = (n - 1) / n * w + 1 / n * B - R = np.sqrt(var_theta / w) - return R - - -class OptimiserContext(ABC): - def __init__(self): - self.start_points = None - self.optimiser = None - - @abstractmethod - def init_optimiser(self, *args, **kwargs): - self.optimiser = None - - @abstractmethod - def sample_start_points(self, *args, **kwargs): - self.start_points = None - - @abstractmethod - def run(self): - results = None - return results - - @abstractmethod - def post_process_results(self): - results = {} - return results - - @abstractmethod - def reset_optimiser(self): - self.optimiser = None - self.start_points = None - - -@dataclass -class EmceeSettings: - param_names: list - iterations: int = 1000 - nwalkers: int = 50 - burn_frac: float = 0.20 - sample_method: str = "random" - starting_samples: int = 100 - stopping_criteria: str = "mode" - stopping_criteria_factor: float = 0.01 - stopping_criteria_sample: int = 10 - stopping_criteria_debug: bool = False - move: list = field(default_factory=lambda: [(DIMEMove(aimh_prob=0.2), 1.0)]) - - -class EmceeOptimiser(OptimiserContext): - def __init__( - self, - optimiser_settings: EmceeSettings, - prior_manager: PriorManager, - model_kwargs=None, - ): - super().__init__() - self.autocorr = None - self.optimiser_settings = optimiser_settings - self.prior_manager = prior_manager - self.model_kwargs = model_kwargs - self.ndim = len(self.optimiser_settings.param_names) - - def init_optimiser( - self, - blackbox_func: Callable, - ): # type: ignore - - self.optimiser = emcee.EnsembleSampler( - self.optimiser_settings.nwalkers, - self.ndim, - log_prob_fn=blackbox_func, - kwargs=self.model_kwargs, - parameter_names=self.optimiser_settings.param_names, - moves=self.optimiser_settings.move, - ) - - def sample_start_points( - self, - ): - - if self.optimiser_settings.sample_method == "high_density": - self.start_points = sample_from_high_density_region( - param_names=self.optimiser_settings.param_names, - priors=self.prior_manager.priors, - optimiser=self.optimiser, - nwalkers=self.optimiser_settings.nwalkers, - nsamples=self.optimiser_settings.starting_samples, - ) - elif self.optimiser_settings.sample_method == "random": - self.start_points = sample_from_priors( - param_names=self.optimiser_settings.param_names, - priors=self.prior_manager.priors, - size=self.optimiser_settings.nwalkers, - ) - else: - raise ValueError( - f"Sample method: {self.optimiser_settings.sample_method} " - f"not recognised, Defaulting to random sampling" - ) - - def run( - self, - ): - - if self.optimiser_settings.stopping_criteria == "mode": - self.autocorr = sample_with_moments( - self.optimiser, - self.start_points, - self.optimiser_settings.iterations, - self.optimiser_settings.param_names.__len__(), - auto_sample=self.optimiser_settings.stopping_criteria_sample, - stopping_factor=self.optimiser_settings.stopping_criteria_factor, - debug=self.optimiser_settings.stopping_criteria_debug, - ) - else: - raise ValueError( - f"Stopping criteria: " - f"{self.optimiser_settings.stopping_criteria} invalid" - ) - return - - def post_process_results(self): - results = {} - _blobs = self.optimiser.get_blobs( - discard=int(self.optimiser.iteration * self.optimiser_settings.burn_frac), - flat=True, - ) - blobs = [blob for blob in _blobs if blob] # remove empty blobs - - blob_names = blobs[0].keys() - samples = np.arange(0, blobs.__len__()) - - results["blobs"] = { - blob_name: xr.concat( - [data[blob_name] for data in blobs], - dim=pd.Index(samples, name="sample_idx"), - ) - for blob_name in blob_names - } - results["accept_frac"] = self.optimiser.acceptance_fraction.sum() - results["prior_sample"] = sample_from_priors( - self.optimiser_settings.param_names, - self.prior_manager.priors, - size=int(1e3), - ) - - post_sample = self.optimiser.get_chain( - discard=int(self.optimiser.iteration * self.optimiser_settings.burn_frac), - flat=True, - ) - # pad index dim with maximum number of iterations - max_iter = self.optimiser_settings.iterations * self.optimiser_settings.nwalkers - npad = ( - ( - 0, - int( - max_iter * (1 - self.optimiser_settings.burn_frac) - - post_sample.shape[0] - ), - ), - (0, 0), - ) - results["post_sample"] = np.pad(post_sample, npad, constant_values=np.nan) - results["auto_corr"] = self.autocorr - return results - - def reset_optimiser(self): - self.optimiser.reset() - - -@dataclass -class BOSettings: - param_names: list - n_calls: int = 30 - acq_func: str = "EI" - xi: float = 0.01 - kappa: float = 1.96 - n_initial_points: int = 10 - noise: float = 1e-10 - initial_point_generator: str = "lhs" - use_previous_best: bool = True - boundary_samples: int = int(1e3) - model_samples: int = 50 - posterior_samples: int = int(1e5) - - -class BOOptimiser(OptimiserContext): - def __init__( - self, - optimiser_settings: BOSettings, - prior_manager: PriorManager, - model_kwargs: dict = None, - ): - - super().__init__() - if model_kwargs is None: - model_kwargs = {} - self.model_kwargs = model_kwargs - self.wrapped_blackbox_func = None - self.blackbox_func = None - self.result = None - self.optimiser_settings = optimiser_settings - self.prior_manager = prior_manager - self.ndim = len(self.optimiser_settings.param_names) - - param_samples = sample_from_priors( - self.optimiser_settings.param_names, - self.prior_manager.priors, - size=self.optimiser_settings.boundary_samples, - ) - self.bounds = [ - (param_samples[:, idx].min(), param_samples[:, idx].max()) - for idx, _ in enumerate(self.optimiser_settings.param_names) - ] - - def init_optimiser( - self, - blackbox_func: Callable, - ): # type: ignore - self.optimiser = skopt.gp_minimize - self.blackbox_func = partial(blackbox_func, **self.model_kwargs) - self.wrapped_blackbox_func = partial( - bo_wrapper, - dims=self.optimiser_settings.param_names, - blackbox=blackbox_func, - **self.model_kwargs, - ) - - def reset_optimiser(self): - self.optimiser = skopt.gp_minimize - self.start_points = None - - def sample_start_points(self, *args, **kwargs): - - if self.optimiser_settings.use_previous_best and self.result is not None: - best_indices = np.argsort(self.result.func_vals)[ - : self.optimiser_settings.n_initial_points - ] - self.start_points = list( - itemgetter(*best_indices)( - self.result.x_iters, - ) - ) - else: - start_points = sample_best_half( - self.optimiser_settings.param_names, - self.prior_manager.priors, - self.wrapped_blackbox_func, - self.optimiser_settings.n_initial_points, - ) - self.start_points = start_points.tolist() - - def run( - self, - ): - self.result = self.optimiser( - self.wrapped_blackbox_func, - self.bounds, - acq_func=self.optimiser_settings.acq_func, - x0=self.start_points, - xi=self.optimiser_settings.xi, - kappa=self.optimiser_settings.kappa, - n_calls=self.optimiser_settings.n_calls, - n_initial_points=0, - noise=self.optimiser_settings.noise, - acq_optimizer="lbfgs", - initial_point_generator=self.optimiser_settings.initial_point_generator, - ) - - def post_process_results( - self, - ): - results = {"gp_regression": self.result} - model = self.result.models[-1] - - log = logging.getLogger() - log.info("kde posterior estimating") - - real_samples = np.array( - self.result.space.rvs(n_samples=self.optimiser_settings.posterior_samples) - ) - normed_samples = self.result.space.transform(real_samples) - - obj_func = model.predict(normed_samples) - posterior = exp_wrapper( - -obj_func - ) # log of objective function -> posterior probability - posterior /= posterior.max() - posterior = to_float(posterior) - posterior[posterior == 0] = 1e-100 - - posterior_fit = gaussian_kde(real_samples.T, weights=posterior) - - params = posterior_fit.resample(size=self.optimiser_settings.model_samples) - - blobs = [] - for model_sample_idx in range(self.optimiser_settings.model_samples): - _params = { - param_name: params[name_idx, model_sample_idx] - for name_idx, param_name in enumerate( - self.optimiser_settings.param_names - ) - } - - post, _blobs = self.blackbox_func(_params) - if _blobs: - blobs.append(_blobs) - - blob_names = blobs[0].keys() - samples = np.arange(0, blobs.__len__()) - - results["blobs"] = { - blob_name: xr.concat( - [data[blob_name] for data in blobs], - dim=pd.Index(samples, name="sample_idx"), - ) - for blob_name in blob_names - } - results["accept_frac"] = None - results["prior_sample"] = sample_from_priors( - self.optimiser_settings.param_names, - self.prior_manager.priors, - size=int(1e3), - ) - - results["post_sample"] = posterior_fit.resample(size=int(2e3)).T - results["auto_corr"] = np.zeros( - shape=(10, len(self.optimiser_settings.param_names)) - ) - return results diff --git a/indica/workflows/bda/pca.py b/indica/workflows/bda/pca.py deleted file mode 100644 index a2715905..00000000 --- a/indica/workflows/bda/pca.py +++ /dev/null @@ -1,329 +0,0 @@ -from dataclasses import dataclass -from dataclasses import field -from typing import Dict -from typing import Tuple - -from hydra import compose -from hydra import initialize_config_module -import matplotlib.pyplot as plt -import numpy as np -from scipy.interpolate import LinearNDInterpolator -from scipy.stats import gaussian_kde -from sklearn.decomposition import PCA -import xarray as xr - -from indica.profilers.profiler_basis import ProfilerBasis -from indica.profilers.profiler_gauss import ProfilerGauss -from indica.workflows.bda.priors import PriorCompound -from indica.workflows.bda.priors import PriorManager -from indica.workflows.bda.priors import sample_from_priors - - -def fit_pca(profiles: np.ndarray, ncomps, verbose=True) -> Tuple[np.ndarray, PCA]: - pca = PCA(n_components=ncomps) - pca.fit(profiles) - pca_profiles = pca.transform(profiles) - if verbose: - print(f"variance per component: {pca.explained_variance_ratio_ * 100}") - print(f"summed variance: {np.sum(pca.explained_variance_ratio_ * 100)}") - return pca_profiles, pca - - -def fit_linear_prior( - pca_profiles: np.ndarray, - prior_values=None, -) -> LinearNDInterpolator: - if prior_values is None: - prior_values = np.ones(shape=pca_profiles.shape[0]) - - prior_fit = LinearNDInterpolator( - pca_profiles, prior_values, fill_value=0, rescale=False - ) - return prior_fit - - -def fit_kde_prior( - linear_fit: LinearNDInterpolator, size=int(1e6), bw_method="scott" -) -> gaussian_kde: - sampled_points = linear_fit.points - min = sampled_points.min(axis=0) - max = sampled_points.max(axis=0) - ranges = [(min[idx], max[idx]) for idx in range(sampled_points.shape[1])] - - random_points = np.array([np.random.uniform(r[0], r[1], size=size) for r in ranges]) - accepted_points = random_points[:, linear_fit(*random_points).nonzero()[0]] - kernel = gaussian_kde(accepted_points, bw_method=bw_method) - return kernel - - -def _reconstruct_profile( - basis_function: np.ndarray, - bias: np.ndarray, - weights: np.ndarray, -): - return np.dot(weights, basis_function) + bias - - -def _plot_principle_comps(pca, profile_name): - plt.figure() - plt.title(f"{profile_name}: principle components") - for n in range(pca.components_.shape[0]): - plt.plot( - np.arange(pca.components_.shape[1]), - pca.components_[ - n, - ], - "-", - label=f"component {n + 1}", - ) - plt.ylabel("A.U.") - plt.xlabel("radial co-ordinate (-)") - plt.legend() - - -def _plot_profile_fits( - profiles: np.ndarray, - projected_profiles: np.ndarray, - profile_name, - nsamples: int = 100, -): - prof_array = xr.DataArray( - profiles, - dims=("index", "radial"), - coords=(np.arange(0, profiles.shape[0]), np.linspace(0, 1, profiles.shape[1])), - ) - proj_prof_array = xr.DataArray( - projected_profiles, - dims=("index", "radial"), - coords=( - np.arange(0, projected_profiles.shape[0]), - np.linspace(0, 1, projected_profiles.shape[1]), - ), - ) - - plt.figure() - plt.title(f"{profile_name}: Reconstructed Profiles") - plt.fill_between( - prof_array.radial, - prof_array.quantile(0.0, dim="index"), - prof_array.quantile(1.0, dim="index"), - label="min-max of input profiles", - zorder=3, - color="red", - alpha=0.5, - ) - - for sample in np.arange(0, nsamples): - plt.plot( - proj_prof_array.radial, - proj_prof_array.sel(index=sample), - zorder=3, - # color="blue", - # alpha=0.5, - ) - - plt.legend() - return - - -def _plot_KDE_comparison(kernel: gaussian_kde, prior: LinearNDInterpolator, size=1000): - plt.figure() - plt.title("KDE Samples") - if kernel.d == 3: - sample = kernel.resample(size=size).T - axs = plt.axes(projection="3d") - axs.scatter3D( - sample[:, 0], sample[:, 1], sample[:, 2], color="r", label="KDE Samples" - ) - axs.scatter3D( - prior.points[:, 0], - prior.points[:, 1], - prior.points[:, 2], - color="k", - label="Prior Samples", - ) - plt.legend() - - if kernel.d == 2: - xmin = prior.points[:, 0].min() - xmax = prior.points[:, 0].max() - ymin = prior.points[:, 1].min() - ymax = prior.points[:, 1].max() - X, Y = np.mgrid[xmin:xmax:50j, ymin:ymax:50j] - positions = np.vstack([X.ravel(), Y.ravel()]) - Z = np.reshape(kernel(positions).T, X.shape) - plt.imshow( - np.rot90(Z), - extent=[xmin, xmax, ymin, ymax], - cmap=plt.cm.gist_earth_r, - ) - plt.colorbar() - plt.plot( - prior.points[:, 0], - prior.points[:, 1], - "x", - color="k", - label="Prior Samples", - ) - plt.legend() - - -@dataclass -class PCAProcessor: - gaussian_profiles: Dict[str, np.ndarray] - - ncomps: int = field(default=2) - kde_size: int = field(default=int(1e6)) - pca_weights: Dict[str, np.ndarray] = field( - default_factory=lambda: {} - ) # (nsamples, ncomps) - reconstructed_profiles: Dict[str, np.ndarray] = field( - default_factory=lambda: {} - ) # (nsamples, xspl) - pca_fits: Dict[str, PCA] = field(default_factory=lambda: {}) - - linear_prior: Dict[str, LinearNDInterpolator] = field(default_factory=lambda: {}) - kde_prior: Dict[str, gaussian_kde] = field(default_factory=lambda: {}) - - def __post_init__(self): - """ - DO EVERYTHING. TODO: Break this up - """ - - for profile_name in self.gaussian_profiles.keys(): - print(f"PCA Profile: {profile_name}") - self.pca_weights[profile_name], self.pca_fits[profile_name] = fit_pca( - self.gaussian_profiles[profile_name], self.ncomps - ) - self.reconstructed_profiles[profile_name] = _reconstruct_profile( - self.pca_fits[profile_name].components_, - self.pca_fits[profile_name].mean_, - self.pca_weights[profile_name], - ) - - self.linear_prior[profile_name] = fit_linear_prior( - self.pca_weights[profile_name] - ) - self.kde_prior[profile_name] = fit_kde_prior( - self.linear_prior[profile_name], size=self.kde_size - ) - - def plot_profile(self, profile_name: str): - - _plot_profile_fits( - self.gaussian_profiles[profile_name], - self.reconstructed_profiles[profile_name], - profile_name, - ) - _plot_principle_comps(self.pca_fits[profile_name], profile_name) - _plot_KDE_comparison( - self.kde_prior[profile_name], self.linear_prior[profile_name] - ) - - def plot_all(self): - for name in self.gaussian_profiles.keys(): - self.plot_profile(name) - plt.show(block=True) - - -def pca_workflow( - prior_manager: PriorManager, - opt_profiles: list, - x_grid: xr.DataArray, - n_components=2, - num_prof_samples: int = int(1e5), - kde_samples: int = int(1e6), -): - param_names = prior_manager.get_param_names_for_profiles(opt_profiles) - param_samples: np.ndarray = sample_from_priors( - param_names, prior_manager.priors, size=num_prof_samples - ) - param_samples: Dict[str, np.ndarray] = { - param_name: param_samples[:, idx] for idx, param_name in enumerate(param_names) - } - - profilers = { - profile_name: ProfilerGauss( - datatype=profile_name.split(":")[0], - xspl=x_grid, - ) - for profile_name in opt_profiles - } - - profiles = sample_gauss_profiles( - param_samples, profilers=profilers, size=num_prof_samples - ) - - pca_processor = PCAProcessor( - gaussian_profiles=profiles, ncomps=n_components, kde_size=kde_samples - ) - pca_processor.compound_priors = { - f"{key}.kde": PriorCompound( - prior_func=kernel, - labels=tuple(f"{key}.weight_{i + 1}" for i in range(kernel.d)), - ) - for key, kernel in pca_processor.kde_prior.items() - } - - new_profilers = {} - for profile_name, _profiles in profiles.items(): - _basis_func = pca_processor.pca_fits[profile_name].components_ - _bias = pca_processor.pca_fits[profile_name].mean_ - new_profilers[profile_name] = ProfilerBasis( - basis_functions=_basis_func, - bias=_bias, - ncomps=n_components, - radial_grid=x_grid, - ) - return pca_processor, new_profilers - - -def sample_gauss_profiles( - sample_params: Dict[str, np.ndarray], profilers: dict, size: int -) -> Dict[str, np.ndarray]: - # TODO: Vectorise profilers? (only if pca too slow) - profiles = {} - for _profile_name, _profiler in profilers.items(): - - _params = { - key.split(".")[1]: value - for key, value in sample_params.items() - if _profile_name in key - } - _profiles = [] - for idx in range(size): - profilers[_profile_name].set_parameters( - **{ - param_name: param_value[idx] - for param_name, param_value in _params.items() - } - ) - _profiles.append(profilers[_profile_name]().values) - profiles[_profile_name] = np.vstack(_profiles) - return profiles - - -def main(): - with initialize_config_module( - version_base=None, config_module="indica.configs.workflows.priors" - ): - cfg = compose(config_name="config") - - pca_processor, pca_profilers = pca_workflow( - PriorManager( - basic_prior_info=cfg.basic_prior_info, - cond_prior_info=cfg.cond_prior_info, - ), - ["ion_temperature"], - np.linspace(0, 1, 30), - n_components=2, - num_prof_samples=int(5e3), - kde_samples=int(1e5), - ) - - pca_processor.plot_all() - plt.show(block=True) - - -if __name__ == "__main__": - main() diff --git a/indica/workflows/bda/priors.py b/indica/workflows/bda/priors.py deleted file mode 100644 index 0697b63f..00000000 --- a/indica/workflows/bda/priors.py +++ /dev/null @@ -1,276 +0,0 @@ -from abc import ABC -from abc import abstractmethod -from enum import Enum -from typing import Callable - -import numpy as np -from scipy.stats import gaussian_kde -from scipy.stats import loguniform -from scipy.stats import uniform - - -def greater_than(x1, x2): - return np.where(x1 > x2, 1, 0) - - -def get_uniform(lower, upper): - # Less confusing parametrisation of scipy.stats uniform - return uniform(loc=lower, scale=upper - lower) - - -class PriorType(Enum): - """ - PriorType differentiates between the below prior types. - BASIC: 1D PDF - COND: generic relationship between 2+ parameters of form: func(*parameters)->float - COMPOUND: ND PDF - """ - - BASIC = 1 - COND = 2 - COMPOUND = 3 - - -class Prior(ABC): - def __init__( - self, - prior_func: Callable = None, - labels: tuple = None, - type: PriorType = None, - ): - self.prior_func = prior_func - self.labels = ( - labels # to identify mapping between prior names and ndim prior funcs - ) - self.type = type - - @abstractmethod - def pdf(self, value): - return None - - @abstractmethod - def rvs(self, size): - return None - - -class PriorBasic(Prior): - def __init__(self, prior_func: Callable = None, labels: tuple = None): - super().__init__(prior_func=prior_func, labels=labels, type=PriorType.BASIC) - - def pdf(self, value): - return self.prior_func.pdf(value) - - def rvs(self, size): - return self.prior_func.rvs(size) - - -class PriorCond(Prior): - """ - Generic relationship between 2 or more parameters - """ - - def __init__( - self, - prior_func: Callable = None, - labels: tuple = None, - ): - super().__init__(prior_func=prior_func, labels=labels, type=PriorType.COND) - - def pdf(self, *values): - return self.prior_func(*values) - - def rvs(self, size): - return None - - -class PriorCompound(Prior): - """ - ND Probability Distribution Function - """ - - def __init__( - self, - prior_func: gaussian_kde = None, - labels: tuple = None, - ): - super().__init__(labels=labels, type=PriorType.COMPOUND) - self.prior_func = prior_func - - def pdf(self, *values): - _pdf = self.prior_func(np.array(values)) - if _pdf.size == 1: # Should return scalar when evaluating one point - _pdf = _pdf.item() - return _pdf - - def rvs(self, size): - return self.prior_func.resample(size).T - - -class PriorManager: - def __init__( - self, - basic_prior_info: dict = None, - cond_prior_info: dict = None, - ): - - self.compound_prior_funcs = {} # initialised later - - self.basic_prior_info = basic_prior_info - self.cond_prior_info = cond_prior_info - - self.get_uniform = get_uniform - self.loguniform = loguniform - self.greater_than = greater_than - - # Initialise prior objects - self.priors: dict = {} - for name, prior in self.basic_prior_info.items(): - prior = getattr(self, prior[0])(*prior[1:]) - self.priors[name] = PriorBasic(prior, labels=tuple([name])) - for name, prior in self.cond_prior_info.items(): - prior = getattr(self, prior) - self.priors[name] = PriorCond(prior, labels=tuple(name.split("/"))) - - def update_priors(self, new_priors: dict): - # update priors but remove all priors that match the profile names first - - prior_prefixes_to_remove = list( - set([key.split(".")[0] for key in new_priors.keys()]) - ) - priors_to_remove = [ - prior_name - for prior_name in self.priors.keys() - if any( - prior_name - for prefix in prior_prefixes_to_remove - if prefix in prior_name - ) - ] - print(f"Discarding priors: {priors_to_remove}") - print(f"Updating with {new_priors.keys()}") - for prior_name in priors_to_remove: - self.priors.pop(prior_name) - self.priors.update(new_priors) - - def get_prior_names_for_profiles(self, profile_names: list) -> list: - # Get all priors that correspond to the profile_names given - prior_names = [ - prior_name - for prior_name, prior in self.priors.items() - for profile_name in profile_names - if profile_name in str(prior.labels) - ] - - return prior_names - - def get_param_names_for_profiles(self, profile_names: list) -> list: - # Get all parameters that correspond to the profile_names given - param_names = [ - list(prior.labels) - for prior_name, prior in self.priors.items() - for profile_name in profile_names - if profile_name in str(prior.labels) - ] - unpacked_names = [ - param_name - for param_name_list in param_names - for param_name in param_name_list - ] - unique_param_names = list(set(unpacked_names)) - return unique_param_names - - def ln_prior(self, parameters: dict): - # refactor ln_prior to define interface between cond and regular priors - return ln_prior(priors=self.priors, parameters=parameters) - - -def ln_prior(priors: dict, parameters: dict): - ln_prior = 0 - - for prior_name, prior in priors.items(): - param_names_in_prior = [x for x in prior.labels if x in parameters.keys()] - if param_names_in_prior.__len__() == 0: - # if prior assigned but no parameter then skip - continue - # if not all relevant params given then ignore prior - if param_names_in_prior.__len__() != prior.labels.__len__(): - continue - param_values = np.array([parameters[x] for x in param_names_in_prior]) - ln_prior += np.log(prior.pdf(*param_values)) - return ln_prior - - -def sample_from_priors(param_names: list, priors: dict, size=10) -> np.ndarray: - samples = np.empty((param_names.__len__(), 0)) - while samples.size < param_names.__len__() * size: - # Increase 'size * n' if too slow / looping too much - _new_sample = {} - for prior_name, prior in priors.items(): - if any([label not in param_names for label in prior.labels]): - continue - if prior.type is PriorType.BASIC: - _new_sample[prior_name] = prior.rvs(size=size * 2) - elif prior.type is PriorType.COMPOUND: - tuple_sample = prior.rvs(size=size * 2) - for idx, value in enumerate(prior.labels): - _new_sample[value] = tuple_sample[:, idx] - elif prior.type is PriorType.COND: - continue - else: - raise TypeError(f"{prior} is not a version of {PriorType}") - - # Due to looping over priors the samples need to be reordered - new_sample = {param_name: _new_sample[param_name] for param_name in param_names} - # Throw out samples that don't meet conditional priors and redraw - _ln_prior = ln_prior(priors, new_sample) - # Convert from dictionary of arrays -> array, - # then filtering out where ln_prior is -infinity - accepted_samples = np.array(list(new_sample.values()))[:, _ln_prior != -np.inf] - samples = np.append(samples, accepted_samples, axis=1) - samples = samples[:, 0:size] - return samples.transpose() - - -def sample_best_half( - param_names: list, priors: dict, wrappedblackbox: callable, size=10 -) -> np.ndarray: - start_points = sample_from_priors(param_names, priors, size=2 * size) - ln_post = [] - for idx in range(start_points.shape[0]): - ln_post.append(wrappedblackbox(start_points[idx, :])) - index_best_half = np.argsort(ln_post)[:size] - best_points = start_points[index_best_half, :] - return best_points - - -def sample_from_high_density_region( - param_names: list, priors: dict, optimiser, nwalkers: int, nsamples=100 -) -> np.ndarray: - # TODO: remove repeated code - start_points = sample_from_priors(param_names, priors, size=nsamples) - - ln_prob, _ = optimiser.compute_log_prob(start_points) - num_best_points = 3 - index_best_start = np.argsort(ln_prob)[-num_best_points:] - best_start_points = start_points[index_best_start, :] - best_points_std = np.std(best_start_points, axis=0) - - # Passing samples through ln_prior and redrawing if they fail - samples = np.empty((param_names.__len__(), 0)) - while samples.size < param_names.__len__() * nwalkers: - sample = np.random.normal( - np.mean(best_start_points, axis=0), - best_points_std, - size=(nwalkers * 5, len(param_names)), - ) - start = {name: sample[:, idx] for idx, name in enumerate(param_names)} - _ln_prior = ln_prior( - priors, - start, - ) - # Convert from dictionary of arrays -> array, - # then filtering out where ln_prior is -infinity - accepted_samples = np.array(list(start.values()))[:, _ln_prior != -np.inf] - samples = np.append(samples, accepted_samples, axis=1) - start_points = samples[:, 0:nwalkers].transpose() - return start_points diff --git a/indica/writers/bda_tree.py b/indica/writers/bda_tree.py deleted file mode 100644 index f9f9ef50..00000000 --- a/indica/writers/bda_tree.py +++ /dev/null @@ -1,326 +0,0 @@ -import sys -from unittest.mock import MagicMock - -from MDSplus import Connection -import numpy as np - -try: - import standard_utility as util -except ImportError: - util = MagicMock - print("\n ** StandardUtility not installed \n **") - -BDA_NODES = { - "TIME": ("NUMERIC", "Time vector of optimisation"), - "ELEMENT": ("TEXT", "Element names of ion species"), - "INPUT": { - "SETTINGS": ("TEXT", "Settings in config file"), - "GIT_ID": ("TEXT", "Commit ID used for run"), - "USER": ("TEXT", "Username of script runner"), - "DATETIME": ("TEXT", "UTC datetime code was run"), - "WORKFLOW": {}, - }, - "PROFILES": { - "PSI_NORM": { - "RHOP": ( - "NUMERIC", - "Rho Poloidal - Square root of normalised poloidal flux", - ), - "RHOT": ( - "SIGNAL", - "Rho Toroidal - Square root of normalised toroidal flux", - ), - "VOLUME": ("SIGNAL", "Volume inside magnetic surface"), - "NE": ("SIGNAL", "Electron density"), - "NI": ("SIGNAL", "Ion density"), - "TE": ("SIGNAL", "Electron temperature"), - "TI": ("SIGNAL", "Ion temperature"), - "NNEUTR": ("SIGNAL", "Thermal neutral density"), - "NFAST": ("SIGNAL", "Fast ion density"), - "ZEFF": ("SIGNAL", "Effective charge"), - "MEANZ": ("SIGNAL", "Average ionic charge"), - "PTH": ("SIGNAL", "Thermal particle pressure"), - "PFAST": ("SIGNAL", "Fast particle pressure"), - "P": ("SIGNAL", "Total pressure"), - "NE_ERR": ("SIGNAL", "Electron density error"), - "NI_ERR": ("SIGNAL", "Ion density error"), - "TE_ERR": ("SIGNAL", "Electron temperature error"), - "TI_ERR": ("SIGNAL", "Ion temperature error"), - "NNEUTR_ERR": ("SIGNAL", "Thermal neutral density error"), - "NFAST_ERR": ("SIGNAL", "Fast ion density error"), - "ZEFF_ERR": ("SIGNAL", "Effective charge error"), - "MEANZ_ERR": ("SIGNAL", "Average ionic charge error"), - "PTH_ERR": ("SIGNAL", "Thermal particle pressure error"), - "PFAST_ERR": ("SIGNAL", "Fast particle pressure error"), - "P_ERR": ("SIGNAL", "Total pressure error"), - "VTOR": ("SIGNAL", "Toroidal rotation"), - "VTOR_ERR": ("SIGNAL", "Toroidal rotation error"), - }, - "R_MIDPLANE": { - "RPOS": ("NUMERIC", "Major radius position of profile"), - "ZPOS": ("NUMERIC", "Z position of profile"), - "NE": ("SIGNAL", "Electron density"), - "NI": ("SIGNAL", "Ion density"), - "TE": ("SIGNAL", "Electron temperature"), - "TI": ("SIGNAL", "Ion temperature"), - "NNEUTR": ("SIGNAL", "Thermal neutral density"), - "NFAST": ("SIGNAL", "Fast ion density"), - "MEANZ": ("SIGNAL", "Average ionic charge"), - "ZEFF": ("SIGNAL", "Effective charge"), - "PTH": ("SIGNAL", "Thermal particle pressure"), - "PFAST": ("SIGNAL", "Fast particle pressure"), - "P": ("SIGNAL", "Total pressure"), - "NE_ERR": ("SIGNAL", "Electron density error"), - "NI_ERR": ("SIGNAL", "Ion density error"), - "TE_ERR": ("SIGNAL", "Electron temperature error"), - "TI_ERR": ("SIGNAL", "Ion temperature error"), - "NNEUTR_ERR": ("SIGNAL", "Thermal neutral density error"), - "NFAST_ERR": ("SIGNAL", "Fast ion density error"), - "ZEFF_ERR": ("SIGNAL", "Effective charge error"), - "MEANZ_ERR": ("SIGNAL", "Average ionic charge error"), - "PTH_ERR": ("SIGNAL", "Thermal particle pressure error"), - "PFAST_ERR": ("SIGNAL", "Fast particle pressure error"), - "P_ERR": ("SIGNAL", "Total pressure error"), - "VTOR": ("SIGNAL", "Toroidal rotation"), - "VTOR_ERR": ("SIGNAL", "Toroidal rotation error"), - }, - }, - "PROFILE_STAT": { - "SAMPLE_IDX": ("NUMERIC", "Index of the optimisation samples"), - "RHOP": ("NUMERIC", "Rho Poloidal - Square root of normalised poloidal flux"), - "NE": ("SIGNAL", "Electron density"), - "NI": ("SIGNAL", "Ion density"), - "TE": ("SIGNAL", "Electron temperature"), - "TI": ("SIGNAL", "Ion temperature"), - "NNEUTR": ("SIGNAL", "Thermal neutral density"), - "NFAST": ("SIGNAL", "Fast ion density"), - "ZEFF": ("SIGNAL", "Effective charge"), - "MEANZ": ("SIGNAL", "Average ionic charge"), - "PTH": ("SIGNAL", "Thermal particle pressure"), - "PFAST": ("SIGNAL", "Fast particle pressure"), - "P": ("SIGNAL", "Total pressure"), - "NE_ERR": ("SIGNAL", "Electron density error"), - "NI_ERR": ("SIGNAL", "Ion density error"), - "TE_ERR": ("SIGNAL", "Electron temperature error"), - "TI_ERR": ("SIGNAL", "Ion temperature error"), - "NNEUTR_ERR": ("SIGNAL", "Thermal neutral density error"), - "NFAST_ERR": ("SIGNAL", "Fast ion density error"), - "ZEFF_ERR": ("SIGNAL", "Effective charge error"), - "MEANZ_ERR": ("SIGNAL", "Average ionic charge"), - "PTH_ERR": ("SIGNAL", "Thermal particle pressure error"), - "PFAST_ERR": ("SIGNAL", "Fast particle pressure error"), - "P_ERR": ("SIGNAL", "Total pressure error"), - "VTOR": ("SIGNAL", "Toroidal rotation"), - "VTOR_ERR": ("SIGNAL", "Toroidal rotation error"), - }, - "GLOBAL": { - "VOLUME": ("SIGNAL", "Plasma volume"), - "NE0": ("SIGNAL", "Central electron density"), - "NI0": ("SIGNAL", "Central ion density"), - "TE0": ("SIGNAL", "Central electron temperature"), - "TI0": ("SIGNAL", "Central ion temperature"), - "NNEUTR0": ("SIGNAL", "Central neutral density"), - "NNEUTRB": ("SIGNAL", "Boundary neutral density"), - "WP": ("SIGNAL", "Total stored energy"), - "WTH": ("SIGNAL", "Thermal component of stored energy"), - "ZEFF_AVG": ("SIGNAL", "Average Zeff along midplane"), - "NE0_ERR": ("SIGNAL", "Central electron density error"), - "NI0_ERR": ("SIGNAL", "Central ion density error"), - "TE0_ERR": ("SIGNAL", "Central electron temperature error"), - "TI0_ERR": ("SIGNAL", "Central ion temperature error"), - "NNEUTR0_ERR": ("SIGNAL", "Central neutral density error"), - "NNEUTRB_ERR": ("SIGNAL", "Boundary neutral density error"), - "WP_ERR": ("SIGNAL", "Total stored energy error"), - "WTH_ERR": ("SIGNAL", "Thermal component of stored energy error"), - "ZEFF_AVG_ERR": ("SIGNAL", "Average Zeff along midplane error"), - "VTOR0": ("SIGNAL", "Central toroidal rotation"), - "VTOR0_ERR": ("SIGNAL", "Central toroidal rotation error"), - }, - "PHANTOM": { - "FLAG": ("TEXT", "True if phantom profiles used"), - "RHOP": ( - "NUMERIC", - "Rho Poloidal - Square root of normalised poloidal flux", - ), - "NE": ("SIGNAL", "Electron density"), - "NI": ("SIGNAL", "Ion density"), - "TE": ("SIGNAL", "Electron temperature"), - "TI": ("SIGNAL", "Ion temperature"), - "NNEUTR": ("SIGNAL", "Thermal neutral density"), - "NFAST": ("SIGNAL", "Fast ion density"), - "ZEFF": ("SIGNAL", "Effective charge"), - "MEANZ": ("SIGNAL", "Average ionic charge"), - "PTH": ("SIGNAL", "Thermal particle pressure"), - "PFAST": ("SIGNAL", "Fast particle pressure"), - "P": ("SIGNAL", "Total pressure"), - "VTOR": ("SIGNAL", "Toroidal rotation"), - }, - "OPTIMISATION": { - # "ACCEPT_FRAC": ("NUMERIC", "Fraction of accepted samples"), - # "AUTO_CORR": ("NUMERIC", "Auto-correlation time traces"), - "POST_SAMPLE": ("NUMERIC", "Samples of posterior probability"), - "PRIOR_SAMPLE": ("NUMERIC", "Samples of prior probability"), - "PARAM_NAMES": ("TEXT", "Optimised parameter names") - # "GELMAN_RUBIN": ("NUMERIC", "Gelmin-Rubin convergence diagnostic"), - }, -} - - -DIAGNOSTIC_QUANTITY = [ - "DIAGNOSTIC1.QUANTITY1", - "DIAGNOSTIC1.QUANTITY2", - "DIAGNOSTIC2.QUANTITY1", -] - - -def create_nodes( - pulse_to_write=43000000, - run="RUN01", - run_info="Default run", - best=True, - diagnostic_quantities=None, - mode="EDIT", - debug=True, -): - if diagnostic_quantities is None: - diagnostic_quantities = DIAGNOSTIC_QUANTITY - bda_nodes = BDA_NODES - quant_list = [ - item.upper().split(".") for item in diagnostic_quantities - ] # replace OPTIMISED_QUANTITY - diag_names = list(set([item[0] for item in quant_list])) - - diag_nodes = { - diag_name: { - quantity[1]: ("SIGNAL", f"measured {quantity[1]} from {quantity[0]}") - for quantity in quant_list - if quantity[0] == diag_name - } - for diag_name in diag_names - } - - nodes = { - "RUN": ("TEXT", "RUN used for diagnostic"), - "USAGE": ("TEXT", "Quantity used in analysis"), - "PULSE": ("NUMERIC", "Pulse used for diagnostic"), - } - - workflow_nodes = {diag_name: nodes for diag_name in diag_names} - - model_nodes = { - diag_name: { - quantity[1]: ("SIGNAL", f"modelled {quantity[1]} from {quantity[0]}") - for quantity in quant_list - if quantity[0] == diag_name - } - for diag_name in diag_names - } - model_nodes["SAMPLE_IDX"] = ("NUMERIC", "Index of the optimisation samples") - bda_nodes["MODEL_DATA"] = model_nodes - bda_nodes["DIAG_DATA"] = diag_nodes - bda_nodes["INPUT"]["WORKFLOW"] = workflow_nodes - - tree = "BDA" - script_name = "" - script_info = "" - - node_info = util.GetNodeInformation( - script=None, - node_information_type="json", - run_name=run, - run_info=run_info, - script_name=script_name, - script_info=script_info, - root_node=None, - tree=tree, - pulse_number=pulse_to_write, - base_node_to_read=None, - node_information_file=bda_nodes, - ).get() - - util.StandardNodeCreation( - pulse_number=pulse_to_write, - dict_node_info=node_info, - mode=mode, - name_of_BEST="BEST", # name of the structure linked to BEST - link_BEST_to_run=best, - debug=debug, - ) - return node_info - - -def check_to_overwrite_run( - pulseNo, - which_run, -): - # Checker function to see if data already exists in a run - IP_address_smaug = "smaug" - conn = Connection(IP_address_smaug) - conn.openTree("BDA", pulseNo) - - temp = conn.get("BDA." + which_run + ".TIME").data() - conn.closeAllTrees() - - overwrite_flag = True - if isinstance(temp, np.ndarray): - print(f"Data already Exists in pulseNo = {pulseNo}, which_run = {which_run}") - print("User prompt...") - question = ( - f" Scheduled to overwrite pulseNo {pulseNo}, {which_run}" - f"\n Do you want to overwrite {which_run}? (y/n)" - ) - overwrite_flag = query_yes_no(question) - return overwrite_flag - - -def does_tree_exist( - pulse, -): - IP_address_smaug = "smaug" - conn = Connection(IP_address_smaug) - - try: - conn.openTree("BDA", pulse) - conn.closeAllTrees() - return True - except Exception: - return False - - -def query_yes_no( - question, -): - valid = {"yes": True, "y": True, "no": False, "n": False} - while True: - sys.stdout.write(question) - choice = input().lower() - if choice == "": - return False - elif choice in valid.keys(): - return valid[choice] - else: - sys.stdout.write("Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n") - - -def write_nodes(pulse_to_write, result, node_info, debug=False): - util.standard_fn_MDSplus.make_ST40_subtree("BDA", pulse_to_write) - util.StandardNodeWriting( - pulse_number=pulse_to_write, # pulse number for which data should be written - dict_node_info=node_info, # node information file - nodes_to_write=[], # selective nodes to be written - data_to_write=result, - debug=debug, - ) - - -if __name__ == "__main__": - - pulse = 43000000 - run = "RUN01" - - tree_exists = does_tree_exist(pulse) - if tree_exists: - mode = "EDIT" - else: - mode = "NEW" - create_nodes(pulse_to_write=pulse, mode=mode, run=run, best=True) diff --git a/poetry.lock b/poetry.lock index bc075e45..273e63f4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -14,16 +14,6 @@ files = [ [package.extras] dev = ["black", "coverage", "isort", "pre-commit", "pyenchant", "pylint"] -[[package]] -name = "antlr4-python3-runtime" -version = "4.9.3" -description = "ANTLR 4.9.3 runtime for Python 3.7" -optional = false -python-versions = "*" -files = [ - {file = "antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b"}, -] - [[package]] name = "asttokens" version = "2.4.1" @@ -153,143 +143,167 @@ files = [ [[package]] name = "cftime" -version = "1.6.4" +version = "1.6.4.post1" description = "Time-handling functionality from netcdf4-python" optional = false python-versions = ">=3.8" files = [ - {file = "cftime-1.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ee70074df4bae0d9ee98f201cf5f11fd302791cf1cdeb73c34f685d6b632e17d"}, - {file = "cftime-1.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e5456fd58d4cc6b8d7b4932b749617ee142b62a52bc5d8e3c282ce69ce3a20ba"}, - {file = "cftime-1.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1289e08617be350a6b26c6e4352a0cb088625ac33d25e95110df549c26d6ab8e"}, - {file = "cftime-1.6.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b132d9225b4a109929866200846c72302316db9069e2de3ec8d8ec377f567f"}, - {file = "cftime-1.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ca1a264570e68fbb611bba251641b8efd0cf88c0ad2dcab5fa784df264232b75"}, - {file = "cftime-1.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:6fc82928cbf477bebf233f41914e64bff7b9e894c7f0c34170784a48250f8da7"}, - {file = "cftime-1.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c1558d9b477bd29626cd8bfc89e736635f72887d1a993e2834ab579bba7abb8c"}, - {file = "cftime-1.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:03494e7b66a2fbb6b04e364ab67185130dee0ced660abac5c1559070571d143d"}, - {file = "cftime-1.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dcb2a01d4e614437582af33b36db4fb441b7666758482864827a1f037d2b639"}, - {file = "cftime-1.6.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b47bf25195fb3889bbae34df0e80957eb69c48f66902f5d538c7a8ec34253f6"}, - {file = "cftime-1.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d4f2cc0d5c6ffba9c5b0fd1ecd0c7c1c426d0be7b8de1480e2a9fb857c1905e9"}, - {file = "cftime-1.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:76b8f1e5d1e424accdf760a43e0a1793a7b640bab83cb067273d5c9dbb336c44"}, - {file = "cftime-1.6.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c349a91fa7ac9ec50118b04a8746bdea967bd2fc525d87c776003040b8d3392"}, - {file = "cftime-1.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:588d073400798adc24ece759cd1cb24ef730f55d1f70e31a898e7686f9d763d8"}, - {file = "cftime-1.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e07b91b488570573bbeb6f815656a8974d13d15b2279c82de2927f4f692bbcd"}, - {file = "cftime-1.6.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f92f2e405eeda47b30ab6231d8b7d136a55f21034d394f93ade322d356948654"}, - {file = "cftime-1.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:567574df94d0de1101bb5da76e7fbc6eabfddeeb2eb8cf83286b3599a136bbf7"}, - {file = "cftime-1.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:5b5ad7559a16bedadb66af8e417b6805f758acb57aa38d2730844dfc63a1e667"}, - {file = "cftime-1.6.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c072fe9e09925af66a9473edf5752ca1890ba752e7c1935d1f0245ad48f0977c"}, - {file = "cftime-1.6.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c05a71389f53d6340cb365b60f028c08268c72401660b9ef76108dee9f1cb5b2"}, - {file = "cftime-1.6.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0edeb1cb019d8155b2513cffb96749c0d7d459370e69bdf03077e0bee214aed8"}, - {file = "cftime-1.6.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f05d5d6bb4137f9783fa61ad330030fcea8dcc6946dea69a27774edbe480e7"}, - {file = "cftime-1.6.4-cp38-cp38-win_amd64.whl", hash = "sha256:b32ac1278a2a111b066d5a1e6e5ce6f38c4c505993a6a3130873b56f99d7b56f"}, - {file = "cftime-1.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c20f03e12af39534c3450bba376272803bfb850b5ce6433c839bfaa99f8d835a"}, - {file = "cftime-1.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:90609b3c1a31a756a68ecdbc961a4ce0b22c1620f166c8dabfa3a4c337ac8b9e"}, - {file = "cftime-1.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbe11ad73b2a0ddc79995da21459fc2a3fd6b1593ca73f00a60e4d81c3e230f3"}, - {file = "cftime-1.6.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25f043703e785de0bd7cd8222c0a53317e9aeb3dfc062588b05e6f3ebb007468"}, - {file = "cftime-1.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f9acc272df1022f24fe7dbe9de43fa5d8271985161df14549e4d8d28c90dc9ea"}, - {file = "cftime-1.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:e8467b6fbf8dbfe0be8c04d61180765fdd3b9ab0fe51313a0bbf87e63634a3d8"}, - {file = "cftime-1.6.4.tar.gz", hash = "sha256:e325406193758a7ed67308deb52e727782a19e384e183378e7ff62098be0aedc"}, + {file = "cftime-1.6.4.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0baa9bc4850929da9f92c25329aa1f651e2d6f23e237504f337ee9e12a769f5d"}, + {file = "cftime-1.6.4.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bb6b087f4b2513c37670bccd457e2a666ca489c5f2aad6e2c0e94604dc1b5b9"}, + {file = "cftime-1.6.4.post1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d9bdeb9174962c9ca00015190bfd693de6b0ec3ec0b3dbc35c693a4f48efdcc"}, + {file = "cftime-1.6.4.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e735cfd544878eb94d0108ff5a093bd1a332dba90f979a31a357756d609a90d5"}, + {file = "cftime-1.6.4.post1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1dcd1b140bf50da6775c56bd7ca179e84bd258b2f159b53eefd5c514b341f2bf"}, + {file = "cftime-1.6.4.post1-cp310-cp310-win_amd64.whl", hash = "sha256:e60b8f24b20753f7548f410f7510e28b941f336f84bd34e3cfd7874af6e70281"}, + {file = "cftime-1.6.4.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1bf7be0a0afc87628cb8c8483412aac6e48e83877004faa0936afb5bf8a877ba"}, + {file = "cftime-1.6.4.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0f64ca83acc4e3029f737bf3a32530ffa1fbf53124f5bee70b47548bc58671a7"}, + {file = "cftime-1.6.4.post1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7ebdfd81726b0cfb8b524309224fa952898dfa177c13d5f6af5b18cefbf497d"}, + {file = "cftime-1.6.4.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9ea0965a4c87739aebd84fe8eed966e5809d10065eeffd35c99c274b6f8da15"}, + {file = "cftime-1.6.4.post1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:800a18aea4e8cb2b206450397cb8a53b154798738af3cdd3c922ce1ca198b0e6"}, + {file = "cftime-1.6.4.post1-cp311-cp311-win_amd64.whl", hash = "sha256:5dcfc872f455db1f12eabe3c3ba98e93757cd60ed3526a53246e966ccde46c8a"}, + {file = "cftime-1.6.4.post1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a590f73506f4704ba5e154ef55bfbaed5e1b4ac170f3caeb8c58e4f2c619ee4e"}, + {file = "cftime-1.6.4.post1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:933cb10e1af4e362e77f513e3eb92b34a688729ddbf938bbdfa5ac20a7f44ba0"}, + {file = "cftime-1.6.4.post1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf17a1b36f62e9e73c4c9363dd811e1bbf1170f5ac26d343fb26012ccf482908"}, + {file = "cftime-1.6.4.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e18021f421aa26527bad8688c1acf0c85fa72730beb6efce969c316743294f2"}, + {file = "cftime-1.6.4.post1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5835b9d622f9304d1c23a35603a0f068739f428d902860f25e6e7e5a1b7cd8ea"}, + {file = "cftime-1.6.4.post1-cp312-cp312-win_amd64.whl", hash = "sha256:7f50bf0d1b664924aaee636eb2933746b942417d1f8b82ab6c1f6e8ba0da6885"}, + {file = "cftime-1.6.4.post1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5c89766ebf088c097832ea618c24ed5075331f0b7bf8e9c2d4144aefbf2f1850"}, + {file = "cftime-1.6.4.post1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7f27113f7ccd1ca32881fdcb9a4bec806a5f54ae621fc1c374f1171f3ed98ef2"}, + {file = "cftime-1.6.4.post1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da367b23eea7cf4df071c88e014a1600d6c5bbf22e3393a4af409903fa397e28"}, + {file = "cftime-1.6.4.post1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6579c5c83cdf09d73aa94c7bc34925edd93c5f2c7dd28e074f568f7e376271a0"}, + {file = "cftime-1.6.4.post1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6b731c7133d17b479ca0c3c46a7a04f96197f0a4d753f4c2284c3ff0447279b4"}, + {file = "cftime-1.6.4.post1-cp313-cp313-win_amd64.whl", hash = "sha256:d2a8c223faea7f1248ab469cc0d7795dd46f2a423789038f439fee7190bae259"}, + {file = "cftime-1.6.4.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9df3e2d49e548c62d1939e923800b08d2ab732d3ac8d75b857edd7982c878552"}, + {file = "cftime-1.6.4.post1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2892b7e7654142d825655f60eb66c3e1af745901890316907071d44cf9a18d8a"}, + {file = "cftime-1.6.4.post1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4ab54e6c04e68395d454cd4001188fc4ade2fe48035589ed65af80c4527ef08"}, + {file = "cftime-1.6.4.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:568b69fc52f406e361db62a4d7a219c6fb0ced138937144c3b3a511648dd6c50"}, + {file = "cftime-1.6.4.post1-cp38-cp38-win_amd64.whl", hash = "sha256:640911d2629f4a8f81f6bc0163a983b6b94f86d1007449b8cbfd926136cda253"}, + {file = "cftime-1.6.4.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:44e9f8052600803b55f8cb6bcac2be49405c21efa900ec77a9fb7f692db2f7a6"}, + {file = "cftime-1.6.4.post1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a90b6ef4a3fc65322c212a2c99cec75d1886f1ebaf0ff6189f7b327566762222"}, + {file = "cftime-1.6.4.post1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:652700130dbcca3ae36dbb5b61ff360e62aa09fabcabc42ec521091a14389901"}, + {file = "cftime-1.6.4.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a7fb6cc541a027dab37fdeb695f8a2b21cd7d200be606f81b5abc38f2391e2"}, + {file = "cftime-1.6.4.post1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fc2c0abe2dbd147e1b1e6d0f3de19a5ea8b04956acc204830fd8418066090989"}, + {file = "cftime-1.6.4.post1-cp39-cp39-win_amd64.whl", hash = "sha256:0ee2f5af8643aa1b47b7e388763a1a6e0dc05558cd2902cffb9cbcf954397648"}, + {file = "cftime-1.6.4.post1.tar.gz", hash = "sha256:50ac76cc9f10ab7bd46e44a71c51a6927051b499b4407df4f29ab13d741b942f"}, ] [package.dependencies] -numpy = {version = ">1.13.3", markers = "python_version < \"3.12.0.rc1\""} +numpy = [ + {version = ">1.13.3", markers = "python_version < \"3.12.0.rc1\""}, + {version = ">=1.26.0b1", markers = "python_version >= \"3.12.0.rc1\""}, +] [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -413,83 +427,73 @@ files = [ [[package]] name = "coverage" -version = "7.6.1" +version = "7.6.4" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, - {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, - {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, - {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, - {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, - {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, - {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, - {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, - {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, - {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, - {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, - {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, - {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, - {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, - {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, - {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, - {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, - {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, + {file = "coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07"}, + {file = "coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a"}, + {file = "coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa"}, + {file = "coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522"}, + {file = "coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf"}, + {file = "coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5"}, + {file = "coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17"}, + {file = "coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a"}, + {file = "coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e"}, + {file = "coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef"}, + {file = "coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e"}, + {file = "coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1"}, + {file = "coverage-7.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3"}, + {file = "coverage-7.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901"}, + {file = "coverage-7.6.4-cp39-cp39-win32.whl", hash = "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09"}, + {file = "coverage-7.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f"}, + {file = "coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e"}, + {file = "coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73"}, ] [package.dependencies] @@ -524,51 +528,17 @@ files = [ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] -[[package]] -name = "dime-sampler" -version = "1.0.0" -description = "DIME MCMC sampling for python" -optional = false -python-versions = "*" -files = [ - {file = "dime_sampler-1.0.0-py3-none-any.whl", hash = "sha256:d7de542372eda945bb2b00ad5c47c1b742305ec38a0727912c0067dd6502c524"}, - {file = "dime_sampler-1.0.0.tar.gz", hash = "sha256:160ca46c9330ef7988106e644e84d9caa0ba2b1f9d50f9bcbe50b297af954e1d"}, -] - -[package.dependencies] -emcee = "*" -numpy = "*" -scipy = "*" - [[package]] name = "distlib" -version = "0.3.8" +version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, - {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, -] - -[[package]] -name = "emcee" -version = "3.1.6" -description = "The Python ensemble sampling toolkit for MCMC" -optional = false -python-versions = "*" -files = [ - {file = "emcee-3.1.6-py2.py3-none-any.whl", hash = "sha256:f2d63752023bdccf744461450e512a5b417ae7d28f18e12acd76a33de87580cb"}, - {file = "emcee-3.1.6.tar.gz", hash = "sha256:11af4daf6ab8f9ca69681e3c29054665db7bbd87fd4eb8e437d2c3a1248c637d"}, + {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, + {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, ] -[package.dependencies] -numpy = "*" - -[package.extras] -extras = ["h5py", "scipy"] -tests = ["coverage[toml]", "pytest", "pytest-cov"] - [[package]] name = "exceptiongroup" version = "1.2.2" @@ -670,65 +640,61 @@ six = ">=1.3.0" [package.extras] docs = ["sphinx"] -[[package]] -name = "flatdict" -version = "4.0.1" -description = "Python module for interacting with nested dicts as a single level dict with delimited keys." -optional = false -python-versions = "*" -files = [ - {file = "flatdict-4.0.1.tar.gz", hash = "sha256:cd32f08fd31ed21eb09ebc76f06b6bd12046a24f77beb1fd0281917e47f26742"}, -] - [[package]] name = "fonttools" -version = "4.53.1" +version = "4.54.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.53.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397"}, - {file = "fonttools-4.53.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3"}, - {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d"}, - {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0"}, - {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41"}, - {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f"}, - {file = "fonttools-4.53.1-cp310-cp310-win32.whl", hash = "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4"}, - {file = "fonttools-4.53.1-cp310-cp310-win_amd64.whl", hash = "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671"}, - {file = "fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1"}, - {file = "fonttools-4.53.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923"}, - {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719"}, - {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3"}, - {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb"}, - {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2"}, - {file = "fonttools-4.53.1-cp311-cp311-win32.whl", hash = "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88"}, - {file = "fonttools-4.53.1-cp311-cp311-win_amd64.whl", hash = "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02"}, - {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, - {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, - {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"}, - {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"}, - {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"}, - {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"}, - {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"}, - {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"}, - {file = "fonttools-4.53.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749"}, - {file = "fonttools-4.53.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2"}, - {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb"}, - {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f"}, - {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d"}, - {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169"}, - {file = "fonttools-4.53.1-cp38-cp38-win32.whl", hash = "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d"}, - {file = "fonttools-4.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8"}, - {file = "fonttools-4.53.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a"}, - {file = "fonttools-4.53.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31"}, - {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c"}, - {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407"}, - {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb"}, - {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122"}, - {file = "fonttools-4.53.1-cp39-cp39-win32.whl", hash = "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb"}, - {file = "fonttools-4.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb"}, - {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"}, - {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"}, + {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"}, + {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44"}, + {file = "fonttools-4.54.1-cp310-cp310-win32.whl", hash = "sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02"}, + {file = "fonttools-4.54.1-cp310-cp310-win_amd64.whl", hash = "sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a"}, + {file = "fonttools-4.54.1-cp311-cp311-win32.whl", hash = "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc"}, + {file = "fonttools-4.54.1-cp311-cp311-win_amd64.whl", hash = "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714"}, + {file = "fonttools-4.54.1-cp312-cp312-win32.whl", hash = "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac"}, + {file = "fonttools-4.54.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb"}, + {file = "fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a"}, + {file = "fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c"}, + {file = "fonttools-4.54.1-cp313-cp313-win32.whl", hash = "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58"}, + {file = "fonttools-4.54.1-cp313-cp313-win_amd64.whl", hash = "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386"}, + {file = "fonttools-4.54.1-cp38-cp38-win32.whl", hash = "sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664"}, + {file = "fonttools-4.54.1-cp38-cp38-win_amd64.whl", hash = "sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33"}, + {file = "fonttools-4.54.1-cp39-cp39-win32.whl", hash = "sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a"}, + {file = "fonttools-4.54.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7"}, + {file = "fonttools-4.54.1-py3-none-any.whl", hash = "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd"}, + {file = "fonttools-4.54.1.tar.gz", hash = "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285"}, ] [package.extras] @@ -777,22 +743,6 @@ gitdb = ">=4.0.1,<5" doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] -[[package]] -name = "hydra-core" -version = "1.3.2" -description = "A framework for elegantly configuring complex applications" -optional = false -python-versions = "*" -files = [ - {file = "hydra-core-1.3.2.tar.gz", hash = "sha256:8a878ed67216997c3e9d88a8e72e7b4767e81af37afb4ea3334b269a4390a824"}, - {file = "hydra_core-1.3.2-py3-none-any.whl", hash = "sha256:fa0238a9e31df3373b35b0bfb672c34cc92718d21f81311d8996a16de1141d8b"}, -] - -[package.dependencies] -antlr4-python3-runtime = "==4.9.*" -omegaconf = ">=2.2,<2.4" -packaging = "*" - [[package]] name = "hypothesis" version = "5.49.0" @@ -911,13 +861,13 @@ files = [ [[package]] name = "ipython" -version = "8.27.0" +version = "8.29.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" files = [ - {file = "ipython-8.27.0-py3-none-any.whl", hash = "sha256:f68b3cb8bde357a5d7adc9598d57e22a45dfbea19eb6b98286fa3b288c9cd55c"}, - {file = "ipython-8.27.0.tar.gz", hash = "sha256:0b99a2dc9f15fd68692e898e5568725c6d49c527d36a9fb5960ffbdeaa82ff7e"}, + {file = "ipython-8.29.0-py3-none-any.whl", hash = "sha256:0188a1bd83267192123ccea7f4a8ed0a78910535dbaa3f37671dca76ebd429c8"}, + {file = "ipython-8.29.0.tar.gz", hash = "sha256:40b60e15b22591450eef73e40a027cf77bd652e757523eebc5bd7c7c498290eb"}, ] [package.dependencies] @@ -949,18 +899,15 @@ test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "num [[package]] name = "isodate" -version = "0.6.1" +version = "0.7.2" description = "An ISO 8601 date/time/duration parser and formatter" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, - {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, + {file = "isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15"}, + {file = "isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6"}, ] -[package.dependencies] -six = "*" - [[package]] name = "itsdangerous" version = "2.2.0" @@ -1298,71 +1245,72 @@ source = ["Cython (>=3.0.11)"] [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] [[package]] @@ -1443,23 +1391,6 @@ files = [ [package.dependencies] traitlets = "*" -[[package]] -name = "mpmath" -version = "1.3.0" -description = "Python library for arbitrary-precision floating-point arithmetic" -optional = false -python-versions = "*" -files = [ - {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, - {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, -] - -[package.extras] -develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] -docs = ["sphinx"] -gmpy = ["gmpy2 (>=2.1.0a4)"] -tests = ["pytest (>=4.6)"] - [[package]] name = "mypy" version = "0.942" @@ -1515,36 +1446,41 @@ files = [ [[package]] name = "netcdf4" -version = "1.7.1.post2" +version = "1.7.2" description = "Provides an object-oriented python interface to the netCDF version 4 library" optional = false python-versions = ">=3.8" files = [ - {file = "netCDF4-1.7.1.post2-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:a1006ae117a754e3cf41a9e704032bf3837cbf53a695cd71deaad3e02e93d570"}, - {file = "netCDF4-1.7.1.post2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:7530d60cf6450d997ea0607f8b68b9b088f2382c42648cddf5e66e6f1280b692"}, - {file = "netCDF4-1.7.1.post2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:756a54cb212c9fc5d0ea74f7c661621821138ab8f63e818317330330cfd6165c"}, - {file = "netCDF4-1.7.1.post2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:156428fc63e2280e8bcab7f49531cde19fbba192c2ffdfb352c6a3f5e813a80b"}, - {file = "netCDF4-1.7.1.post2-cp310-cp310-win_amd64.whl", hash = "sha256:79d890ade8b8646bb2833c2b9565392cdf5e97e016cf0319693d13bd8c2dd511"}, - {file = "netCDF4-1.7.1.post2-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:b2700bd0a188637b740aa6ad09dbf9d21337fb1e0336f9859c2c6e9525404cc0"}, - {file = "netCDF4-1.7.1.post2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:914e210f76c4ce016aed32ba7dfad57e6316a38502bdcbd071fc74ee8fec73ec"}, - {file = "netCDF4-1.7.1.post2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a98731d88889e41e9a92d67cad8ac9d9c4acba612a999db803bd082384462dea"}, - {file = "netCDF4-1.7.1.post2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6369ed38ffd094fce44e066d0823b6420205d5825a715fe048146052b299754c"}, - {file = "netCDF4-1.7.1.post2-cp311-cp311-win_amd64.whl", hash = "sha256:9fe939ad543371b5ea46864ba6ac88532b2189ce139804b3187c241eb89a02a6"}, - {file = "netCDF4-1.7.1.post2-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:658f38ceb74bb127e293a47fa36f949babba0c872cf3091e2fdafa73caacc7e4"}, - {file = "netCDF4-1.7.1.post2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5f396f150f97831229e47f449fe6acbca8ff9d08b2166560c46790aa6f11b56b"}, - {file = "netCDF4-1.7.1.post2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d5216369a0a4a868dadb5c4137d854810a309b9f9ef1d16786269fbeb244101"}, - {file = "netCDF4-1.7.1.post2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12f8ab560320e879763b7837d6f8f5eb285195271f47fc5c18362e5b097ee67c"}, - {file = "netCDF4-1.7.1.post2-cp312-cp312-win_amd64.whl", hash = "sha256:2cbca7dcd92075aebe7c242e16f51f20bc5073b6f0f1449394dadc3c17e44b29"}, - {file = "netCDF4-1.7.1.post2-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:13dc0d3fa4d46e531f32fa0bb4068bdac35513114b9548ea49f92e85d9702afb"}, - {file = "netCDF4-1.7.1.post2-cp38-cp38-macosx_14_0_arm64.whl", hash = "sha256:f040aecec09a44388e1469725d471e8f1d491d4b70b27c8b2d45fd47db4e8abc"}, - {file = "netCDF4-1.7.1.post2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0691d20fcc2d41cd0a15ef335a4f038ccaf07c013c4c79ad3e39993cac3c9bbb"}, - {file = "netCDF4-1.7.1.post2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa22721d9860181c03506c6d718b3a9daf8d07dcb35a466b376760f8eddfffe5"}, - {file = "netCDF4-1.7.1.post2-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:d92bd60dc2b4beba293d81912f3094b2854e9f492ce5e9b4a3ad4fbd725a29e8"}, - {file = "netCDF4-1.7.1.post2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:d8c015cd8c8582b351d715aed4c17da2e68493edaa59e91f6cf12756479fbd53"}, - {file = "netCDF4-1.7.1.post2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bc8ca705e39ac9f4d3950c908867d377f789e5bcc6f94e0a2bdadc4c4612f94"}, - {file = "netCDF4-1.7.1.post2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98fef5b27a2325a50ec59793c96e5b1e9945061a390c1ea33d403ed91b7a2fb4"}, - {file = "netCDF4-1.7.1.post2-cp39-cp39-win_amd64.whl", hash = "sha256:294b24234fb71ee30640a451ed1428da3569f23383d35f905558093795f3609a"}, - {file = "netcdf4-1.7.1.post2.tar.gz", hash = "sha256:37d557e36654889d7020192bfb56f9d5f93894cb32997eb837ae586c538fd7b6"}, + {file = "netCDF4-1.7.2-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:5e9b485e3bd9294d25ff7dc9addefce42b3d23c1ee7e3627605277d159819392"}, + {file = "netCDF4-1.7.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:118b476fd00d7e3ab9aa7771186d547da645ae3b49c0c7bdab866793ebf22f07"}, + {file = "netCDF4-1.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abe5b1837ff209185ecfe50bd71884c866b3ee69691051833e410e57f177e059"}, + {file = "netCDF4-1.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28021c7e886e5bccf9a8ce504c032d1d7f98d86f67495fb7cf2c9564eba04510"}, + {file = "netCDF4-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:7460b638e41c8ce4179d082a81cb6456f0ce083d4d959f4d9e87a95cd86f64cb"}, + {file = "netCDF4-1.7.2-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:09d61c2ddb6011afb51e77ea0f25cd0bdc28887fb426ffbbc661d920f20c9749"}, + {file = "netCDF4-1.7.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:fd2a16dbddeb8fa7cf48c37bfc1967290332f2862bb82f984eec2007bb120aeb"}, + {file = "netCDF4-1.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f54f5d39ffbcf1726a1e6fd90cb5fa74277ecea739a5fa0f424636d71beafe24"}, + {file = "netCDF4-1.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:902aa50d70f49d002d896212a171d344c38f7b8ca520837c56c922ac1535c4a3"}, + {file = "netCDF4-1.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:3291f9ad0c98c49a4dd16aefad1a9abd3a1b884171db6c81bdcee94671cfabe3"}, + {file = "netCDF4-1.7.2-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:e73e3baa0b74afc414e53ff5095748fdbec7fb346eda351e567c23f2f0d247f1"}, + {file = "netCDF4-1.7.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a51da09258b31776f474c1d47e484fc7214914cdc59edf4cee789ba632184591"}, + {file = "netCDF4-1.7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb95b11804fe051897d1f2044b05d82a1847bc2549631cdd2f655dde7de77a9c"}, + {file = "netCDF4-1.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9d8a848373723f41ef662590b4f5e1832227501c9fd4513e8ad8da58c269977"}, + {file = "netCDF4-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:568ea369e00b581302d77fc5fd0b8f78e520c7e08d0b5af5219ba51f3f1cd694"}, + {file = "netCDF4-1.7.2-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:205a5f1de3ddb993c7c97fb204a923a22408cc2e5facf08d75a8eb89b3e7e1a8"}, + {file = "netCDF4-1.7.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:96653fc75057df196010818367c63ba6d7e9af603df0a7fe43fcdad3fe0e9e56"}, + {file = "netCDF4-1.7.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30d20e56b9ba2c48884eb89c91b63e6c0612b4927881707e34402719153ef17f"}, + {file = "netCDF4-1.7.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d6bfd38ba0bde04d56f06c1554714a2ea9dab75811c89450dc3ec57a9d36b80"}, + {file = "netCDF4-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:5c5fbee6134ee1246c397e1508e5297d825aa19221fdf3fa8dc9727ad824d7a5"}, + {file = "netCDF4-1.7.2-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:6bf402c2c7c063474576e5cf89af877d0b0cd097d9316d5bc4fcb22b62f12567"}, + {file = "netCDF4-1.7.2-cp38-cp38-macosx_14_0_arm64.whl", hash = "sha256:5bdf3b34e6fd4210e34fdc5d1a669a22c4863d96f8a20a3928366acae7b3cbbb"}, + {file = "netCDF4-1.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657774404b9f78a5e4d26506ac9bfe106e4a37238282a70803cc7ce679c5a6cc"}, + {file = "netCDF4-1.7.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e896d92f01fbf365e33e2513d5a8c4cfe16ff406aae9b6034e5ba1538c8c7a8"}, + {file = "netCDF4-1.7.2-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:eb87c08d1700fe67c301898cf5ba3a3e1f8f2fbb417fcd0e2ac784846b60b058"}, + {file = "netCDF4-1.7.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:59b403032774c723ee749d7f2135be311bad7d00d1db284bebfab58b9d5cdb92"}, + {file = "netCDF4-1.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:572f71459ef4b30e8554dcc4e1e6f55de515acc82a50968b48fe622244a64548"}, + {file = "netCDF4-1.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f77e72281acc5f331f82271e5f7f014d46f5ca9bcaa5aafe3e46d66cee21320"}, + {file = "netCDF4-1.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:d0fa7a9674fae8ae4877e813173c3ff7a6beee166b8730bdc847f517b282ed31"}, + {file = "netcdf4-1.7.2.tar.gz", hash = "sha256:a4c6375540b19989896136943abb6d44850ff6f1fa7d3f063253b1ad3f8b7fce"}, ] [package.dependencies] @@ -1629,21 +1565,6 @@ files = [ {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] -[[package]] -name = "omegaconf" -version = "2.3.0" -description = "A flexible configuration library" -optional = false -python-versions = ">=3.6" -files = [ - {file = "omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b"}, - {file = "omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7"}, -] - -[package.dependencies] -antlr4-python3-runtime = "==4.9.*" -PyYAML = ">=5.1.0" - [[package]] name = "packaging" version = "24.1" @@ -1697,6 +1618,7 @@ files = [ numpy = [ {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0,<2", markers = "python_version >= \"3.12\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -1772,95 +1694,90 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "10.4.0" +version = "11.0.0" description = "Python Imaging Library (Fork)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, - {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, - {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, - {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, - {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, - {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, - {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, - {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, - {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, - {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, - {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, - {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, - {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, - {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, - {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, - {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, - {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, - {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, - {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, - {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, - {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, - {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, - {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, - {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, - {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, - {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, - {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, - {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, - {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, - {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, - {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, - {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, - {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, - {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, - {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, - {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, - {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, - {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, - {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, - {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, - {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, - {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, + {file = "pillow-11.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947"}, + {file = "pillow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97"}, + {file = "pillow-11.0.0-cp310-cp310-win32.whl", hash = "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50"}, + {file = "pillow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c"}, + {file = "pillow-11.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9"}, + {file = "pillow-11.0.0-cp311-cp311-win32.whl", hash = "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5"}, + {file = "pillow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291"}, + {file = "pillow-11.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc"}, + {file = "pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6"}, + {file = "pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47"}, + {file = "pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb"}, + {file = "pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798"}, + {file = "pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de"}, + {file = "pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a"}, + {file = "pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8"}, + {file = "pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8"}, + {file = "pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904"}, + {file = "pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae"}, + {file = "pillow-11.0.0-cp39-cp39-win32.whl", hash = "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4"}, + {file = "pillow-11.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd"}, + {file = "pillow-11.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944"}, + {file = "pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] @@ -1944,13 +1861,13 @@ virtualenv = ">=20.10.0" [[package]] name = "prompt-toolkit" -version = "3.0.47" +version = "3.0.48" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, - {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, ] [package.dependencies] @@ -2015,13 +1932,13 @@ files = [ [[package]] name = "pyaml" -version = "24.7.0" +version = "24.9.0" description = "PyYAML-based module to produce a bit more pretty and readable YAML-serialized data" optional = false python-versions = ">=3.8" files = [ - {file = "pyaml-24.7.0-py3-none-any.whl", hash = "sha256:6b06596cb5ac438a3fad1e1bf5775088c4d3afb927e2b03a29305d334835deb2"}, - {file = "pyaml-24.7.0.tar.gz", hash = "sha256:5d0fdf9e681036fb263a783d0298fc3af580a6e2a6cf1a3314ffc48dc3d91ccb"}, + {file = "pyaml-24.9.0-py3-none-any.whl", hash = "sha256:31080551502f1014852b3c966a96c796adc79b4cf86e165f28ed83455bf19c62"}, + {file = "pyaml-24.9.0.tar.gz", hash = "sha256:e78dee8b0d4fed56bb9fa11a8a7858e6fade1ec70a9a122cee6736efac3e69b5"}, ] [package.dependencies] @@ -2046,13 +1963,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyparsing" -version = "3.1.4" +version = "3.2.0" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false -python-versions = ">=3.6.8" +python-versions = ">=3.9" files = [ - {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, - {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, + {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, + {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, ] [package.extras] @@ -2224,24 +2141,25 @@ files = [ [[package]] name = "rdflib" -version = "7.0.0" +version = "7.1.1" description = "RDFLib is a Python library for working with RDF, a simple yet powerful language for representing information." optional = false -python-versions = ">=3.8.1,<4.0.0" +python-versions = "<4.0.0,>=3.8.1" files = [ - {file = "rdflib-7.0.0-py3-none-any.whl", hash = "sha256:0438920912a642c866a513de6fe8a0001bd86ef975057d6962c79ce4771687cd"}, - {file = "rdflib-7.0.0.tar.gz", hash = "sha256:9995eb8569428059b8c1affd26b25eac510d64f5043d9ce8c84e0d0036e995ae"}, + {file = "rdflib-7.1.1-py3-none-any.whl", hash = "sha256:e590fa9a2c34ba33a667818b5a84be3fb8a4d85868f8038f17912ec84f912a25"}, + {file = "rdflib-7.1.1.tar.gz", hash = "sha256:164de86bd3564558802ca983d84f6616a4a1a420c7a17a8152f5016076b2913e"}, ] [package.dependencies] -isodate = ">=0.6.0,<0.7.0" +isodate = {version = ">=0.7.2,<1.0.0", markers = "python_version < \"3.11\""} pyparsing = ">=2.1.0,<4" [package.extras] berkeleydb = ["berkeleydb (>=18.1.0,<19.0.0)"] -html = ["html5lib (>=1.0,<2.0)"] -lxml = ["lxml (>=4.3.0,<5.0.0)"] -networkx = ["networkx (>=2.0.0,<3.0.0)"] +html = ["html5rdf (>=1.2,<2)"] +lxml = ["lxml (>=4.3,<6.0)"] +networkx = ["networkx (>=2,<4)"] +orjson = ["orjson (>=3.9.14,<4)"] [[package]] name = "requests" @@ -2472,24 +2390,24 @@ files = [ [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] name = "tqdm" -version = "4.66.5" +version = "4.66.6" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, - {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, + {file = "tqdm-4.66.6-py3-none-any.whl", hash = "sha256:223e8b5359c2efc4b30555531f09e9f2f3589bcd7fdd389271191031b49b7a63"}, + {file = "tqdm-4.66.6.tar.gz", hash = "sha256:4bdd694238bef1485ce839d67967ab50af8f9272aab687c0d7702a01da0be090"}, ] [package.dependencies] @@ -2540,13 +2458,13 @@ files = [ [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] @@ -2568,13 +2486,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.26.5" +version = "20.27.1" description = "Virtual Python Environment builder" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "virtualenv-20.26.5-py3-none-any.whl", hash = "sha256:4f3ac17b81fba3ce3bd6f4ead2749a72da5929c01774948e243db9ba41df4ff6"}, - {file = "virtualenv-20.26.5.tar.gz", hash = "sha256:ce489cac131aa58f4b25e321d6d186171f78e6cb13fafbf32a840cee67733ff4"}, + {file = "virtualenv-20.27.1-py3-none-any.whl", hash = "sha256:f11f1b8a29525562925f745563bfd48b189450f61fb34c4f9cc79dd5aa32a1f4"}, + {file = "virtualenv-20.27.1.tar.gz", hash = "sha256:142c6be10212543b32c6c45d3d3893dff89112cc588b7d0879ae5a1ec03a47ba"}, ] [package.dependencies] @@ -2599,13 +2517,13 @@ files = [ [[package]] name = "werkzeug" -version = "3.0.4" +version = "3.0.6" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.8" files = [ - {file = "werkzeug-3.0.4-py3-none-any.whl", hash = "sha256:02c9eb92b7d6c06f31a782811505d2157837cea66aaede3e217c7c27c039476c"}, - {file = "werkzeug-3.0.4.tar.gz", hash = "sha256:34f2371506b250df4d4f84bfe7b0921e4762525762bbd936614909fe25cd7306"}, + {file = "werkzeug-3.0.6-py3-none-any.whl", hash = "sha256:1bc0c2310d2fbb07b1dd1105eba2f7af72f322e1e455f2f93c993bee8c8a5f17"}, + {file = "werkzeug-3.0.6.tar.gz", hash = "sha256:a8dd59d4de28ca70471a34cba79bed5f7ef2e036a76b3ab0835474246eb41f8d"}, ] [package.dependencies] @@ -2659,5 +2577,5 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" -python-versions = "^3.9,<3.12" -content-hash = "9d6e94c844cfd3a2b89b7c32e7b953425b421140d2048f39a2b2458acdebb737" +python-versions = "^3.9,<3.13" +content-hash = "0a17bcbe5ee8adb679fa97b780bae0b71587aa3acc35f4686cda96aa79dafc58" diff --git a/pyproject.toml b/pyproject.toml index cb1bbc3f..fbe9ec0a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,13 +50,8 @@ netCDF4 = "^1.5.4" numpy = "1.26.4" scipy = "^1.9.2" xarray = "2024.6.0" -mpmath = "^1.3.0" matplotlib = "^3.8.0" sal = "^1.2.2" -emcee = "^3.1.4" -dime_sampler = "1.0.0" -flatdict = "^4.0.1" -hydra-core = "^1.3.2" bottleneck = "1.4.0" tqdm = "^4.65.0" scikit-learn = "^1.3.0" diff --git a/tests/integration/workflows/test_bda_run.py b/tests/integration/workflows/test_bda_run.py deleted file mode 100644 index 0d9560a7..00000000 --- a/tests/integration/workflows/test_bda_run.py +++ /dev/null @@ -1,33 +0,0 @@ -from hydra import compose -from hydra import initialize_config_module - -from indica.workflows.bda.bda_run import bda_run - - -class TestBDARun: - def test_emcee_run( - self, - ): - with initialize_config_module( - version_base=None, config_module="indica.configs.workflows.bda_run" - ): - cfg = compose( - config_name="test_emcee", - ) - bda_run(cfg) - - def test_bo_run( - self, - ): - with initialize_config_module( - version_base=None, config_module="indica.configs.workflows.bda_run" - ): - cfg = compose( - config_name="test_bo", - ) - bda_run(cfg) - - -if __name__ == "__main__": - test = TestBDARun() - test.test_bo_run() diff --git a/tests/integration/workflows/test_model_coordinator.py b/tests/integration/workflows/test_model_coordinator.py deleted file mode 100644 index e6d0d1ba..00000000 --- a/tests/integration/workflows/test_model_coordinator.py +++ /dev/null @@ -1,108 +0,0 @@ -from indica.defaults.load_defaults import load_default_objects -from indica.models import ChargeExchangeSpectrometer -from indica.models import HelikeSpectrometer -from indica.models import SXRcamera -from indica.models import ThomsonScattering -from indica.workflows.bda.model_coordinator import ModelCoordinator - - -def initialise_model_coordinator(model_settings=None): - model_coordinator = ModelCoordinator( - { - "cxff_pi": ChargeExchangeSpectrometer, - "xrcs": HelikeSpectrometer, - "ts": ThomsonScattering, - "sxrc_xy1": SXRcamera, - }, - model_settings=model_settings, - ) - return model_coordinator - - -def initialise_model_coordinator_and_setup( - plasma, transforms, equilibrium, model_settings=None -): - model_coordinator = initialise_model_coordinator(model_settings=model_settings) - model_coordinator.set_plasma(plasma) - model_coordinator.set_transforms(transforms) - model_coordinator.set_equilibrium(equilibrium) - return model_coordinator - - -class TestModelCoordinator: - def setup_class(self): - self.plasma = load_default_objects("st40", "plasma") - self.transforms = load_default_objects("st40", "geometry") - self.equilibrium = load_default_objects("st40", "equilibrium") - - def test_initialise_models(self): - model_coordinator = initialise_model_coordinator() - for model_name, model in model_coordinator.models.items(): - assert hasattr(model, "name") - - def test_set_plasma(self): - model_coordinator = initialise_model_coordinator() - model_coordinator.set_plasma(self.plasma) - for model_name, model in model_coordinator.models.items(): - assert hasattr(model, "plasma") - - def test_set_transforms(self): - model_coordinator = initialise_model_coordinator() - model_coordinator.set_transforms(self.transforms) - for model_name, model in model_coordinator.models.items(): - assert hasattr(model, "transform") - - def test_set_equilibrium_without_transform(self): - model_coordinator = initialise_model_coordinator() - model_coordinator.set_equilibrium(self.equilibrium) - for model_name, model in model_coordinator.models.items(): - assert not hasattr(model, "equilibrium") - - def test_set_equilibrium_with_transform(self): - model_coordinator = initialise_model_coordinator() - model_coordinator.set_transforms(self.transforms) - model_coordinator.set_equilibrium(self.equilibrium) - for model_name, model in model_coordinator.models.items(): - assert hasattr(model.transform, "equilibrium") - - def test_get_with_all_model_names(self): - model_coordinator = initialise_model_coordinator_and_setup( - self.plasma, self.transforms, self.equilibrium - ) - for model_name, model in model_coordinator.models.items(): - assert model_coordinator.get(model_name) - - def test_get_with_wrong_name(self): - model_coordinator = initialise_model_coordinator_and_setup( - self.plasma, self.transforms, self.equilibrium - ) - assert not model_coordinator.get("dummy") - - def test_default_call(self): - model_coordinator = initialise_model_coordinator_and_setup( - self.plasma, self.transforms, self.equilibrium - ) - model_coordinator() - assert model_coordinator.binned_data - - def test_call_with_nested_kwargs(self): - model_coordinator = initialise_model_coordinator_and_setup( - self.plasma, self.transforms, self.equilibrium - ) - model_coordinator(["xrcs"], **{"xrcs": {"background": 0}}) - assert model_coordinator.binned_data.get("xrcs", {}) - assert model_coordinator.call_kwargs.get("xrcs", {}) == {"background": 0} - - def test_call_with_flat_kwargs(self): - model_coordinator = initialise_model_coordinator_and_setup( - self.plasma, self.transforms, self.equilibrium - ) - model_coordinator(["xrcs"], flat_kwargs={"xrcs.background": 0}) - assert model_coordinator.binned_data.get("xrcs", {}) - assert model_coordinator.call_kwargs.get("xrcs", {}) == {"background": 0} - - -if __name__ == "__main__": - test = TestModelCoordinator() - test.setup_class() - test.test_call_with_flat_kwargs() diff --git a/tests/integration/workflows/test_priors.py b/tests/integration/workflows/test_priors.py deleted file mode 100644 index bed1a83c..00000000 --- a/tests/integration/workflows/test_priors.py +++ /dev/null @@ -1,27 +0,0 @@ -from hydra import compose -from hydra import initialize_config_module - -from indica.workflows.bda.priors import PriorManager -from indica.workflows.bda.priors import sample_from_priors - - -class TestPriors: - def setup_class(self): - with initialize_config_module( - version_base=None, config_module="indica.configs.workflows.priors" - ): - self.cfg = compose(config_name="config") - - def test_prior_manager_initalises_with_config(self): - PriorManager(**self.cfg) - assert True - - def test_prior_evaluates(self): - pm = PriorManager(**self.cfg) - pm.ln_prior({"electron_density.y0": 1e20, "electron_density.y1": 1e19}) - assert True - - def test_sampling_from_priors(self): - pm = PriorManager(**self.cfg) - sample_from_priors(["electron_density.y0", "electron_density.y1"], pm.priors) - assert True diff --git a/tests/unit/test_profilers.py b/tests/unit/test_profilers.py index ac0ef71a..e3d3e8fa 100644 --- a/tests/unit/test_profilers.py +++ b/tests/unit/test_profilers.py @@ -1,17 +1,16 @@ -from hydra import compose -from hydra import initialize_config_module - from indica.profilers.profiler_gauss import ProfilerGauss class TestProfilerGauss: def setup_class(self): - with initialize_config_module( - version_base=None, config_module="indica.configs.profilers" - ): - cfg = compose(config_name="profiler_gauss") - self.cfg = cfg - self.datatypes = cfg.keys() + self.datatypes = [ + "ion_temperature", + "impurity_density", + "electron_temperature", + "neutral_density", + "toroidal_rotation", + "electron_density", + ] def test_initialise_with_default_parameters_for_all_datatypes(self): for datatype in self.datatypes: