From dd7a46117d1aba81e7a70430ca907df1cab8ba6c Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Fri, 15 Sep 2023 08:06:20 -0600 Subject: [PATCH] Template initial microgrid subsystem example (#569) * pvsubsystem template and code to render * test to build pvsubsystem model from template * transformer template and code to render * hacking in some sample transformer data to the sys-param file * new tests for transformer, and simulation tests for previous components * add calculation for line power in line and pvsubsystem templates * skip test_build_pv_subsystem because it is captured in the simulation test * add comments to pv_subsystem.mot for future improvements * add todo to get ditto-reader info about transformers into the sys-param file * add code to read transformer in- and out-going voltages from uo sdk * fix transformer template and code to use new variable names * update test sys-param file with current variable names * use .get() method for looking at opendss values * use .get() method for other transformer properties as well * formatting instance file * remove single 5g test file - district 5g test already exists * unskip testing district 5g system * add start/stop/step times to dhc test setup * re-skip the dhc simulation test * use appropriate cable in pv subsystem model * capacitor was confused with capacitive load. fixed capacitive load * use pathlib instead of os.path when adding microgrid to sys-params * tests for capacitive load model * `poetry update` * gix typo in transformer data for sys-param * potential solution to poetry dependency installation failures * fix district heating and cooling test assert path --- .github/workflows/ci.yml | 2 + .../NetworkAmbientWaterStub_Instance.mopt | 2 +- .../Conversion/ACACTransformer.mot | 41 +++ .../Conversion/ACACTransformer.py | 24 ++ .../AC/ThreePhasesBalanced/Lines/ACLine.mot | 3 +- .../Loads/{Capacitor.mot => Capacitive.mot} | 6 +- .../ThreePhasesBalanced/Loads/capacitive.py | 34 ++ .../{Loads => Storage}/capacitor.py | 0 .../Electrical/Examples/PVsubsystem.mot | 99 ++++++ .../Electrical/Examples/pv_subsystem.py | 14 + .../system_parameters/system_parameters.py | 36 +- poetry.lock | 317 ++++++++++-------- tests/GMT_Lib/test_gmt_lib.py | 239 ++++++++++++- .../system_params_microgrid_example.json | 20 +- tests/model_connectors/test_district_5g.py | 1 - ...st_district_heating_and_cooling_systems.py | 8 +- 16 files changed, 676 insertions(+), 170 deletions(-) create mode 100644 geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Conversion/ACACTransformer.mot rename geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Loads/{Capacitor.mot => Capacitive.mot} (84%) create mode 100644 geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Loads/capacitive.py rename geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/{Loads => Storage}/capacitor.py (100%) create mode 100644 geojson_modelica_translator/modelica/GMT_Lib/Electrical/Examples/PVsubsystem.mot create mode 100644 geojson_modelica_translator/modelica/GMT_Lib/Electrical/Examples/pv_subsystem.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 559629172..2f8751571 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,7 +44,9 @@ jobs: # with: # poetry-version: "1.5.1" - name: Install dependencies with Poetry + # poetry install workaround sourced from https://github.com/python-poetry/poetry/issues/7611#issuecomment-1711443539 run: | + poetry self add setuptools poetry --version poetry install - name: Install modelicafmt diff --git a/geojson_modelica_translator/model_connectors/networks/templates/NetworkAmbientWaterStub_Instance.mopt b/geojson_modelica_translator/model_connectors/networks/templates/NetworkAmbientWaterStub_Instance.mopt index 57128c591..c56033470 100644 --- a/geojson_modelica_translator/model_connectors/networks/templates/NetworkAmbientWaterStub_Instance.mopt +++ b/geojson_modelica_translator/model_connectors/networks/templates/NetworkAmbientWaterStub_Instance.mopt @@ -6,7 +6,7 @@ use_m_flow_in=true, use_T_in=false, {% if 'ghe_parameters' in sys_params.district_system['fifth_generation'] %} - T={{ sys_params.district_system.fifth_generation.ghe_parameters.soil.undisturbed_temp}}+273.15, + T={{ sys_params.district_system.fifth_generation.ghe_parameters.soil.undisturbed_temp }}+273.15, {% else %} T={{ sys_params.district_system.fifth_generation.central_heating_plant_parameters.temp_setpoint_hhw }}+273.15, {% endif %} diff --git a/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Conversion/ACACTransformer.mot b/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Conversion/ACACTransformer.mot new file mode 100644 index 000000000..8f1708c11 --- /dev/null +++ b/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Conversion/ACACTransformer.mot @@ -0,0 +1,41 @@ +within; +model ACACTransformer + "Isolated transformer template model for GMT level 1 testing" + parameter Modelica.Units.SI.Voltage VHigh = {{data["tx_incoming_voltage"]}} "Rms voltage on side 1 of the transformer (primary side)"; + parameter Modelica.Units.SI.Voltage VLow = {{data["tx_outgoing_voltage"]}} "Rms voltage on side 2 of the transformer (secondary side)"; + parameter Modelica.Units.SI.ApparentPower VABase = {{data["nominal_capacity"]}} "Nominal power of the transformer"; + parameter Real XoverR = {{data["reactance_resistance_ratio"]}} "Ratio between the complex and real components of the impedance (XL/R)"; +extends Buildings.Electrical.AC.ThreePhasesBalanced.Conversion.Examples.ACACTransformer( + tra_load( + VHigh=VHigh, + VLow=VLow, + VABase=VABase, + XoverR=XoverR) + ); +annotation ( + Icon( + coordinateSystem( + preserveAspectRatio=false)), + Diagram( + coordinateSystem( + preserveAspectRatio=false)), + experiment( + StopTime=86400, + Tolerance=1e-06), + Documentation( + info=" +

This model validates the transformer template model implemented in + +Buildings.Electrical.AC.ThreePhasesBalanced.Conversion.Examples.ACACTransformer.mot. +

+", + revisions=" + +")); + +end ACACTransformer; diff --git a/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Conversion/ACACTransformer.py b/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Conversion/ACACTransformer.py index e69de29bb..bf9fc9452 100644 --- a/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Conversion/ACACTransformer.py +++ b/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Conversion/ACACTransformer.py @@ -0,0 +1,24 @@ +from pathlib import Path + +from geojson_modelica_translator.modelica.simple_gmt_base import SimpleGMTBase + + +class ACACTransformer(SimpleGMTBase): + def __init__(self, system_parameters): + self.system_parameters = system_parameters + self.template_dir = Path(__file__).parent + super().__init__(self.system_parameters, self.template_dir) + + def build_from_template(self, output_dir: Path): + transformer_params = self.system_parameters.get_param("$.transformers") + # There can be multiple capacitors so we need to loop over them + for index, transformer in enumerate(transformer_params): + cap_params = { + 'nominal_capacity': transformer["nominal_capacity"], + "reactance_resistance_ratio": transformer["reactance_resistance_ratio"], + "tx_incoming_voltage": transformer["tx_incoming_voltage"], + "tx_outgoing_voltage": transformer["tx_outgoing_voltage"], + 'model_name': f"Transformer{index}", + } + # render template to final modelica file + self.to_modelica(output_dir=output_dir, model_name='ACACTransformer', param_data=cap_params, iteration=index) diff --git a/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Lines/ACLine.mot b/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Lines/ACLine.mot index e9d2853e7..521d4643e 100644 --- a/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Lines/ACLine.mot +++ b/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Lines/ACLine.mot @@ -1,7 +1,8 @@ model AC{{ data["model_name"] }} "Isolated AC distribution line template model for GMT level 1 testing" + parameter Real safety_factor = 1.2; parameter Modelica.Units.SI.Length l={{ data["length"] }}; - parameter Modelica.Units.SI.Power P_nominal={{ data["ampacity"] }}; + parameter Modelica.Units.SI.Power P_nominal={{ data["ampacity"] }}*{{ data["nominal_voltage"] }}*safety_factor; parameter Modelica.Units.SI.Voltage V_nominal={{ data["nominal_voltage"] }}; parameter {{ data["commercial_line_type"] }} cable;{% raw %} extends diff --git a/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Loads/Capacitor.mot b/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Loads/Capacitive.mot similarity index 84% rename from geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Loads/Capacitor.mot rename to geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Loads/Capacitive.mot index 435f9a1d1..aaca534ef 100644 --- a/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Loads/Capacitor.mot +++ b/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Loads/Capacitive.mot @@ -1,10 +1,12 @@ within; model {{ data["model_name"] }} "Isolated capacitor template model for GMT level 1 testing" - parameter Modelica.Units.SI.Power P_nominal = {{ data["nominal_capacity"] }}; + parameter Modelica.Units.SI.Power P_nominal = {{ data["nominal_power_consumption"] }}; + parameter Modelica.Units.SI.Voltage V_nominal = {{ data["nominal_voltage"] }}; extends Buildings.Electrical.AC.ThreePhasesBalanced.Loads.Examples.ParallelLoads( varRC_y( - P_nominal = P_nominal), + P_nominal = P_nominal, + V_nominal=V_nominal), load.height = 0, load.duration = 10, pow.height = 0, diff --git a/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Loads/capacitive.py b/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Loads/capacitive.py new file mode 100644 index 000000000..1ba4f6def --- /dev/null +++ b/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Loads/capacitive.py @@ -0,0 +1,34 @@ +import logging +from pathlib import Path + +from geojson_modelica_translator.modelica.simple_gmt_base import SimpleGMTBase + +logger = logging.getLogger(__name__) +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s: %(message)s', + datefmt='%d-%b-%y %H:%M:%S', +) + + +class Capacitive_load(SimpleGMTBase): + def __init__(self, system_parameters): + self.system_parameters = system_parameters + self.template_dir = Path(__file__).parent + super().__init__(self.system_parameters, self.template_dir) + + def build_from_template(self, output_dir: Path): + for building_index, building in enumerate(self.system_parameters.get_param("$.buildings")): + capacitive_params = { + 'nominal_power_consumption': building["load"]["max_power_kw"], + 'nominal_voltage': building["load"]["nominal_voltage"], + 'model_name': f"Capacitive{building_index}", + } + # render template to final modelica file + self.to_modelica( + output_dir=output_dir, + model_name='Capacitive', + param_data=capacitive_params, + iteration=building_index + ) + # If the sys-param file is missing an entry, it will show up as a jinja2.exceptions.UndefinedError diff --git a/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Loads/capacitor.py b/geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Storage/capacitor.py similarity index 100% rename from geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Loads/capacitor.py rename to geojson_modelica_translator/modelica/GMT_Lib/Electrical/AC/ThreePhasesBalanced/Storage/capacitor.py diff --git a/geojson_modelica_translator/modelica/GMT_Lib/Electrical/Examples/PVsubsystem.mot b/geojson_modelica_translator/modelica/GMT_Lib/Electrical/Examples/PVsubsystem.mot new file mode 100644 index 000000000..a28922571 --- /dev/null +++ b/geojson_modelica_translator/modelica/GMT_Lib/Electrical/Examples/PVsubsystem.mot @@ -0,0 +1,99 @@ +within ; +model PVsubsystem + "microgrid template model for GMT level 1 testing" +//grid parameters + parameter Modelica.Units.SI.Frequency f_gri= {{data["electrical_grid"]["frequency"]}}; + parameter Modelica.Units.SI.Voltage V_gri = {{data["electrical_grid"]["source_rms_voltage"]}}; + parameter Modelica.Units.SI.Angle phiSou_gri = {{data["electrical_grid"]["source_phase_shift"]}}; +//PVPanels parameters + parameter Modelica.Units.SI.Area A_PV = {{ data["photovoltaic_panels"][0]["net_surface_area"] }}; + parameter Modelica.Units.SI.Voltage V_nominalPV = {{ data["photovoltaic_panels"][0]["nominal_voltage"] }}; + parameter Modelica.Units.SI.Angle til_PV = {{ data["photovoltaic_panels"][0]["surface_tilt"] }}; + parameter Modelica.Units.SI.Angle azi_PV = {{ data["photovoltaic_panels"][0]["surface_azimuth"] }}; +//inductive load parameters + parameter Modelica.Units.SI.Power P_nominalInd=-{{ data["buildings"][0]["load"]["max_power_kw"] }} "The negative sign means this the load consumption"; + + parameter Real line_safety_factor = 1.2; + +//PV line parameters +// FIXME: We should use more than a single entry in the sys-param file. pv_subsystem.py should be more sophisticated + parameter Modelica.Units.SI.Length l_LPV={{ data["distribution_lines"][0]["length"] }}; + parameter Modelica.Units.SI.Voltage V_nominal_LPV={{ data["distribution_lines"][0]["nominal_voltage"] }}; + // P_nominal is a required parameter of the line. I think the MBL model should use ampacity instead, but se la vie. + parameter Modelica.Units.SI.Voltage P_nominal_LPV={{ data["distribution_lines"][0]["nominal_voltage"] }}*{{ data["distribution_lines"][0]["ampacity"] }}*line_safety_factor; +//inductive load line parameters + parameter Modelica.Units.SI.Length l_Lind={{ data["distribution_lines"][1]["length"] }}; + parameter Modelica.Units.SI.Voltage V_nominal_Lind={{ data["distribution_lines"][1]["nominal_voltage"]}}; + // P_nominal is a required parameter of the line. I think the MBL model should use ampacity instead, but se la vie. + parameter Modelica.Units.SI.Voltage P_nominal_Lind={{ data["distribution_lines"][1]["nominal_voltage"] }}*{{ data["distribution_lines"][1]["ampacity"] }}*line_safety_factor; + + + Modelica.Blocks.Sources.Constant load(k=1) "Load consumption" + {% raw %}annotation (Placement(transformation(extent={{124,-34},{100,-10}}))); + Buildings.BoundaryConditions.WeatherData.ReaderTMY3 + weaDat(computeWetBulbTemperature=false, filNam= + ModelicaServices.ExternalReferences.loadResource( + "modelica://Buildings/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")) + annotation (Placement(transformation(extent={{-16,108},{-40,132}}))); + Buildings.Electrical.AC.ThreePhasesBalanced.Loads.Inductive InductiveLoad( + mode=Buildings.Electrical.Types.Load.VariableZ_y_input, + P_nominal=P_nominalInd) + annotation (Placement(transformation(extent={{40,-56},{76,-24}}))); + Buildings.Electrical.AC.ThreePhasesBalanced.Sources.PVSimpleOriented PV( + A=A_PV, + V_nominal=V_nominalPV, + til=til_PV, + azi=azi_PV) "PV array oriented" + annotation (Placement(transformation(extent={{-78,42},{-40,78}}))); + Buildings.Electrical.AC.ThreePhasesBalanced.Sources.Grid grid( + f=f_gri, + V=V_gri, + phiSou=phiSou_gri) + "Electrical grid model" + annotation (Placement(transformation(extent={{-132,2},{-106,26}}))); + Buildings.Electrical.AC.ThreePhasesBalanced.Lines.Line line_PV( + l=l_LPV, + P_nominal=P_nominal_LPV, + redeclare Buildings.Electrical.Transmission.MediumVoltageCables.Generic + // TODO: commercialCable should be templatized using the same selection from Lines.py + commercialCable = Buildings.Electrical.Transmission.MediumVoltageCables.Annealed_Al_1000(), + V_nominal=V_nominal_LPV) "line model uses the medium voltage option" + annotation (Placement(transformation( + extent={{10,-10},{-10,10}}, + rotation=90, + origin={-80,20}))); + Buildings.Electrical.AC.ThreePhasesBalanced.Lines.Line line_ind( + l=l_Lind, + P_nominal=P_nominal_Lind, + redeclare Buildings.Electrical.Transmission.MediumVoltageCables.Generic + // TODO: commercialCable should be templatized using the same selection from Lines.py + commercialCable = Buildings.Electrical.Transmission.MediumVoltageCables.Annealed_Al_1000(), + V_nominal=V_nominal_Lind) "line model uses the medium voltage option" + annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=0, + origin={10,-40}))); +equation + connect(weaDat.weaBus, PV.weaBus) annotation (Line( + points={{-40,120},{-59,120},{-59,76.2}}, + color={255,204,51}, + thickness=0.5)); + connect(load.y, InductiveLoad.y) annotation (Line(points={{98.8,-22},{90,-22}, + {90,-40},{76,-40}}, color={0,0,127})); + connect(PV.terminal, line_PV.terminal_n) + annotation (Line(points={{-78,60},{-80,60},{-80,30}}, color={0,120,120})); + connect(line_PV.terminal_p, line_ind.terminal_n) annotation (Line(points={{ + -80,10},{-80,-40},{-8.88178e-16,-40}}, color={0,120,120})); + connect(line_ind.terminal_p, InductiveLoad.terminal) + annotation (Line(points={{20,-40},{40,-40}}, color={0,120,120})); + connect(grid.terminal, line_ind.terminal_n) annotation (Line(points={{-119,2}, + {-119,-40},{-8.88178e-16,-40}}, color={0,120,120})); + annotation ( + Icon(coordinateSystem(preserveAspectRatio=false, extent={{-160,-80},{140, + 140}})), + Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-160,-80},{140, + 140}})), + uses( Modelica(version="4.0.0"), + ModelicaServices(version="4.0.0"), + Buildings(version="9.1.0"))); +{% endraw %}end PVsubsystem; diff --git a/geojson_modelica_translator/modelica/GMT_Lib/Electrical/Examples/pv_subsystem.py b/geojson_modelica_translator/modelica/GMT_Lib/Electrical/Examples/pv_subsystem.py new file mode 100644 index 000000000..2e28a2507 --- /dev/null +++ b/geojson_modelica_translator/modelica/GMT_Lib/Electrical/Examples/pv_subsystem.py @@ -0,0 +1,14 @@ +from pathlib import Path + +from geojson_modelica_translator.modelica.simple_gmt_base import SimpleGMTBase + + +class PVSubsystem(SimpleGMTBase): + def __init__(self, system_parameters): + self.system_parameters = system_parameters + self.template_dir = Path(__file__).parent + super().__init__(self.system_parameters, self.template_dir) + + def build_from_template(self, output_dir: Path): + pv_subsystem_params = self.system_parameters.get_param("$") + self.to_modelica(output_dir=output_dir, model_name='PVsubsystem', param_data=pv_subsystem_params) diff --git a/geojson_modelica_translator/system_parameters/system_parameters.py b/geojson_modelica_translator/system_parameters/system_parameters.py index 9b9f6ca21..89ac9652b 100644 --- a/geojson_modelica_translator/system_parameters/system_parameters.py +++ b/geojson_modelica_translator/system_parameters/system_parameters.py @@ -4,7 +4,6 @@ import json import logging import math -import os from copy import deepcopy from pathlib import Path from typing import Union @@ -480,8 +479,8 @@ def process_electrical_components(self, scenario_dir: Path): capacitor banks (todo) """ dss_data = {} - opendss_json_file = os.path.join(scenario_dir, 'scenario_report_opendss.json') - if (os.path.exists(opendss_json_file)): + opendss_json_file = Path(scenario_dir) / 'scenario_report_opendss.json' + if opendss_json_file.exists(): with open(opendss_json_file, "r") as f: dss_data = json.load(f) @@ -555,13 +554,16 @@ def process_electrical_components(self, scenario_dir: Path): for item in data: t = {} t['id'] = item['id'] - t['nominal_capacity'] = None - if item['power_distribution']['nominal_capacity']: - t['nominal_capacity'] = item['power_distribution']['nominal_capacity'] + t['nominal_capacity'] = item['power_distribution'].get('nominal_capacity', None) + t['reactance_resistance_ratio'] = item['power_distribution'].get('reactance_resistance_ratio', None) + t['tx_incoming_voltage'] = item['power_distribution'].get('tx_incoming_voltage', None) + t['tx_outgoing_voltage'] = item['power_distribution'].get('tx_outgoing_voltage', None) + + # Validate transformer input voltage is same as substation output voltage + if t['tx_incoming_voltage'] is not None and t['tx_incoming_voltage'] != self.param_template['substations']['RMS_voltage_low_side']: + raise ValueError(f"Transformer input voltage {t['tx_incoming_voltage']} does not " + f"match substation output voltage {self.param_template['substations']['RMS_voltage_low_side']}") - t['reactance_resistance_ratio'] = None - if item['power_distribution']['reactance_resistance_ratio']: - t['reactance_resistance_ratio'] = item['power_distribution']['reactance_resistance_ratio'] transformers.append(t) self.param_template['transformers'] = transformers @@ -577,7 +579,7 @@ def process_electrical_components(self, scenario_dir: Path): if match: # add data bldg['load'] = {} - # print("Found match for {}: {}".format(bldg['geojson_id'], match[0]['id'])) + # print(f"Found match for {bldg['geojson_id']}: {match[0]['id']}") bldg['load']['nominal_voltage'] = match[0]['power_distribution']['nominal_voltage'] bldg['load']['max_power_kw'] = match[0]['power_distribution']['max_power_kw'] bldg['load']['max_reactive_power_kvar'] = match[0]['power_distribution']['max_reactive_power_kvar'] @@ -589,9 +591,9 @@ def process_building_microgrid_inputs(self, building, scenario_dir: Path): :param scenario_dir: Path, location/name of folder with uo_sdk results :return building, updated building list object """ - feature_opt_file = os.path.join( - scenario_dir, building['geojson_id'], 'feature_reports', 'feature_optimization.json') - if (os.path.exists(feature_opt_file)): + feature_opt_file = Path( + scenario_dir) / building['geojson_id'] / 'feature_reports' / 'feature_optimization.json' + if feature_opt_file.exists(): with open(feature_opt_file, "r") as f: reopt_data = json.load(f) @@ -618,13 +620,13 @@ def process_microgrid_inputs(self, scenario_dir: Path): reopt_data = {} raw_data = {} # look for REopt scenario_optimization.json file in scenario dir (uo report) - scenario_opt_file = os.path.join(scenario_dir, 'scenario_optimization.json') - if (os.path.exists(scenario_opt_file)): + scenario_opt_file = Path(scenario_dir) / 'scenario_optimization.json' + if scenario_opt_file.exists(): with open(scenario_opt_file, "r") as f: reopt_data = json.load(f) # also look for raw REopt report with inputs and xzx for non-uo results - raw_scenario_file = os.path.join(scenario_dir, 'reopt', f'scenario_report_{scenario_dir.name}_reopt_run.json') - if (os.path.exists(raw_scenario_file)): + raw_scenario_file = Path(scenario_dir) / 'reopt' / f'scenario_report_{scenario_dir.name}_reopt_run.json' + if raw_scenario_file.exists(): with open(raw_scenario_file, "r") as f: raw_data = json.load(f) diff --git a/poetry.lock b/poetry.lock index 27fc03ada..6cfe3e386 100644 --- a/poetry.lock +++ b/poetry.lock @@ -41,13 +41,13 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte [[package]] name = "autopep8" -version = "2.0.2" +version = "2.0.3" description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" optional = false python-versions = ">=3.6" files = [ - {file = "autopep8-2.0.2-py2.py3-none-any.whl", hash = "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1"}, - {file = "autopep8-2.0.2.tar.gz", hash = "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c"}, + {file = "autopep8-2.0.3-py2.py3-none-any.whl", hash = "sha256:ca72bd1e3bf0aa40636860fa07e3f1a762a18d0943cf359b3de09221059ffbd9"}, + {file = "autopep8-2.0.3.tar.gz", hash = "sha256:ba4901621c7f94c6fce134437d577009886d5e3bfa46ee64e1d1d864a5b93cc2"}, ] [package.dependencies] @@ -468,45 +468,45 @@ testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "p [[package]] name = "fonttools" -version = "4.42.0" +version = "4.42.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.42.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9c456d1f23deff64ffc8b5b098718e149279abdea4d8692dba69172fb6a0d597"}, - {file = "fonttools-4.42.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:150122ed93127a26bc3670ebab7e2add1e0983d30927733aec327ebf4255b072"}, - {file = "fonttools-4.42.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48e82d776d2e93f88ca56567509d102266e7ab2fb707a0326f032fe657335238"}, - {file = "fonttools-4.42.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58c1165f9b2662645de9b19a8c8bdd636b36294ccc07e1b0163856b74f10bafc"}, - {file = "fonttools-4.42.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2d6dc3fa91414ff4daa195c05f946e6a575bd214821e26d17ca50f74b35b0fe4"}, - {file = "fonttools-4.42.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fae4e801b774cc62cecf4a57b1eae4097903fced00c608d9e2bc8f84cd87b54a"}, - {file = "fonttools-4.42.0-cp310-cp310-win32.whl", hash = "sha256:b8600ae7dce6ec3ddfb201abb98c9d53abbf8064d7ac0c8a0d8925e722ccf2a0"}, - {file = "fonttools-4.42.0-cp310-cp310-win_amd64.whl", hash = "sha256:57b68eab183fafac7cd7d464a7bfa0fcd4edf6c67837d14fb09c1c20516cf20b"}, - {file = "fonttools-4.42.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0a1466713e54bdbf5521f2f73eebfe727a528905ff5ec63cda40961b4b1eea95"}, - {file = "fonttools-4.42.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3fb2a69870bfe143ec20b039a1c8009e149dd7780dd89554cc8a11f79e5de86b"}, - {file = "fonttools-4.42.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae881e484702efdb6cf756462622de81d4414c454edfd950b137e9a7352b3cb9"}, - {file = "fonttools-4.42.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27ec3246a088555629f9f0902f7412220c67340553ca91eb540cf247aacb1983"}, - {file = "fonttools-4.42.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ece1886d12bb36c48c00b2031518877f41abae317e3a55620d38e307d799b7e"}, - {file = "fonttools-4.42.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:10dac980f2b975ef74532e2a94bb00e97a95b4595fb7f98db493c474d5f54d0e"}, - {file = "fonttools-4.42.0-cp311-cp311-win32.whl", hash = "sha256:83b98be5d291e08501bd4fc0c4e0f8e6e05b99f3924068b17c5c9972af6fff84"}, - {file = "fonttools-4.42.0-cp311-cp311-win_amd64.whl", hash = "sha256:e35bed436726194c5e6e094fdfb423fb7afaa0211199f9d245e59e11118c576c"}, - {file = "fonttools-4.42.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c36c904ce0322df01e590ba814d5d69e084e985d7e4c2869378671d79662a7d4"}, - {file = "fonttools-4.42.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d54e600a2bcfa5cdaa860237765c01804a03b08404d6affcd92942fa7315ffba"}, - {file = "fonttools-4.42.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01cfe02416b6d416c5c8d15e30315cbcd3e97d1b50d3b34b0ce59f742ef55258"}, - {file = "fonttools-4.42.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f81ed9065b4bd3f4f3ce8e4873cd6a6b3f4e92b1eddefde35d332c6f414acc3"}, - {file = "fonttools-4.42.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:685a4dd6cf31593b50d6d441feb7781a4a7ef61e19551463e14ed7c527b86f9f"}, - {file = "fonttools-4.42.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:329341ba3d86a36e482610db56b30705384cb23bd595eac8cbb045f627778e9d"}, - {file = "fonttools-4.42.0-cp38-cp38-win32.whl", hash = "sha256:4655c480a1a4d706152ff54f20e20cf7609084016f1df3851cce67cef768f40a"}, - {file = "fonttools-4.42.0-cp38-cp38-win_amd64.whl", hash = "sha256:6bd7e4777bff1dcb7c4eff4786998422770f3bfbef8be401c5332895517ba3fa"}, - {file = "fonttools-4.42.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9b55d2a3b360e0c7fc5bd8badf1503ca1c11dd3a1cd20f2c26787ffa145a9c7"}, - {file = "fonttools-4.42.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0df8ef75ba5791e873c9eac2262196497525e3f07699a2576d3ab9ddf41cb619"}, - {file = "fonttools-4.42.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd2363ea7728496827658682d049ffb2e98525e2247ca64554864a8cc945568"}, - {file = "fonttools-4.42.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d40673b2e927f7cd0819c6f04489dfbeb337b4a7b10fc633c89bf4f34ecb9620"}, - {file = "fonttools-4.42.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c8bf88f9e3ce347c716921804ef3a8330cb128284eb6c0b6c4b3574f3c580023"}, - {file = "fonttools-4.42.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:703101eb0490fae32baf385385d47787b73d9ea55253df43b487c89ec767e0d7"}, - {file = "fonttools-4.42.0-cp39-cp39-win32.whl", hash = "sha256:f0290ea7f9945174bd4dfd66e96149037441eb2008f3649094f056201d99e293"}, - {file = "fonttools-4.42.0-cp39-cp39-win_amd64.whl", hash = "sha256:ae7df0ae9ee2f3f7676b0ff6f4ebe48ad0acaeeeaa0b6839d15dbf0709f2c5ef"}, - {file = "fonttools-4.42.0-py3-none-any.whl", hash = "sha256:dfe7fa7e607f7e8b58d0c32501a3a7cac148538300626d1b930082c90ae7f6bd"}, - {file = "fonttools-4.42.0.tar.gz", hash = "sha256:614b1283dca88effd20ee48160518e6de275ce9b5456a3134d5f235523fc5065"}, + {file = "fonttools-4.42.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ed1a13a27f59d1fc1920394a7f596792e9d546c9ca5a044419dca70c37815d7c"}, + {file = "fonttools-4.42.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9b1ce7a45978b821a06d375b83763b27a3a5e8a2e4570b3065abad240a18760"}, + {file = "fonttools-4.42.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f720fa82a11c0f9042376fd509b5ed88dab7e3cd602eee63a1af08883b37342b"}, + {file = "fonttools-4.42.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db55cbaea02a20b49fefbd8e9d62bd481aaabe1f2301dabc575acc6b358874fa"}, + {file = "fonttools-4.42.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a35981d90feebeaef05e46e33e6b9e5b5e618504672ca9cd0ff96b171e4bfff"}, + {file = "fonttools-4.42.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:68a02bbe020dc22ee0540e040117535f06df9358106d3775e8817d826047f3fd"}, + {file = "fonttools-4.42.1-cp310-cp310-win32.whl", hash = "sha256:12a7c247d1b946829bfa2f331107a629ea77dc5391dfd34fdcd78efa61f354ca"}, + {file = "fonttools-4.42.1-cp310-cp310-win_amd64.whl", hash = "sha256:a398bdadb055f8de69f62b0fc70625f7cbdab436bbb31eef5816e28cab083ee8"}, + {file = "fonttools-4.42.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:689508b918332fb40ce117131633647731d098b1b10d092234aa959b4251add5"}, + {file = "fonttools-4.42.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e36344e48af3e3bde867a1ca54f97c308735dd8697005c2d24a86054a114a71"}, + {file = "fonttools-4.42.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19b7db825c8adee96fac0692e6e1ecd858cae9affb3b4812cdb9d934a898b29e"}, + {file = "fonttools-4.42.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:113337c2d29665839b7d90b39f99b3cac731f72a0eda9306165a305c7c31d341"}, + {file = "fonttools-4.42.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:37983b6bdab42c501202500a2be3a572f50d4efe3237e0686ee9d5f794d76b35"}, + {file = "fonttools-4.42.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6ed2662a3d9c832afa36405f8748c250be94ae5dfc5283d668308391f2102861"}, + {file = "fonttools-4.42.1-cp311-cp311-win32.whl", hash = "sha256:179737095eb98332a2744e8f12037b2977f22948cf23ff96656928923ddf560a"}, + {file = "fonttools-4.42.1-cp311-cp311-win_amd64.whl", hash = "sha256:f2b82f46917d8722e6b5eafeefb4fb585d23babd15d8246c664cd88a5bddd19c"}, + {file = "fonttools-4.42.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:62f481ac772fd68901573956231aea3e4b1ad87b9b1089a61613a91e2b50bb9b"}, + {file = "fonttools-4.42.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2f806990160d1ce42d287aa419df3ffc42dfefe60d473695fb048355fe0c6a0"}, + {file = "fonttools-4.42.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db372213d39fa33af667c2aa586a0c1235e88e9c850f5dd5c8e1f17515861868"}, + {file = "fonttools-4.42.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d18fc642fd0ac29236ff88ecfccff229ec0386090a839dd3f1162e9a7944a40"}, + {file = "fonttools-4.42.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8708b98c278012ad267ee8a7433baeb809948855e81922878118464b274c909d"}, + {file = "fonttools-4.42.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c95b0724a6deea2c8c5d3222191783ced0a2f09bd6d33f93e563f6f1a4b3b3a4"}, + {file = "fonttools-4.42.1-cp38-cp38-win32.whl", hash = "sha256:4aa79366e442dbca6e2c8595645a3a605d9eeabdb7a094d745ed6106816bef5d"}, + {file = "fonttools-4.42.1-cp38-cp38-win_amd64.whl", hash = "sha256:acb47f6f8680de24c1ab65ebde39dd035768e2a9b571a07c7b8da95f6c8815fd"}, + {file = "fonttools-4.42.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb289b7a815638a7613d46bcf324c9106804725b2bb8ad913c12b6958ffc4ec"}, + {file = "fonttools-4.42.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:53eb5091ddc8b1199330bb7b4a8a2e7995ad5d43376cadce84523d8223ef3136"}, + {file = "fonttools-4.42.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46a0ec8adbc6ff13494eb0c9c2e643b6f009ce7320cf640de106fb614e4d4360"}, + {file = "fonttools-4.42.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cc7d685b8eeca7ae69dc6416833fbfea61660684b7089bca666067cb2937dcf"}, + {file = "fonttools-4.42.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:be24fcb80493b2c94eae21df70017351851652a37de514de553435b256b2f249"}, + {file = "fonttools-4.42.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:515607ec756d7865f23070682622c49d922901943697871fc292277cf1e71967"}, + {file = "fonttools-4.42.1-cp39-cp39-win32.whl", hash = "sha256:0eb79a2da5eb6457a6f8ab904838454accc7d4cccdaff1fd2bd3a0679ea33d64"}, + {file = "fonttools-4.42.1-cp39-cp39-win_amd64.whl", hash = "sha256:7286aed4ea271df9eab8d7a9b29e507094b51397812f7ce051ecd77915a6e26b"}, + {file = "fonttools-4.42.1-py3-none-any.whl", hash = "sha256:9398f244e28e0596e2ee6024f808b06060109e33ed38dcc9bded452fd9bbb853"}, + {file = "fonttools-4.42.1.tar.gz", hash = "sha256:c391cd5af88aacaf41dd7cfb96eeedfad297b5899a39e12f4c2c3706d0a3329d"}, ] [package.extras] @@ -564,13 +564,13 @@ gitdb = ">=4.0.1,<5" [[package]] name = "identify" -version = "2.5.26" +version = "2.5.27" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.26-py2.py3-none-any.whl", hash = "sha256:c22a8ead0d4ca11f1edd6c9418c3220669b3b7533ada0a0ffa6cc0ef85cf9b54"}, - {file = "identify-2.5.26.tar.gz", hash = "sha256:7243800bce2f58404ed41b7c002e53d4d22bcf3ae1b7900c2d7aefd95394bf7f"}, + {file = "identify-2.5.27-py2.py3-none-any.whl", hash = "sha256:fdb527b2dfe24602809b2201e033c2a113d7bdf716db3ca8e3243f735dcecaba"}, + {file = "identify-2.5.27.tar.gz", hash = "sha256:287b75b04a0e22d727bc9a41f0d4f3c1bcada97490fa6eabb5b28f0e9097e733"}, ] [package.extras] @@ -688,7 +688,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, ] [[package]] @@ -712,79 +711,115 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "kiwisolver" -version = "1.4.4" +version = "1.4.5" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.7" files = [ - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, - {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, ] [[package]] @@ -1490,30 +1525,36 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "scipy" -version = "1.11.1" +version = "1.11.2" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = "<3.13,>=3.9" files = [ - {file = "scipy-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aec8c62fbe52914f9cf28d846cf0401dd80ab80788bbab909434eb336ed07c04"}, - {file = "scipy-1.11.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:3b9963798df1d8a52db41a6fc0e6fa65b1c60e85d73da27ae8bb754de4792481"}, - {file = "scipy-1.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e8eb42db36526b130dfbc417609498a6192381abc1975b91e3eb238e0b41c1a"}, - {file = "scipy-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:366a6a937110d80dca4f63b3f5b00cc89d36f678b2d124a01067b154e692bab1"}, - {file = "scipy-1.11.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:08d957ca82d3535b3b9ba6c8ff355d78fe975271874e2af267cb5add5bd78625"}, - {file = "scipy-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:e866514bc2d660608447b6ba95c8900d591f2865c07cca0aa4f7ff3c4ca70f30"}, - {file = "scipy-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba94eeef3c9caa4cea7b402a35bb02a5714ee1ee77eb98aca1eed4543beb0f4c"}, - {file = "scipy-1.11.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:512fdc18c65f76dadaca139348e525646d440220d8d05f6d21965b8d4466bccd"}, - {file = "scipy-1.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cce154372f0ebe88556ed06d7b196e9c2e0c13080ecb58d0f35062dc7cc28b47"}, - {file = "scipy-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4bb943010203465ac81efa392e4645265077b4d9e99b66cf3ed33ae12254173"}, - {file = "scipy-1.11.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:249cfa465c379c9bb2c20123001e151ff5e29b351cbb7f9c91587260602c58d0"}, - {file = "scipy-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:ffb28e3fa31b9c376d0fb1f74c1f13911c8c154a760312fbee87a21eb21efe31"}, - {file = "scipy-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:39154437654260a52871dfde852adf1b93b1d1bc5dc0ffa70068f16ec0be2624"}, - {file = "scipy-1.11.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b588311875c58d1acd4ef17c983b9f1ab5391755a47c3d70b6bd503a45bfaf71"}, - {file = "scipy-1.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d51565560565a0307ed06fa0ec4c6f21ff094947d4844d6068ed04400c72d0c3"}, - {file = "scipy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b41a0f322b4eb51b078cb3441e950ad661ede490c3aca66edef66f4b37ab1877"}, - {file = "scipy-1.11.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:396fae3f8c12ad14c5f3eb40499fd06a6fef8393a6baa352a652ecd51e74e029"}, - {file = "scipy-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:be8c962a821957fdde8c4044efdab7a140c13294997a407eaee777acf63cbf0c"}, - {file = "scipy-1.11.1.tar.gz", hash = "sha256:fb5b492fa035334fd249f0973cc79ecad8b09c604b42a127a677b45a9a3d4289"}, + {file = "scipy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2b997a5369e2d30c97995dcb29d638701f8000d04df01b8e947f206e5d0ac788"}, + {file = "scipy-1.11.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:95763fbda1206bec41157582bea482f50eb3702c85fffcf6d24394b071c0e87a"}, + {file = "scipy-1.11.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e367904a0fec76433bf3fbf3e85bf60dae8e9e585ffd21898ab1085a29a04d16"}, + {file = "scipy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d690e1ca993c8f7ede6d22e5637541217fc6a4d3f78b3672a6fe454dbb7eb9a7"}, + {file = "scipy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d2b813bfbe8dec6a75164523de650bad41f4405d35b0fa24c2c28ae07fcefb20"}, + {file = "scipy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:afdb0d983f6135d50770dd979df50bf1c7f58b5b33e0eb8cf5c73c70600eae1d"}, + {file = "scipy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d9886f44ef8c9e776cb7527fb01455bf4f4a46c455c4682edc2c2cc8cd78562"}, + {file = "scipy-1.11.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1342ca385c673208f32472830c10110a9dcd053cf0c4b7d4cd7026d0335a6c1d"}, + {file = "scipy-1.11.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b133f237bd8ba73bad51bc12eb4f2d84cbec999753bf25ba58235e9fc2096d80"}, + {file = "scipy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aeb87661de987f8ec56fa6950863994cd427209158255a389fc5aea51fa7055"}, + {file = "scipy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:90d3b1364e751d8214e325c371f0ee0dd38419268bf4888b2ae1040a6b266b2a"}, + {file = "scipy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:f73102f769ee06041a3aa26b5841359b1a93cc364ce45609657751795e8f4a4a"}, + {file = "scipy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa4909c6c20c3d91480533cddbc0e7c6d849e7d9ded692918c76ce5964997898"}, + {file = "scipy-1.11.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ac74b1512d38718fb6a491c439aa7b3605b96b1ed3be6599c17d49d6c60fca18"}, + {file = "scipy-1.11.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8425fa963a32936c9773ee3ce44a765d8ff67eed5f4ac81dc1e4a819a238ee9"}, + {file = "scipy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:542a757e2a6ec409e71df3d8fd20127afbbacb1c07990cb23c5870c13953d899"}, + {file = "scipy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ea932570b1c2a30edafca922345854ff2cd20d43cd9123b6dacfdecebfc1a80b"}, + {file = "scipy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:4447ad057d7597476f9862ecbd9285bbf13ba9d73ce25acfa4e4b11c6801b4c9"}, + {file = "scipy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b0620240ef445b5ddde52460e6bc3483b7c9c750275369379e5f609a1050911c"}, + {file = "scipy-1.11.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f28f1f6cfeb48339c192efc6275749b2a25a7e49c4d8369a28b6591da02fbc9a"}, + {file = "scipy-1.11.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:214cdf04bbae7a54784f8431f976704ed607c4bc69ba0d5d5d6a9df84374df76"}, + {file = "scipy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10eb6af2f751aa3424762948e5352f707b0dece77288206f227864ddf675aca0"}, + {file = "scipy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0f3261f14b767b316d7137c66cc4f33a80ea05841b9c87ad83a726205b901423"}, + {file = "scipy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:2c91cf049ffb5575917f2a01da1da082fd24ed48120d08a6e7297dfcac771dcd"}, + {file = "scipy-1.11.2.tar.gz", hash = "sha256:b29318a5e39bd200ca4381d80b065cdf3076c7d7281c5e36569e99273867f61d"}, ] [package.dependencies] @@ -1526,17 +1567,17 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo [[package]] name = "setuptools" -version = "68.1.0" +version = "68.1.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-68.1.0-py3-none-any.whl", hash = "sha256:e13e1b0bc760e9b0127eda042845999b2f913e12437046e663b833aa96d89715"}, - {file = "setuptools-68.1.0.tar.gz", hash = "sha256:d59c97e7b774979a5ccb96388efc9eb65518004537e85d52e81eaee89ab6dd91"}, + {file = "setuptools-68.1.2-py3-none-any.whl", hash = "sha256:3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b"}, + {file = "setuptools-68.1.2.tar.gz", hash = "sha256:3d4dfa6d95f1b101d695a6160a7626e15583af71a5f52176efa5d39a054d475d"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5,<=7.1.2)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] @@ -1824,13 +1865,13 @@ test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.8" +version = "1.1.9" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_serializinghtml-1.1.8-py3-none-any.whl", hash = "sha256:27849e7227277333d3d32f17c138ee148a51fa01f888a41cd6d4e73bcabe2d06"}, - {file = "sphinxcontrib_serializinghtml-1.1.8.tar.gz", hash = "sha256:aaf3026335146e688fd209b72320314b1b278320cf232e3cda198f873838511a"}, + {file = "sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl", hash = "sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1"}, + {file = "sphinxcontrib_serializinghtml-1.1.9.tar.gz", hash = "sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54"}, ] [package.dependencies] diff --git a/tests/GMT_Lib/test_gmt_lib.py b/tests/GMT_Lib/test_gmt_lib.py index 532e7cad1..1feac0d00 100644 --- a/tests/GMT_Lib/test_gmt_lib.py +++ b/tests/GMT_Lib/test_gmt_lib.py @@ -7,11 +7,14 @@ import pytest from jinja2 import Environment, FileSystemLoader, StrictUndefined +from geojson_modelica_translator.modelica.GMT_Lib.Electrical.AC.ThreePhasesBalanced.Conversion.ACACTransformer import ( + ACACTransformer +) from geojson_modelica_translator.modelica.GMT_Lib.Electrical.AC.ThreePhasesBalanced.Lines.Lines import ( DistributionLines ) -from geojson_modelica_translator.modelica.GMT_Lib.Electrical.AC.ThreePhasesBalanced.Loads.capacitor import ( - Capacitor +from geojson_modelica_translator.modelica.GMT_Lib.Electrical.AC.ThreePhasesBalanced.Loads.capacitive import ( + Capacitive_load ) from geojson_modelica_translator.modelica.GMT_Lib.Electrical.AC.ThreePhasesBalanced.Loads.Inductive import ( Inductive_load @@ -31,6 +34,12 @@ from geojson_modelica_translator.modelica.GMT_Lib.Electrical.AC.ThreePhasesBalanced.Storage.Battery import ( Battery ) +from geojson_modelica_translator.modelica.GMT_Lib.Electrical.AC.ThreePhasesBalanced.Storage.capacitor import ( + Capacitor +) +from geojson_modelica_translator.modelica.GMT_Lib.Electrical.Examples.pv_subsystem import ( + PVSubsystem +) from geojson_modelica_translator.modelica.modelica_runner import ModelicaRunner from geojson_modelica_translator.system_parameters.system_parameters import ( SystemParameters @@ -119,6 +128,7 @@ def test_simulate_cooling_plant(): assert success is True +@pytest.mark.skip(reason="This functionality is entirely captured by test_simulate_community_pv") def test_build_community_pv(): # -- Setup @@ -160,6 +170,7 @@ def test_simulate_community_pv(): assert success is True +@pytest.mark.skip(reason="This functionality is entirely captured by test_simulate_wind_turbine") def test_build_wind_turbine(): # -- Setup package_output_dir = PARENT_DIR / 'output' / 'WindTurbine' @@ -239,6 +250,7 @@ def test_simulate_distribution_lines(): assert success is True +@pytest.mark.skip(reason="This functionality is entirely captured by test_simulate_capacitor") def test_build_capacitor(): # -- Setup package_output_dir = PARENT_DIR / 'output' / 'Capacitor' @@ -254,6 +266,32 @@ def test_build_capacitor(): assert linecount(package_output_dir / 'Capacitor0.mo') > 20 +@pytest.mark.skip(reason="Capacitors are not yet implemented") +@pytest.mark.simulation +def test_simulate_capacitor(): + # -- Setup + package_output_dir = PARENT_DIR / 'output' / 'Capacitor' + package_output_dir.mkdir(parents=True, exist_ok=True) + sys_params = SystemParameters(MICROGRID_PARAMS) + + # -- Act + capacitor = Capacitor(sys_params) + capacitor.build_from_template(package_output_dir) + + runner = ModelicaRunner() + success, _ = runner.run_in_docker( + 'compile_and_run', 'Capacitor0', + file_to_load=package_output_dir / 'Capacitor0.mo', + run_path=package_output_dir) + + # -- Assert + # Did the mofile get created? + assert linecount(package_output_dir / 'Capacitor0.mo') > 20 + # Did the simulation run? + assert success is True + + +@pytest.mark.skip(reason="This functionality is entirely captured by test_simulate_battery") def test_build_battery(): # -- Setup package_output_dir = PARENT_DIR / 'output' / 'Battery' @@ -269,6 +307,31 @@ def test_build_battery(): assert linecount(package_output_dir / 'AcBattery0.mo') > 20 +@pytest.mark.simulation +def test_simulate_battery(): + # -- Setup + package_output_dir = PARENT_DIR / 'output' / 'Battery' + package_output_dir.mkdir(parents=True, exist_ok=True) + sys_params = SystemParameters(MICROGRID_PARAMS) + + # -- Act + battery = Battery(sys_params) + battery.build_from_template(package_output_dir) + + runner = ModelicaRunner() + success, _ = runner.run_in_docker( + 'compile_and_run', 'AcBattery0', + file_to_load=package_output_dir / 'AcBattery0.mo', + run_path=package_output_dir) + + # -- Assert + # Did the mofile get created? + assert linecount(package_output_dir / 'AcBattery0.mo') > 20 + # Did the simulation run? + assert success is True + + +@pytest.mark.skip(reason="This functionality is entirely captured by test_simulate_generator") def test_build_generator(): # -- Setup package_output_dir = PARENT_DIR / 'output' / 'Generator' @@ -284,6 +347,31 @@ def test_build_generator(): assert linecount(package_output_dir / 'Generator0.mo') > 20 +@pytest.mark.simulation +def test_simulate_generator(): + # -- Setup + package_output_dir = PARENT_DIR / 'output' / 'Generator' + package_output_dir.mkdir(parents=True, exist_ok=True) + sys_params = SystemParameters(MICROGRID_PARAMS) + + # -- Act + generator = Generator(sys_params) + generator.build_from_template(package_output_dir) + + runner = ModelicaRunner() + success, _ = runner.run_in_docker( + 'compile_and_run', 'Generator0', + file_to_load=package_output_dir / 'Generator0.mo', + run_path=package_output_dir) + + # -- Assert + # Did the mofile get created? + assert linecount(package_output_dir / 'Generator0.mo') > 20 + # Did the simulation run? + assert success is True + + +@pytest.mark.skip(reason="This functionality is entirely captured by test_simulate_grid") def test_build_grid(): # -- Setup package_output_dir = PARENT_DIR / 'output' / 'Grid' @@ -299,6 +387,70 @@ def test_build_grid(): assert linecount(package_output_dir / 'Grid.mo') > 20 +@pytest.mark.simulation +def test_simulate_grid(): + # -- Setup + package_output_dir = PARENT_DIR / 'output' / 'Grid' + package_output_dir.mkdir(parents=True, exist_ok=True) + sys_params = SystemParameters(MICROGRID_PARAMS) + + # -- Act + grid = Grid(sys_params) + grid.build_from_template(package_output_dir) + + runner = ModelicaRunner() + success, _ = runner.run_in_docker( + 'compile_and_run', 'Grid', + file_to_load=package_output_dir / 'Grid.mo', + run_path=package_output_dir) + + # -- Assert + # Did the mofile get created? + assert linecount(package_output_dir / 'Grid.mo') > 20 + # Did the simulation run? + assert success is True + + +@pytest.mark.skip(reason="This functionality is entirely captured by test_simulate_capacitive_load") +def test_build_capacitive_load(): + # -- Setup + package_output_dir = PARENT_DIR / 'output' / 'Capacitive' + package_output_dir.mkdir(parents=True, exist_ok=True) + sys_params = SystemParameters(MICROGRID_PARAMS) + + # -- Act + capacitive = Capacitive_load(sys_params) + capacitive.build_from_template(package_output_dir) + + # -- Assert + # Did the mofile get created? + assert linecount(package_output_dir / 'Capacitive0.mo') > 20 + + +@pytest.mark.simulation +def test_simulate_capacitive_load(): + # -- Setup + package_output_dir = PARENT_DIR / 'output' / 'Capacitive' + package_output_dir.mkdir(parents=True, exist_ok=True) + sys_params = SystemParameters(MICROGRID_PARAMS) + + # -- Act + capacitive = Capacitive_load(sys_params) + capacitive.build_from_template(package_output_dir) + + runner = ModelicaRunner() + success, _ = runner.run_in_docker( + 'compile_and_run', 'Capacitive0', + file_to_load=package_output_dir / 'Capacitive0.mo', + run_path=package_output_dir) + + # -- Assert + # Did the mofile get created? + assert linecount(package_output_dir / 'Capacitive0.mo') > 20 + # Did the simulation run? + assert success is True + + def test_build_inductive_load(): # -- Setup package_output_dir = PARENT_DIR / 'output' / 'Inductive' @@ -338,6 +490,89 @@ def test_simulate_inductive_load(): # Did the simulation run? assert success is True + +@pytest.mark.skip(reason="This functionality is entirely captured by test_simulate_pv_subsystem") +def test_build_pv_subsystem(): + # -- Setup + package_output_dir = PARENT_DIR / 'output' / 'PVSubsystem' + package_output_dir.mkdir(parents=True, exist_ok=True) + sys_params = SystemParameters(MICROGRID_PARAMS) + + # -- Act + pv_subsystem = PVSubsystem(sys_params) + pv_subsystem.build_from_template(package_output_dir) + + # -- Assert + # Did the mofile get created? + assert linecount(package_output_dir / 'PVsubsystem.mo') > 20 + + +@pytest.mark.simulation +def test_simulate_pv_subsystem(): + # -- Setup + package_output_dir = PARENT_DIR / 'output' / 'PVsubsystem' + package_output_dir.mkdir(parents=True, exist_ok=True) + sys_params = SystemParameters(MICROGRID_PARAMS) + + # -- Act + # Build the model + pv_subsystem = PVSubsystem(sys_params) + pv_subsystem.build_from_template(package_output_dir) + + # Run the simulation + runner = ModelicaRunner() + success, _ = runner.run_in_docker( + 'compile_and_run', 'PVsubsystem', + file_to_load=package_output_dir / 'PVsubsystem.mo', + run_path=package_output_dir) + + # -- Assert + # Did the mofile get created? + assert linecount(package_output_dir / 'PVsubsystem.mo') > 20 + # Did the simulation run? + assert success is True + + +@pytest.mark.skip(reason="This functionality is entirely captured by test_simulate_transformer") +def test_build_transformer(): + # -- Setup + package_output_dir = PARENT_DIR / 'output' / 'ACACTransformer' + package_output_dir.mkdir(parents=True, exist_ok=True) + sys_params = SystemParameters(MICROGRID_PARAMS) + + # -- Act + transformer = ACACTransformer(sys_params) + transformer.build_from_template(package_output_dir) + + # -- Assert + # Did the mofile get created? + assert linecount(package_output_dir / 'ACACTransformer0.mo') > 20 + + +@pytest.mark.simulation +def test_simulate_transformer(): + # -- Setup + package_output_dir = PARENT_DIR / 'output' / 'ACACTransformer' + package_output_dir.mkdir(parents=True, exist_ok=True) + sys_params = SystemParameters(MICROGRID_PARAMS) + + # -- Act + transformer = ACACTransformer(sys_params) + transformer.build_from_template(package_output_dir) + + runner = ModelicaRunner() + success, _ = runner.run_in_docker( + 'compile_and_run', 'ACACTransformer', + file_to_load=package_output_dir / 'ACACTransformer0.mo', + run_path=package_output_dir) + + # -- Assert + # Did the mofile get created? + assert linecount(package_output_dir / 'ACACTransformer0.mo') > 20 + # Did the simulation run? + assert success is True + + # Keeping the code below because it may come back and this was a weird issue. # @pytest.mark.simulation # def test_stub_mbl_v9_with_not_msl_v4(): diff --git a/tests/data_shared/system_params_microgrid_example.json b/tests/data_shared/system_params_microgrid_example.json index c31640a1a..876e15113 100644 --- a/tests/data_shared/system_params_microgrid_example.json +++ b/tests/data_shared/system_params_microgrid_example.json @@ -340,27 +340,37 @@ { "id": "Transformer.897530f5-a6d6-446f-94fd-4087196fceaf", "nominal_capacity": 75.0, - "reactance_resistance_ratio": 1.0 + "reactance_resistance_ratio": 1.0, + "tx_incoming_voltage": 13200, + "tx_outgoing_voltage": 480 }, { "id": "Transformer.1b4b5dcf-8d18-4954-b655-a93634542733", "nominal_capacity": 50.0, - "reactance_resistance_ratio": 1.0 + "reactance_resistance_ratio": 1.0, + "tx_incoming_voltage": 13200, + "tx_outgoing_voltage": 480 }, { "id": "Transformer.502e96e3-853a-4b3d-b88d-fe59af4d7b65", "nominal_capacity": 50.0, - "reactance_resistance_ratio": 1.0 + "reactance_resistance_ratio": 1.0, + "tx_incoming_voltage": 13200, + "tx_outgoing_voltage": 480 }, { "id": "Transformer.b02e3fe9-77d0-47f9-86cb-e4db960afd62", "nominal_capacity": 75.0, - "reactance_resistance_ratio": 1.0 + "reactance_resistance_ratio": 1.0, + "tx_incoming_voltage": 13200, + "tx_outgoing_voltage": 480 }, { "id": "Transformer.54cd0a5a-2ebe-4b39-936a-f238b503c221", "nominal_capacity": 100.0, - "reactance_resistance_ratio": 1.0 + "reactance_resistance_ratio": 1.0, + "tx_incoming_voltage": 13200, + "tx_outgoing_voltage": 480 } ], "power_converters": [], diff --git a/tests/model_connectors/test_district_5g.py b/tests/model_connectors/test_district_5g.py index 8e17bfe9f..5e3920a7f 100644 --- a/tests/model_connectors/test_district_5g.py +++ b/tests/model_connectors/test_district_5g.py @@ -72,7 +72,6 @@ def test_build_district_system(self): assert (root_path / 'DistrictEnergySystem.mo').exists() @pytest.mark.simulation - @pytest.mark.skip('OMC Failure: Error: Trying to override final element allowFlowReversalSer with modifier') def test_simulate_district_system(self): self.run_and_assert_in_docker( f'{self.district._scaffold.project_name}.Districts.DistrictEnergySystem', diff --git a/tests/model_connectors/test_district_heating_and_cooling_systems.py b/tests/model_connectors/test_district_heating_and_cooling_systems.py index 5a3c1d0cf..b148d8778 100644 --- a/tests/model_connectors/test_district_heating_and_cooling_systems.py +++ b/tests/model_connectors/test_district_heating_and_cooling_systems.py @@ -107,19 +107,21 @@ def test_build_district_heating_and_cooling_systems(self): # project_name=self.district._scaffold.project_name) @pytest.mark.simulation - @pytest.mark.skip("OMC Failed. Simulation completed, but lots of errors in stdout.log") def test_simulate_district_heating_and_cooling_systems(self): self.run_and_assert_in_docker( f'{self.district._scaffold.project_name}.Districts.DistrictEnergySystem', file_to_load=self.district._scaffold.package_path, - run_path=self.district._scaffold.project_path + run_path=self.district._scaffold.project_path, + start_time=17280000, # Day 200 (in seconds) (Run in summer to keep chiller happy) + stop_time=17366400, # For 1 day duration (in seconds) + step_size=90 # (in seconds) ) # # Validate model outputs # results_dir = f'{self.district._scaffold.project_path}/{self.project_name}.Districts.DistrictEnergySystem_results' - mat_file = f'{results_dir}/{self.project_name}_Districts_DistrictEnergySystem_res.mat' + mat_file = f'{results_dir}/{self.project_name}.Districts.DistrictEnergySystem_res.mat' mat_results = Reader(mat_file, 'dymola') # check the mass flow rates of the first load are in the expected range