From 8a72d27fb1bdf326f4756f954bed8899fe8707e2 Mon Sep 17 00:00:00 2001 From: Luis Aleixo Date: Thu, 23 Mar 2023 12:02:19 +0100 Subject: [PATCH] updated expert app notebook and tests --- caimira/apps/expert.py | 14 +++-- caimira/tests/test_state.py | 7 ++- requirements.new.txt | 105 ------------------------------------ 3 files changed, 16 insertions(+), 110 deletions(-) delete mode 100644 requirements.new.txt diff --git a/caimira/apps/expert.py b/caimira/apps/expert.py index c0a60312..c8955512 100644 --- a/caimira/apps/expert.py +++ b/caimira/apps/expert.py @@ -883,6 +883,9 @@ class CAIMIRAStateBuilder(state.StateBuilder): # Note: The methods in this class must correspond to the *type* of the data classes. # For example, build_type__VentilationBase is called when dealing with ConcentrationModel # types as it has a ventilation: _VentilationBase field. + + def __init__(self, selected_ventilation: str): + self.selected_ventilation = selected_ventilation def build_type_Mask(self, _: dataclasses.Field): return state.DataclassStatePredefined( @@ -901,6 +904,7 @@ class CAIMIRAStateBuilder(state.StateBuilder): 'HEPAFilter': self.build_generic(models.HEPAFilter), }, + base_type=self.selected_ventilation, state_builder=self, ) #Initialise the "Hinged window" state @@ -955,10 +959,10 @@ class ExpertApplication(Controller): ) self.add_scenario('Scenario 1') - def build_new_model(self) -> state.DataclassInstanceState[models.ExposureModel]: + def build_new_model(self, vent: str) -> state.DataclassInstanceState[models.ExposureModel]: default_model = state.DataclassInstanceState( models.ExposureModel, - state_builder=CAIMIRAStateBuilder(), + state_builder=CAIMIRAStateBuilder(selected_ventilation=vent), ) default_model.dcs_update_from(baseline_model) # For the time-being, we have to initialise the select states. Careful @@ -967,9 +971,13 @@ class ExpertApplication(Controller): return default_model def add_scenario(self, name, copy_from_model: typing.Optional[state.DataclassInstanceState] = None): - model = self.build_new_model() if copy_from_model is not None: + model = self.build_new_model(vent=copy_from_model.concentration_model.ventilation._selected) model.dcs_update_from(copy_from_model.dcs_instance()) + else: + model = self.build_new_model(vent='Natural') # Default + model.dcs_update_from(baseline_model) + self._model_scenarios.append((name, model)) self._active_scenario = len(self._model_scenarios) - 1 model.dcs_observe(self.notify_model_values_changed) diff --git a/caimira/tests/test_state.py b/caimira/tests/test_state.py index f984136d..ac0341fe 100644 --- a/caimira/tests/test_state.py +++ b/caimira/tests/test_state.py @@ -167,11 +167,14 @@ def test_DCS_predefined(): def test_DCS_named(): opt1 = DCSimpleSubclass('a', 1, 3.14) opt2 = DCAnother(4.2) - s = state.DataclassStateNamed({ + s = state.DataclassStateNamed( + states={ # Entirely different types possible. 'option 1': state.DataclassInstanceState(DCSimple), 'option 2': state.DataclassInstanceState(DCAnother), - }) + }, + base_type='option 1' + ) assert s._selected == 'option 1' with pytest.raises(ValueError): diff --git a/requirements.new.txt b/requirements.new.txt deleted file mode 100644 index f6112691..00000000 --- a/requirements.new.txt +++ /dev/null @@ -1,105 +0,0 @@ -anyio==3.6.2 -appnope==0.1.3 -argon2-cffi==21.3.0 -argon2-cffi-bindings==21.2.0 -asttokens==2.2.1 -attrs==22.2.0 -Babel==2.11.0 -backcall==0.2.0 -beautifulsoup4==4.11.2 -bleach==6.0.0 -certifi==2022.12.7 -cffi==1.15.1 -charset-normalizer==3.0.1 -cloudpickle==2.2.1 -comm==0.1.2 -contourpy==1.0.7 -cycler==0.11.0 -debugpy==1.6.6 -decorator==5.1.1 -defusedxml==0.7.1 -entrypoints==0.4 -executing==1.2.0 -fastjsonschema==2.16.2 -fonttools==4.38.0 -h3==3.7.6 -idna==3.4 -importlib-metadata==6.0.0 -importlib-resources==5.12.0 -ipykernel==6.21.2 -ipympl==0.9.3 -ipython==8.10.0 -ipython-genutils==0.2.0 -ipywidgets==7.7.3 -jedi==0.18.2 -Jinja2==3.1.2 -joblib==1.2.0 -json5==0.9.11 -jsonschema==4.17.3 -jupyter-client==7.4.1 -jupyter-core==5.2.0 -jupyter-server==1.23.6 -jupyterlab-pygments==0.2.2 -jupyterlab-server==2.19.0 -jupyterlab-widgets==1.1.2 -kiwisolver==1.4.4 -loky==3.3.0 -MarkupSafe==2.1.2 -matplotlib==3.7.0 -matplotlib-inline==0.1.6 -memoization==0.4.0 -mistune==2.0.5 -nbclassic==0.5.2 -nbclient==0.7.2 -nbconvert==7.2.9 -nbformat==5.7.3 -nest-asyncio==1.5.6 -notebook==6.5.2 -notebook-shim==0.2.2 -numpy==1.24.2 -packaging==23.0 -pandas==1.5.3 -pandocfilters==1.5.0 -parso==0.8.3 -pexpect==4.8.0 -pickleshare==0.7.5 -Pillow==9.4.0 -platformdirs==3.0.0 -prometheus-client==0.16.0 -prompt-toolkit==3.0.37 -psutil==5.9.4 -ptyprocess==0.7.0 -pure-eval==0.2.2 -py==1.11.0 -pycparser==2.21 -Pygments==2.14.0 -pyparsing==3.0.9 -pyrsistent==0.19.3 -python-dateutil==2.8.2 -pytz==2022.7.1 -pyzmq==25.0.0 -requests==2.28.2 -retry==0.9.2 -scikit-learn==1.2.1 -scipy==1.10.1 -Send2Trash==1.8.0 -six==1.16.0 -sniffio==1.3.0 -soupsieve==2.4 -stack-data==0.6.2 -terminado==0.17.1 -threadpoolctl==3.1.0 -timezonefinder==6.1.9 -tinycss2==1.2.1 -tornado==6.2 -traitlets==5.9.0 -types-retry==0.9.9.2 -urllib3==1.26.14 -voila==0.4.0 -wcwidth==0.2.6 -webencodings==0.5.1 -websocket-client==1.5.1 -websockets==10.4 -wheel==0.36.2 -widgetsnbextension==3.6.2 -zipp==3.14.0