From 75103cf022c3095501f9db168c0a96803f36975d Mon Sep 17 00:00:00 2001 From: Bridenbecker Date: Sat, 21 Sep 2024 09:43:16 -0700 Subject: [PATCH] v1.22.1 - June 24, 2024 - Adding support for Custom_Node_Events and Custom_Coordinator_Events - Updating a lot of documentation-related things - Updating tests (fixes, improvements) --- .bumpversion.cfg | 2 +- docs/_templates/breadcrumbs.html | 9 ----- docs/_templates/footer.html | 8 ----- docs/_templates/footer_end.html | 2 ++ docs/_templates/footer_start.html | 3 ++ docs/_templates/navbar-side.html | 12 +++++++ docs/_templates/page.html | 14 ++++++++ docs/conf.py | 47 +++++++++++++++++++++----- docs/images/idm-logo-transparent.png | Bin 0 -> 60513 bytes docs/index.rst | 5 +-- docs/requirements.txt | 5 +-- emodpy/__init__.py | 2 +- emodpy/emod_task.py | 15 ++++++--- requirements.txt | 4 ++- setup.py | 2 +- tests/manifest.py | 3 +- tests/my_sif.sif | 1 - tests/test_emod_task.py | 48 +++++++++------------------ tests/test_experiment_simulations.py | 6 ++++ tests/test_workflow_campaign.py | 2 +- tests/test_workflow_demographics.py | 6 ++-- 21 files changed, 120 insertions(+), 76 deletions(-) delete mode 100644 docs/_templates/breadcrumbs.html delete mode 100644 docs/_templates/footer.html create mode 100644 docs/_templates/footer_end.html create mode 100644 docs/_templates/footer_start.html create mode 100644 docs/_templates/navbar-side.html create mode 100644 docs/images/idm-logo-transparent.png delete mode 100644 tests/my_sif.sif diff --git a/.bumpversion.cfg b/.bumpversion.cfg index ea7e005..6ac8654 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.22.0 +current_version = 1.22.1 commit = False tag = False parse = (?P\d+)\.(?P\d+)\.(?P\d+)((?P[\+a-z]+)\.(?P\d+))? diff --git a/docs/_templates/breadcrumbs.html b/docs/_templates/breadcrumbs.html deleted file mode 100644 index e6b51f7..0000000 --- a/docs/_templates/breadcrumbs.html +++ /dev/null @@ -1,9 +0,0 @@ -{% extends '!breadcrumbs.html' %} -{% block breadcrumbs %} -
  • IDM docs »
  • -
  • emodpy »
  • - {% for doc in parents %} -
  • {{ doc.title }} »
  • - {% endfor %} -
  • {{ title }}
  • -{% endblock %} \ No newline at end of file diff --git a/docs/_templates/footer.html b/docs/_templates/footer.html deleted file mode 100644 index a186694..0000000 --- a/docs/_templates/footer.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends '!footer.html' %} -{% block extrafooter %} -

    emodpy is licensed under the Creative Commons - Attribution-ShareAlike 4.0 International License.

    -

    Send documentation feedback to feedback@idmod.org.

    -

    Privacy and Cookies Notice   |    -Terms of Use

    -{% endblock %} diff --git a/docs/_templates/footer_end.html b/docs/_templates/footer_end.html new file mode 100644 index 0000000..dd7be74 --- /dev/null +++ b/docs/_templates/footer_end.html @@ -0,0 +1,2 @@ +

    Privacy and Cookies Notice   |    +Terms of Use

    diff --git a/docs/_templates/footer_start.html b/docs/_templates/footer_start.html new file mode 100644 index 0000000..54f6ca2 --- /dev/null +++ b/docs/_templates/footer_start.html @@ -0,0 +1,3 @@ +

    emodpy is licensed under the Creative Commons + Attribution-ShareAlike 4.0 International License.

    +

    Send documentation feedback to idmsupport@gatesfoundation.org.

    diff --git a/docs/_templates/navbar-side.html b/docs/_templates/navbar-side.html new file mode 100644 index 0000000..5fa0dd9 --- /dev/null +++ b/docs/_templates/navbar-side.html @@ -0,0 +1,12 @@ +{# Displays links to the top-level TOCtree elements, in the header navbar. #} + \ No newline at end of file diff --git a/docs/_templates/page.html b/docs/_templates/page.html index 0d1bb20..8b208b5 100644 --- a/docs/_templates/page.html +++ b/docs/_templates/page.html @@ -4,6 +4,20 @@ {% block extrahead %} + + + + + + + + + {% endblock %} diff --git a/docs/conf.py b/docs/conf.py index aeed16b..7488cb0 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -19,7 +19,7 @@ import os import subprocess import sys -import sphinx_rtd_theme +#import sphinx_rtd_theme import configparser from datetime import datetime from urllib.request import urlretrieve @@ -191,17 +191,48 @@ # The theme to use for HTML and HTML Help pages. See the docs for # a list of builtin themes. # -html_theme = 'sphinx_rtd_theme' +html_theme = 'pydata_sphinx_theme' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # docs. # # -# html_theme_options = { -# } +html_theme_options = { + "collapse_navigation": False, + "navigation_depth": 3, + "show_prev_next": True, + "icon_links": [ + {"name": "IDM docs", "url": "https://docs.idmod.org", "icon": "fas fa-home"}, + { + "name": "GitHub", + "url": "https://github.com/institutefordiseasemodeling/emodpy", + "icon": "fab fa-github-square", + }, + ], + "navbar_end": ["theme-switcher", "navbar-icon-links"], + "secondary_sidebar_items": ["navbar-side"], + "header_links_before_dropdown": 5, + "footer_start": ["copyright", "footer_start"], + "footer_end": ["theme-version", "footer_end"], +} +html_sidebars = { + "**": ["sidebar-nav-bs", "page-toc"], +} +html_logo = "images/idm-logo-transparent.png" +html_favicon = "images/favicon.ico" +html_static_path = ['_static'] +html_baseurl = "https://docs.idmod.org/projects/emodpy/en/latest" +html_context = { + 'rtd_url': 'https://docs.idmod.org/projects/emodpy/en/latest', + "versions_dropdown": { + "latest": "devel (latest)", + "stable": "current (stable)", + }, + "default_mode": "light", +} # Add any paths that contain custom themes here, relative to this directory. -html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] +#html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] # The name for this set of Sphinx documents. # " v docs" by default. @@ -215,7 +246,7 @@ # The name of an image file (relative to this directory) to place at the top # of the sidebar. # -html_logo = "images/IDM_white.png" +#html_logo = "images/IDM_white.png" # The name of an image file (relative to this directory) to use as a favicon of # the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 @@ -231,7 +262,7 @@ html_css_files = ['theme_overrides.css'] -html_js_files = ['show_block_by_os.js'] +#html_js_files = ['show_block_by_os.js'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied @@ -297,7 +328,7 @@ search_project = os.environ["READTHEDOCS_PROJECT"] search_version = os.environ["READTHEDOCS_VERSION"] - rtd_sphinx_search_default_filter = f"subprojects:{search_project_parent}/{search_version}" + rtd_sphinx_search_default_filter = f"subprojects:{search_project}/{search_version}" rtd_sphinx_search_filters = { "Search this project": f"project:{search_project}/{search_version}", diff --git a/docs/images/idm-logo-transparent.png b/docs/images/idm-logo-transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..d461df7ba2fce10a1d6ac4f8eb9e764be496c9b3 GIT binary patch literal 60513 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 literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index 5280990..d6d51fc 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -11,6 +11,9 @@ See :doc:`idmtools:api/idmtools_index` for a diagram showing how |IT_s| and each related packages are used in an end-to-end workflow using |EMOD_s| as the disease transmission model. +Contents +-------- + .. toctree:: :maxdepth: 3 :titlesonly: @@ -35,7 +38,6 @@ disease transmission model. :titlesonly: :caption: Related documentation - emodpy Jupyter notebooks EMOD generic emod-api idmtools @@ -43,6 +45,5 @@ disease transmission model. .. not sure what to do with catalyst. Not included yet. -.. nothing done with STAMP yet; not sure if it will be some sort of "plug-in" to the tools or totally standalone diff --git a/docs/requirements.txt b/docs/requirements.txt index 9392c41..d421630 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,6 +1,6 @@ sphinxext.remoteliteralinclude~=0.4.0 sphinx~=6.2.1 -sphinx-rtd-theme~=1.2.2 +pydata-sphinx-theme sphinxcontrib-napoleon~=0.7 plantweb~=1.2.1 sphinxcontrib-programoutput~=0.17 @@ -9,4 +9,5 @@ jupyterlab~=4.0.2 myst-parser~=2.0.0 readthedocs-sphinx-search~=0.3.1 sphinx-copybutton~=0.5.2 -pygithub~=1.57 \ No newline at end of file +pygithub~=1.57 +sphinxcontrib-jquery~=4.1 \ No newline at end of file diff --git a/emodpy/__init__.py b/emodpy/__init__.py index df6fd19..c5c5c7d 100644 --- a/emodpy/__init__.py +++ b/emodpy/__init__.py @@ -1,4 +1,4 @@ # flake8: noqa F821 from emodpy.defaults.iemod_default import IEMODDefault -__version__ = "1.22.0" +__version__ = "1.22.1" diff --git a/emodpy/emod_task.py b/emodpy/emod_task.py index 678f5ca..2a7712e 100644 --- a/emodpy/emod_task.py +++ b/emodpy/emod_task.py @@ -138,10 +138,8 @@ def create_campaign_from_callback(self, builder, params=None): adhoc_events = campaign.get_adhocs() if dev_mode: campaign.save() - # This might be a great place to reset the campaign object so users don't have to. - campaign.reset() - if len(adhoc_events) > 0: + if adhoc_events: # print("Found adhoc events in campaign. Needs some special processing behind the scenes.") logger.debug("Found adhoc events in campaign. Needs some special processing behind the scenes.") if "Custom_Individual_Events" in self.config.parameters: @@ -149,8 +147,17 @@ def create_campaign_from_callback(self, builder, params=None): else: reverse_map = {} for user_name, builtin_name in adhoc_events.items(): - reverse_map[builtin_name] = user_name + reverse_map[builtin_name] = user_name self.config.parameters["Event_Map"] = reverse_map + # checking attributes because if using older emod-api whose campaign doesn't have them, + # we don't want to fail, just move on. + if hasattr(campaign, "get_custom_coordinator_events") and "Custom_Coordinator_Events" in self.config.parameters: + self.config.parameters.Custom_Coordinator_Events = campaign.get_custom_coordinator_events() + if hasattr(campaign, "get_custom_node_events") and "Custom_Node_Events" in self.config.parameters: + self.config.parameters.Custom_Node_Events = campaign.get_custom_node_events() + + # This might be a great place to reset the campaign object so users don't have to. + campaign.reset() def create_demog_from_callback(self, builder, from_sweep=False, params=None): if builder is None: diff --git a/requirements.txt b/requirements.txt index 13777d9..b519b4d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ click~=7.1 idmtools~=1.7 idmtools-platform-comps~=1.7 idmtools-models~=1.7 -emod-api~=1.24 +emod-api~=1.30 matplotlib astor astunparse @@ -11,3 +11,5 @@ bs4 keyring pyCOMPS~=2.6 requests==2.29.0 +xmlrunner~=1.7.7 +pytest==8.1.2 \ No newline at end of file diff --git a/setup.py b/setup.py index d088e9f..f1035ca 100644 --- a/setup.py +++ b/setup.py @@ -63,5 +63,5 @@ setup_requires=setup_requirements, test_suite='tests', extras_require=extras, - version='1.22.0' + version='1.22.1' ) diff --git a/tests/manifest.py b/tests/manifest.py index f6eb2fe..11c7742 100644 --- a/tests/manifest.py +++ b/tests/manifest.py @@ -21,8 +21,7 @@ output_dir = os.path.join(current_directory, "output") serialization_files_dir = os.path.join(output_dir, "serialization_files", "output") -sft_id = "e5d5ab18-cfcf-ec11-92e9-f0921c167864" -sft_id_file = os.path.join(current_directory, "stage_sif.id") +sft_id_file = "stage_sif.id" demographics_folder = os.path.join(current_directory, "inputs", "demographics") if not os.path.isdir(demographics_folder): diff --git a/tests/my_sif.sif b/tests/my_sif.sif deleted file mode 100644 index a564fe0..0000000 --- a/tests/my_sif.sif +++ /dev/null @@ -1 +0,0 @@ -test! \ No newline at end of file diff --git a/tests/test_emod_task.py b/tests/test_emod_task.py index 41c25c7..21cc587 100644 --- a/tests/test_emod_task.py +++ b/tests/test_emod_task.py @@ -141,15 +141,6 @@ def test_from_files(self): implicit_config_set_fns=self.demog.implicits), config_out_path=self.config_path) - # workaround for https://github.com/InstituteforDiseaseModeling/emodpy/issues/358 - import emod_api.schema_to_class as s2c - with open(self.config_path) as conf: - config_rod = json.load(conf, object_hook=s2c.ReadOnlyDict) - config_rod.parameters.Enable_Demographics_Builtin = 1 - del config_rod.parameters["Demographics_Filenames"] - with open(self.config_path, "w") as outfile: - json.dump(config_rod, outfile, sort_keys=True, indent=4) - task = EMODTask.from_files( eradication_path=self.eradication_path, config_path=self.config_path, @@ -214,10 +205,10 @@ def test_from_files(self): del sim.task.config["parameters"]["Enable_Demographics_Builtin"] del sim.task.config["parameters"]["Demographics_Filenames"] + del config["Demographics_Filenames"] del config["Enable_Demographics_Builtin"] self.assertEqual(config, sim.task.config["parameters"]) - # Assert the right demo file is loaded in demographics.assets self.assertEqual(self.demo_path, sim.task.demographics.assets[0].absolute_path) @@ -234,30 +225,26 @@ def test_from_files_config_only(self): def test_from_files_valid_customReport(self): self.prepare_input_files() + def set_param_fn(config, implicit_config_set_fns): + config.parameters.Enable_Demographics_Builtin = 0 + config.parameters.Base_Infectivity_Constant = 1 + config.parameters.Incubation_Period_Constant = 1 + config.parameters.Infectious_Period_Constant = 1 + config.parameters.Base_Infectivity_Distribution = 'CONSTANT_DISTRIBUTION' + config.parameters.Incubation_Period_Distribution = 'CONSTANT_DISTRIBUTION' + config.parameters.Infectious_Period_Distribution = 'CONSTANT_DISTRIBUTION' + config.parameters.x_Base_Population = 0.001 + config.parameters.Simulation_Duration = 10 + config.parameters.Start_Time = 0 + for fn in implicit_config_set_fns: + config = fn(config) + return config + dfs.write_config_from_default_and_params(config_path=self.default_config_file, set_fn=partial(set_param_fn, implicit_config_set_fns=self.demog.implicits), config_out_path=self.config_path) - # workaround for https://github.com/InstituteforDiseaseModeling/emodpy/issues/358 - import emod_api.schema_to_class as s2c - with open(self.config_path) as conf: - config_rod = json.load(conf, object_hook=s2c.ReadOnlyDict) - #config_rod.parameters.Enable_Demographics_Builtin = 1 - #del config_rod.parameters["Demographics_Filenames"] - config_rod.parameters['Base_Infectivity_Constant'] = 1 - config_rod.parameters['Incubation_Period_Constant'] = 1 - config_rod.parameters['Infectious_Period_Constant'] = 1 - config_rod.parameters['Base_Infectivity_Distribution'] = 'CONSTANT_DISTRIBUTION' - config_rod.parameters['Incubation_Period_Distribution'] = 'CONSTANT_DISTRIBUTION' - config_rod.parameters['Infectious_Period_Distribution'] = 'CONSTANT_DISTRIBUTION' - config_rod.parameters['x_Base_Population'] = 0.001 - config_rod.parameters['Simulation_Duration'] = 10 - config_rod.parameters['Start_Time'] = 0 - - with open(self.config_path, "w") as outfile: - json.dump(config_rod, outfile, sort_keys=True, indent=4) - custom_reports_path = os.path.join(manifest.current_directory, "inputs", "custom_reports.json") task = EMODTask.from_files( @@ -379,7 +366,6 @@ def build_demog_and_mig(): return demog, mig_data self.prepare_schema_and_eradication() - print(f"Telling emod-api to use {self.schema_path} as schema.") ob.schema_path = self.schema_path @@ -662,5 +648,3 @@ def test_add_py_path(self): self.assertTrue(task.use_embedded_python) self.assertIn(f"--python-script-path './Assets/python;{pypackage_path};{virtual_path}'", str(task.command)) - - diff --git a/tests/test_experiment_simulations.py b/tests/test_experiment_simulations.py index 9fd95bd..41edbf4 100644 --- a/tests/test_experiment_simulations.py +++ b/tests/test_experiment_simulations.py @@ -19,6 +19,7 @@ # current_directory = os.path.dirname(os.path.realpath(__file__)) # BIN_PATH = os.path.join(current_directory, "..", "examples", "inputs", "bin") # INPUT_PATH = os.path.join(current_directory, "..", "examples", "serialization", "inputs") +sif_path = manifest.sft_id_file @pytest.mark.comps @@ -75,6 +76,7 @@ def test_mix_tasks_in_experiment(self): ep4_path=manifest.ep4_path) task.tags = {"idmtools": "idmtools-automation", "string_tag": "test", "number_tag": 123} task.set_parameter("Enable_Immunity", 0) + task.set_sif(sif_path) # User builder to create simulations num_sims = 3 @@ -92,6 +94,7 @@ def test_mix_tasks_in_experiment(self): demographics_paths=None, eradication_path=eradication_path, ep4_path=manifest.ep4_path) + task1.set_sif(sif_path) # create another TemplatedSimulations with this task1 ts1 = TemplatedSimulations([builder], base_task=task1) @@ -106,6 +109,9 @@ def test_mix_tasks_in_experiment(self): sims = experiment.simulations self.assertEqual(len(sims), 7) + self.assertTrue(experiment.succeeded, msg=f"Experiment {experiment.uid} failed.\n") + print(f"Experiment {experiment.uid} succeeded.") + def test_create_suite(self): from idmtools.entities.suite import Suite from COMPS.Data import Suite as CompsSuite diff --git a/tests/test_workflow_campaign.py b/tests/test_workflow_campaign.py index bdac74c..a9d701a 100644 --- a/tests/test_workflow_campaign.py +++ b/tests/test_workflow_campaign.py @@ -241,7 +241,7 @@ def _set_config_param_implicitly(config, trigger_name): return config silly_example = partial(_set_config_param_implicitly, trigger_name=test_trigger_name) camp.implicits.append(silly_example) - camp.add(ip.new_intervention(t, dur, dip), + camp.add(ip.new_intervention(t, dur, dip, nods=[]), name="import_pressure", first=True) camp.add(sv.new_intervention(t_sv), name="vaccine", first=False) return camp diff --git a/tests/test_workflow_demographics.py b/tests/test_workflow_demographics.py index 27f7f59..891d7a4 100644 --- a/tests/test_workflow_demographics.py +++ b/tests/test_workflow_demographics.py @@ -520,7 +520,7 @@ def build_demog(): [0.0, 1]], "Route": "Contact"} new_individual_properties = IndividualProperties() - new_individual_properties.add(IndividualProperty(initial_distribution, + new_individual_properties.add(IndividualProperty(initial_distribution=initial_distribution, property=property, values=values, transmission_matrix=transmission_matrix)) @@ -570,10 +570,10 @@ def demographics_overlay_susceptibility_distribution_from_files_test(self): result_values=[0.2, 0.3]) # node_attributes = Node.Node.NodeAttributes(initial_population=100) # todo, remove this once bug is fixed - overlay = Demographics.DemographicsOverlay(nodes=[1], + overlay = Demographics.DemographicsOverlay(nodes=[Node.OverlayNode(1)], individual_attributes=individual_attributes, node_attributes=None, - meta_data={"IdReference": "Gridded world grump2.5arcmin"}) + idref="Gridded world grump2.5arcmin") overlay_filename = os.path.join(manifest.demographics_folder, "demographics_susceptibility_overlay.json") overlay.to_file(overlay_filename)