From ebd7355b74e4dd931dc12916a636c0f060669c58 Mon Sep 17 00:00:00 2001 From: IsaccBarker Date: Wed, 13 Nov 2024 00:22:31 -0700 Subject: [PATCH 1/4] [60] fix --- README.qmd | 2 +- docs/_autosummary/epiworldpy.rst | 26 +++++++ .../generated/epiworldpy.ModelDiffNet.rst | 32 +++++++++ .../generated/epiworldpy.ModelSEIR.rst | 32 +++++++++ .../generated/epiworldpy.ModelSEIRCONN.rst | 32 +++++++++ .../generated/epiworldpy.ModelSEIRD.rst | 32 +++++++++ .../generated/epiworldpy.ModelSIR.rst | 32 +++++++++ .../generated/epiworldpy.ModelSIRCONN.rst | 32 +++++++++ .../generated/epiworldpy.ModelSIRD.rst | 32 +++++++++ .../generated/epiworldpy.ModelSIRDCONN.rst | 32 +++++++++ .../generated/epiworldpy.ModelSIS.rst | 32 +++++++++ .../generated/epiworldpy.ModelSISD.rst | 32 +++++++++ .../generated/epiworldpy.ModelSURV.rst | 32 +++++++++ .../generated/epiworldpy.Saver.rst | 24 +++++++ docs/_templates/custom-class-template.rst | 34 +++++++++ docs/_templates/custom-module-template.rst | 69 +++++++++++++++++++ docs/api.rst | 11 +-- docs/conf.py | 36 +++++++++- docs/ctoc.md | 8 +++ docs/index.md | 10 +-- docs/index.rst | 27 -------- pyproject.toml | 9 ++- 22 files changed, 566 insertions(+), 42 deletions(-) create mode 100644 docs/_autosummary/epiworldpy.rst create mode 100644 docs/_autosummary/generated/epiworldpy.ModelDiffNet.rst create mode 100644 docs/_autosummary/generated/epiworldpy.ModelSEIR.rst create mode 100644 docs/_autosummary/generated/epiworldpy.ModelSEIRCONN.rst create mode 100644 docs/_autosummary/generated/epiworldpy.ModelSEIRD.rst create mode 100644 docs/_autosummary/generated/epiworldpy.ModelSIR.rst create mode 100644 docs/_autosummary/generated/epiworldpy.ModelSIRCONN.rst create mode 100644 docs/_autosummary/generated/epiworldpy.ModelSIRD.rst create mode 100644 docs/_autosummary/generated/epiworldpy.ModelSIRDCONN.rst create mode 100644 docs/_autosummary/generated/epiworldpy.ModelSIS.rst create mode 100644 docs/_autosummary/generated/epiworldpy.ModelSISD.rst create mode 100644 docs/_autosummary/generated/epiworldpy.ModelSURV.rst create mode 100644 docs/_autosummary/generated/epiworldpy.Saver.rst create mode 100644 docs/_templates/custom-class-template.rst create mode 100644 docs/_templates/custom-module-template.rst create mode 100644 docs/ctoc.md delete mode 100644 docs/index.rst diff --git a/README.qmd b/README.qmd index 2428a12..54a4e1e 100644 --- a/README.qmd +++ b/README.qmd @@ -1,6 +1,6 @@ --- format: gfm -title: "epiworldpy: Python bindings for epiworld" +title: "`Epiworldpy`: Python bindings for Epiworld" --- [![](https://github.com/UofUEpiBio/epiworldpy/actions/workflows/pip.yaml/badge.svg)](https://github.com/UofUEpiBio/epiworldpy/actions/workflows/pip.yaml) diff --git a/docs/_autosummary/epiworldpy.rst b/docs/_autosummary/epiworldpy.rst new file mode 100644 index 0000000..ffcbf7e --- /dev/null +++ b/docs/_autosummary/epiworldpy.rst @@ -0,0 +1,26 @@ +epiworldpy +========== + +.. automodule:: epiworldpy + :members: + :undoc-members: + :show-inheritance: + + + + + + + + + + + + + + + + + + + diff --git a/docs/_autosummary/generated/epiworldpy.ModelDiffNet.rst b/docs/_autosummary/generated/epiworldpy.ModelDiffNet.rst new file mode 100644 index 0000000..1c229fd --- /dev/null +++ b/docs/_autosummary/generated/epiworldpy.ModelDiffNet.rst @@ -0,0 +1,32 @@ +epiworldpy.ModelDiffNet +======================= + +.. currentmodule:: epiworldpy + +.. autoclass:: ModelDiffNet + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~ModelDiffNet.__init__ + ~ModelDiffNet.add_state + ~ModelDiffNet.add_tool + ~ModelDiffNet.add_virus + ~ModelDiffNet.agents_from_edgelist + ~ModelDiffNet.agents_smallworld + ~ModelDiffNet.get_db + ~ModelDiffNet.get_name + ~ModelDiffNet.get_states + ~ModelDiffNet.print + ~ModelDiffNet.run + + + + + + \ No newline at end of file diff --git a/docs/_autosummary/generated/epiworldpy.ModelSEIR.rst b/docs/_autosummary/generated/epiworldpy.ModelSEIR.rst new file mode 100644 index 0000000..089165e --- /dev/null +++ b/docs/_autosummary/generated/epiworldpy.ModelSEIR.rst @@ -0,0 +1,32 @@ +epiworldpy.ModelSEIR +==================== + +.. currentmodule:: epiworldpy + +.. autoclass:: ModelSEIR + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~ModelSEIR.__init__ + ~ModelSEIR.add_state + ~ModelSEIR.add_tool + ~ModelSEIR.add_virus + ~ModelSEIR.agents_from_edgelist + ~ModelSEIR.agents_smallworld + ~ModelSEIR.get_db + ~ModelSEIR.get_name + ~ModelSEIR.get_states + ~ModelSEIR.print + ~ModelSEIR.run + + + + + + \ No newline at end of file diff --git a/docs/_autosummary/generated/epiworldpy.ModelSEIRCONN.rst b/docs/_autosummary/generated/epiworldpy.ModelSEIRCONN.rst new file mode 100644 index 0000000..1bde015 --- /dev/null +++ b/docs/_autosummary/generated/epiworldpy.ModelSEIRCONN.rst @@ -0,0 +1,32 @@ +epiworldpy.ModelSEIRCONN +======================== + +.. currentmodule:: epiworldpy + +.. autoclass:: ModelSEIRCONN + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~ModelSEIRCONN.__init__ + ~ModelSEIRCONN.add_state + ~ModelSEIRCONN.add_tool + ~ModelSEIRCONN.add_virus + ~ModelSEIRCONN.agents_from_edgelist + ~ModelSEIRCONN.agents_smallworld + ~ModelSEIRCONN.get_db + ~ModelSEIRCONN.get_name + ~ModelSEIRCONN.get_states + ~ModelSEIRCONN.print + ~ModelSEIRCONN.run + + + + + + \ No newline at end of file diff --git a/docs/_autosummary/generated/epiworldpy.ModelSEIRD.rst b/docs/_autosummary/generated/epiworldpy.ModelSEIRD.rst new file mode 100644 index 0000000..dd4097f --- /dev/null +++ b/docs/_autosummary/generated/epiworldpy.ModelSEIRD.rst @@ -0,0 +1,32 @@ +epiworldpy.ModelSEIRD +===================== + +.. currentmodule:: epiworldpy + +.. autoclass:: ModelSEIRD + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~ModelSEIRD.__init__ + ~ModelSEIRD.add_state + ~ModelSEIRD.add_tool + ~ModelSEIRD.add_virus + ~ModelSEIRD.agents_from_edgelist + ~ModelSEIRD.agents_smallworld + ~ModelSEIRD.get_db + ~ModelSEIRD.get_name + ~ModelSEIRD.get_states + ~ModelSEIRD.print + ~ModelSEIRD.run + + + + + + \ No newline at end of file diff --git a/docs/_autosummary/generated/epiworldpy.ModelSIR.rst b/docs/_autosummary/generated/epiworldpy.ModelSIR.rst new file mode 100644 index 0000000..8b0c871 --- /dev/null +++ b/docs/_autosummary/generated/epiworldpy.ModelSIR.rst @@ -0,0 +1,32 @@ +epiworldpy.ModelSIR +=================== + +.. currentmodule:: epiworldpy + +.. autoclass:: ModelSIR + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~ModelSIR.__init__ + ~ModelSIR.add_state + ~ModelSIR.add_tool + ~ModelSIR.add_virus + ~ModelSIR.agents_from_edgelist + ~ModelSIR.agents_smallworld + ~ModelSIR.get_db + ~ModelSIR.get_name + ~ModelSIR.get_states + ~ModelSIR.print + ~ModelSIR.run + + + + + + \ No newline at end of file diff --git a/docs/_autosummary/generated/epiworldpy.ModelSIRCONN.rst b/docs/_autosummary/generated/epiworldpy.ModelSIRCONN.rst new file mode 100644 index 0000000..1cbc85b --- /dev/null +++ b/docs/_autosummary/generated/epiworldpy.ModelSIRCONN.rst @@ -0,0 +1,32 @@ +epiworldpy.ModelSIRCONN +======================= + +.. currentmodule:: epiworldpy + +.. autoclass:: ModelSIRCONN + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~ModelSIRCONN.__init__ + ~ModelSIRCONN.add_state + ~ModelSIRCONN.add_tool + ~ModelSIRCONN.add_virus + ~ModelSIRCONN.agents_from_edgelist + ~ModelSIRCONN.agents_smallworld + ~ModelSIRCONN.get_db + ~ModelSIRCONN.get_name + ~ModelSIRCONN.get_states + ~ModelSIRCONN.print + ~ModelSIRCONN.run + + + + + + \ No newline at end of file diff --git a/docs/_autosummary/generated/epiworldpy.ModelSIRD.rst b/docs/_autosummary/generated/epiworldpy.ModelSIRD.rst new file mode 100644 index 0000000..f9dd372 --- /dev/null +++ b/docs/_autosummary/generated/epiworldpy.ModelSIRD.rst @@ -0,0 +1,32 @@ +epiworldpy.ModelSIRD +==================== + +.. currentmodule:: epiworldpy + +.. autoclass:: ModelSIRD + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~ModelSIRD.__init__ + ~ModelSIRD.add_state + ~ModelSIRD.add_tool + ~ModelSIRD.add_virus + ~ModelSIRD.agents_from_edgelist + ~ModelSIRD.agents_smallworld + ~ModelSIRD.get_db + ~ModelSIRD.get_name + ~ModelSIRD.get_states + ~ModelSIRD.print + ~ModelSIRD.run + + + + + + \ No newline at end of file diff --git a/docs/_autosummary/generated/epiworldpy.ModelSIRDCONN.rst b/docs/_autosummary/generated/epiworldpy.ModelSIRDCONN.rst new file mode 100644 index 0000000..c7c0e8f --- /dev/null +++ b/docs/_autosummary/generated/epiworldpy.ModelSIRDCONN.rst @@ -0,0 +1,32 @@ +epiworldpy.ModelSIRDCONN +======================== + +.. currentmodule:: epiworldpy + +.. autoclass:: ModelSIRDCONN + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~ModelSIRDCONN.__init__ + ~ModelSIRDCONN.add_state + ~ModelSIRDCONN.add_tool + ~ModelSIRDCONN.add_virus + ~ModelSIRDCONN.agents_from_edgelist + ~ModelSIRDCONN.agents_smallworld + ~ModelSIRDCONN.get_db + ~ModelSIRDCONN.get_name + ~ModelSIRDCONN.get_states + ~ModelSIRDCONN.print + ~ModelSIRDCONN.run + + + + + + \ No newline at end of file diff --git a/docs/_autosummary/generated/epiworldpy.ModelSIS.rst b/docs/_autosummary/generated/epiworldpy.ModelSIS.rst new file mode 100644 index 0000000..e8c9f3c --- /dev/null +++ b/docs/_autosummary/generated/epiworldpy.ModelSIS.rst @@ -0,0 +1,32 @@ +epiworldpy.ModelSIS +=================== + +.. currentmodule:: epiworldpy + +.. autoclass:: ModelSIS + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~ModelSIS.__init__ + ~ModelSIS.add_state + ~ModelSIS.add_tool + ~ModelSIS.add_virus + ~ModelSIS.agents_from_edgelist + ~ModelSIS.agents_smallworld + ~ModelSIS.get_db + ~ModelSIS.get_name + ~ModelSIS.get_states + ~ModelSIS.print + ~ModelSIS.run + + + + + + \ No newline at end of file diff --git a/docs/_autosummary/generated/epiworldpy.ModelSISD.rst b/docs/_autosummary/generated/epiworldpy.ModelSISD.rst new file mode 100644 index 0000000..0b41b2b --- /dev/null +++ b/docs/_autosummary/generated/epiworldpy.ModelSISD.rst @@ -0,0 +1,32 @@ +epiworldpy.ModelSISD +==================== + +.. currentmodule:: epiworldpy + +.. autoclass:: ModelSISD + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~ModelSISD.__init__ + ~ModelSISD.add_state + ~ModelSISD.add_tool + ~ModelSISD.add_virus + ~ModelSISD.agents_from_edgelist + ~ModelSISD.agents_smallworld + ~ModelSISD.get_db + ~ModelSISD.get_name + ~ModelSISD.get_states + ~ModelSISD.print + ~ModelSISD.run + + + + + + \ No newline at end of file diff --git a/docs/_autosummary/generated/epiworldpy.ModelSURV.rst b/docs/_autosummary/generated/epiworldpy.ModelSURV.rst new file mode 100644 index 0000000..493ac15 --- /dev/null +++ b/docs/_autosummary/generated/epiworldpy.ModelSURV.rst @@ -0,0 +1,32 @@ +epiworldpy.ModelSURV +==================== + +.. currentmodule:: epiworldpy + +.. autoclass:: ModelSURV + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~ModelSURV.__init__ + ~ModelSURV.add_state + ~ModelSURV.add_tool + ~ModelSURV.add_virus + ~ModelSURV.agents_from_edgelist + ~ModelSURV.agents_smallworld + ~ModelSURV.get_db + ~ModelSURV.get_name + ~ModelSURV.get_states + ~ModelSURV.print + ~ModelSURV.run + + + + + + \ No newline at end of file diff --git a/docs/_autosummary/generated/epiworldpy.Saver.rst b/docs/_autosummary/generated/epiworldpy.Saver.rst new file mode 100644 index 0000000..117325b --- /dev/null +++ b/docs/_autosummary/generated/epiworldpy.Saver.rst @@ -0,0 +1,24 @@ +epiworldpy.Saver +================ + +.. currentmodule:: epiworldpy + +.. autoclass:: Saver + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~Saver.__init__ + ~Saver.run_multiple + ~Saver.run_multiple_get_results + + + + + + \ No newline at end of file diff --git a/docs/_templates/custom-class-template.rst b/docs/_templates/custom-class-template.rst new file mode 100644 index 0000000..f73eda5 --- /dev/null +++ b/docs/_templates/custom-class-template.rst @@ -0,0 +1,34 @@ +{{ fullname | escape | underline}} + +.. currentmodule:: {{ module }} + +.. autoclass:: {{ objname }} + :members: + :show-inheritance: + :inherited-members: + :special-members: __call__, __add__, __mul__ + + {% block methods %} + {% if methods %} + .. rubric:: {{ _('Methods') }} + + .. autosummary:: + :nosignatures: + {% for item in methods %} + {%- if not item.startswith('_') %} + ~{{ name }}.{{ item }} + {%- endif -%} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block attributes %} + {% if attributes %} + .. rubric:: {{ _('Attributes') }} + + .. autosummary:: + {% for item in attributes %} + ~{{ name }}.{{ item }} + {%- endfor %} + {% endif %} + {% endblock %} diff --git a/docs/_templates/custom-module-template.rst b/docs/_templates/custom-module-template.rst new file mode 100644 index 0000000..370487f --- /dev/null +++ b/docs/_templates/custom-module-template.rst @@ -0,0 +1,69 @@ +{{ fullname | escape | underline}} + +.. automodule:: {{ fullname }} + :members: + :undoc-members: + :show-inheritance: + + {% block attributes %} + {% if attributes %} + .. rubric:: Module attributes + + .. autosummary:: + :toctree: + {% for item in attributes %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block functions %} + {% if functions %} + .. rubric:: {{ _('Functions') }} + + .. autosummary:: + :toctree: + :nosignatures: + {% for item in functions %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block classes %} + {% if classes %} + .. rubric:: {{ _('Classes') }} + + .. autosummary:: + :toctree: + :template: custom-class-template.rst + :nosignatures: + {% for item in classes %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + {% block exceptions %} + {% if exceptions %} + .. rubric:: {{ _('Exceptions') }} + + .. autosummary:: + :toctree: + {% for item in exceptions %} + {{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + +{% block modules %} +{% if modules %} +.. autosummary:: + :toctree: + :template: custom-module-template.rst + :recursive: +{% for item in modules %} + {{ item }} +{%- endfor %} +{% endif %} +{% endblock %} diff --git a/docs/api.rst b/docs/api.rst index 7e8840f..b8bcc79 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1,10 +1,11 @@ -API -=== +API Reference +============= You can find the complete API documentation for `epiworldpy` below. .. autosummary:: - :toctree: generated - :recursive: + :toctree: _autosummary + :template: custom-module-template.rst + :recursive: - epiworldpy \ No newline at end of file + epiworldpy diff --git a/docs/conf.py b/docs/conf.py index a540a6c..be15623 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -11,14 +11,18 @@ # All configuration values have a default; values that are commented out # serve to show the default. from __future__ import annotations +import sys +import os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) +#sys.path.insert(0, os.path.abspath('../src/epiworldpy')) # -- General configuration ------------------------------------------------ +#sys.path.insert(0, os.path.abspath("../src")) + # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' @@ -27,14 +31,17 @@ # ones. extensions = [ 'sphinx.ext.autodoc', + 'sphinx.ext.autosectionlabel', 'sphinx.ext.intersphinx', - 'sphinx.ext.autodoc', 'sphinx.ext.autosummary', 'sphinx.ext.napoleon', + 'sphinx.ext.viewcode', 'myst_parser', ] +toc_deph = 5 autosummary_generate = True +autoclass_content = "both" # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -113,7 +120,30 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'haiku' +html_theme = 'sphinx_book_theme' +html_theme_options = { + "repository_url": "https://github.com/CDCgov/PyRenew", + "use_edit_page_button": True, + "use_issues_button": True, + "use_repository_button": True, + "repository_branch": "main", + "path_to_docs": "docs/source", + "use_download_button": True, +} + +html_sidebars = { + "**": [ + "navbar-logo.html", + "search-field.html", + "sbt-sidebar-nav.html", + ] +} + +master_doc = "ctoc" +autodoc_typehints = "description" +autodoc_type_aliases = { + "Any": ":obj:`Any `", +} # 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 diff --git a/docs/ctoc.md b/docs/ctoc.md new file mode 100644 index 0000000..8b80715 --- /dev/null +++ b/docs/ctoc.md @@ -0,0 +1,8 @@ +# Complete Table Of Contents + +```{toctree} +:maxdepth: 3 + +../index +../api +``` diff --git a/docs/index.md b/docs/index.md index 71431fe..bd68e6a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -# epiworldpy: Python bindings for epiworld +# `Epiworldpy`: Python bindings for Epiworld [![](https://github.com/UofUEpiBio/epiworldpy/actions/workflows/pip.yaml/badge.svg)](https://github.com/UofUEpiBio/epiworldpy/actions/workflows/pip.yaml) @@ -77,7 +77,7 @@ covid19.print(False) - Prob. Recovery : 0.1400 - Prob. Transmission : 0.1000 - + Let’s run it and to see what we get: @@ -103,8 +103,8 @@ covid19.print(False) Number of entities : 0 Days (duration) : 100 (of 100) Number of viruses : 1 - Last run elapsed t : 22.00ms - Last run speed : 43.64 million agents x day / second + Last run elapsed t : 13.00ms + Last run speed : 74.51 million agents x day / second Rewiring : off Global events: @@ -134,7 +134,7 @@ covid19.print(False) - Infected 0.00 0.00 0.86 0.14 - Recovered 0.00 0.00 0.00 1.00 - + We can now visualize the model’s compartments: diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 8608033..0000000 --- a/docs/index.rst +++ /dev/null @@ -1,27 +0,0 @@ -Epiworldpy Documentation -============================ - -Epiworldpy is a Python package that allows for native interaction with -the `Epiworld library `_. See -the `project page `_ for -more information and sample API usage. - -Installation ------------- - -Epiworldpy is currently not available on any Python package -repositories; it must be installed manually: - -.. code-block:: bash - - git clone https://github.com/UofUEpiBio/epiworldpy - cd epiworldpy - - # Prerequisites: Python toolchain, CMake, Pybind11 - make build - -.. - Contents: - - .. toctree:: - :maxdepth: 2 diff --git a/pyproject.toml b/pyproject.toml index 7230841..beb536a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,14 @@ classifiers = [ [project.optional-dependencies] test = ["pytest"] -doc = ["nbformat", "nbclient", "jupyter", "epiworldpy[viz]", "myst_parser"] +doc = [ + "nbformat", + "nbclient", + "jupyter", + "epiworldpy[viz]", + "myst_parser", + "sphinx-book-theme", +] viz = ["ipympl>=0.8", "matplotlib>=3.5.0", "networkx>=3.0", "scipy>=1.0"] [tool.scikit-build.wheel] From 617639c512f65ba993f2458029f048391e0aadb7 Mon Sep 17 00:00:00 2001 From: IsaccBarker Date: Wed, 13 Nov 2024 12:12:42 -0700 Subject: [PATCH 2/4] [docs] fix api link --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index bd68e6a..9d28718 100644 --- a/docs/index.md +++ b/docs/index.md @@ -21,7 +21,7 @@ target="_blank">implemented in R. # API -You can find API documentation on the API page. +You can find API documentation on the API page. # Examples From 112922d0131b0808281f0cfdda38a5d3a0ed7291 Mon Sep 17 00:00:00 2001 From: IsaccBarker Date: Wed, 8 Jan 2025 12:00:16 -0700 Subject: [PATCH 3/4] [2024-12-11] checkpoint --- .gitignore | 3 + README.md | 368 ++++++++++++------ README.qmd | 274 +++++++++++-- .../case-type-incidence-output-1.png | Bin 0 -> 46096 bytes .../series-visualization-output-1.png | Bin 40133 -> 34369 bytes docs/conf.py | 2 +- docs/index.md | 368 ++++++++++++------ 7 files changed, 726 insertions(+), 289 deletions(-) create mode 100644 README_files/figure-markdown_strict/case-type-incidence-output-1.png diff --git a/.gitignore b/.gitignore index af8247a..99aefa9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,11 @@ .ipynb_checkpoints/ .pytest_cache/ _build/ +dist/ build/ __pycache__/ +*.egg-info/ +.ropeproject/ compile_commands.json *.html diff --git a/README.md b/README.md index 71431fe..1055752 100644 --- a/README.md +++ b/README.md @@ -1,142 +1,115 @@ -# epiworldpy: Python bindings for epiworld +# epiworldPy [![](https://github.com/UofUEpiBio/epiworldpy/actions/workflows/pip.yaml/badge.svg)](https://github.com/UofUEpiBio/epiworldpy/actions/workflows/pip.yaml) [![](https://img.shields.io/pypi/v/epiworldpy.svg)](https://pypi.org/project/epiworldpy) -This is a python wrapper of the [`epiworld c++` -library](https://github.com/UofUEpiBio/epiworld/), an ABM simulation -engine. This is possible using the -[`pybind11`](https://pybind11.readthedocs.io/en/stable/) library (which -rocks!). - -The `epiworld` module is already -implemented in R. +This Python package is a wrapper of the C++ library +[epiworld](https://github.com/UofUEpiBio/epiworld). It provides a +general framework for modeling disease transmission using agent-based +models. Some of the main features include: + +- Fast simulation with an average of 30 million agents/day per second. +- One model can include multiple diseases. +- Policies (tools) can be multiple and user-defined. +- Transmission can be a function of agents’ features. +- Out-of-the-box parallelization for multiple simulations. + +From the package’s description: + +> A flexible framework for Agent-Based Models (ABM), the epiworldR +> package provides methods for prototyping disease outbreaks and +> transmission models using a C++ backend, making it very fast. It +> supports multiple epidemiological models, including the +> Susceptible-Infected-Susceptible (SIS), Susceptible-Infected-Removed +> (SIR), Susceptible-Exposed-Infected-Removed (SEIR), and others, +> involving arbitrary mitigation policies and multiple-disease models. +> Users can specify infectiousness/susceptibility rates as a function of +> agents’ features, providing great complexity for the model dynamics. +> Furthermore, epiworldR is ideal for simulation studies featuring large +> populations. + +Current available models: + +1. `ModelDiffNet` +2. `ModelSEIR` +3. `ModelSEIRCONN` +4. `ModelSEIRD` +5. `ModelSEIRDCONN` +6. `ModelSEIRMixing` +7. `ModelSIR` +8. `ModelSIRCONN` +9. `ModelSIRD` +10. `ModelSIRDCONN` +11. `ModelSIRLogit` +12. `ModelSIRMixing` +13. `ModelSIS` +14. `ModelSISD` +15. `ModelSURV` + +Bindings exist for other languages, [namely +R](https://uofuepibio.github.io/epiworldR). # Installation -- clone this repository -- `pip install ./epiworldpy` +Installation can be preformed through pip (pip installs packages). -# API +`pip install epiworldpy` + +If there’s a feature that’s only available on the repository, and hasn’t +yet been published to PyPi, please create an issue so we know to get on +publishing. In the meantime, you can clone the repository though Git, +and install locally. -You can find API documentation on the API page. +``` bash +git clone https://github.com/uofUEpiBio/epiworldpy +cd epiworldpy + +git checkout $WANTED_COMMIT +pip install . +``` # Examples -## Basic +This Python package includes several popular epidemiological models, +including SIS, SIR, and SEIR using either a fully connected graph +(similar to a compartmental model) or a user-defined network. + +## SIR model using a random graph -Here we show how to create a `SEIR` object and add terms to it. We will -use the following data: +This Susceptible-Infected-Recovered model features a population of +100,000 agents simulated in a small-world network. Each agent is +connected to ten other agents. One percent of the population has the +virus, with a 70% chance of transmission. Infected individuals recover +at a 0.3 rate: ``` python # Loading the module import epiworldpy as epiworld -# Create a SEIR model (susceptible, exposed, infectious, recovered), representing COVID-19. -covid19 = epiworld.ModelSEIRCONN( - name = 'covid-19', - n = 10000, - prevalence = .01, - contact_rate = 2.0, - transmission_rate = .1, - incubation_days = 7.0, - recovery_rate = 0.14 +# Create a SIR model (susceptible, infectious, recovered). +covid19 = epiworld.ModelSIR( + name = 'COVID-19', + prevalence = 0.01, + transmission_rate = 0.7, + recovery_rate = 0.3 ) -# Taking a look -covid19.print(False) -``` - - ________________________________________________________________________________ - ________________________________________________________________________________ - SIMULATION STUDY - - Name of the model : Susceptible-Exposed-Infected-Removed (SEIR) (connected) - Population size : 10000 - Agents' data : (none) - Number of entities : 0 - Days (duration) : 0 (of 0) - Number of viruses : 1 - Last run elapsed t : - - Rewiring : off - - Global events: - - Update infected individuals (runs daily) +# Adding a Small world population. +covid19.agents_smallworld(n = 100000, k = 10, d = False, p = .01) - Virus(es): - - covid-19 - - Tool(s): - (none) - - Model parameters: - - Avg. Incubation days : 7.0000 - - Contact rate : 2.0000 - - Prob. Recovery : 0.1400 - - Prob. Transmission : 0.1000 - - - -Let’s run it and to see what we get: - -``` python -# Run for 100 days with a seed of 223. -covid19.run(100, 223) - -# Print an overview. -covid19.print(False) +# Run for 50 days with a seed of 1912. +covid19.run(50, 1912) ``` _________________________________________________________________________ - Running the model... - ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. - done. - ________________________________________________________________________________ - ________________________________________________________________________________ - SIMULATION STUDY - - Name of the model : Susceptible-Exposed-Infected-Removed (SEIR) (connected) - Population size : 10000 - Agents' data : (none) - Number of entities : 0 - Days (duration) : 100 (of 100) - Number of viruses : 1 - Last run elapsed t : 22.00ms - Last run speed : 43.64 million agents x day / second - Rewiring : off - - Global events: - - Update infected individuals (runs daily) - - Virus(es): - - covid-19 - - Tool(s): - (none) - - Model parameters: - - Avg. Incubation days : 7.0000 - - Contact rate : 2.0000 - - Prob. Recovery : 0.1400 - - Prob. Transmission : 0.1000 - - Distribution of the population at time 100: - - (0) Susceptible : 9900 -> 7275 - - (1) Exposed : 100 -> 269 - - (2) Infected : 0 -> 292 - - (3) Recovered : 0 -> 2164 - - Transition Probabilities: - - Susceptible 1.00 0.00 0.00 0.00 - - Exposed 0.00 0.85 0.15 0.00 - - Infected 0.00 0.00 0.86 0.14 - - Recovered 0.00 0.00 0.00 1.00 - - - -We can now visualize the model’s compartments: + |Running the model... + |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. + | done. + + + +We can now visualize the model’s compartments/outputs: ``` python import numpy as np @@ -181,6 +154,85 @@ plt.show() src="README_files/figure-markdown_strict/series-visualization-output-1.png" id="series-visualization" /> +Let’s plot model incidence. + +``` python +import pandas as pd + +# Get the data from the database. +transition_matrix = pd.DataFrame(covid19.get_db().get_hist_transition_matrix(False)) + +# Subsetting rows where states_from != states_to. +transition_matrix = transition_matrix[ + transition_matrix['states_from'] != transition_matrix['states_to'] +] + +# Selecting only those where counts > 0 +transition_matrix = transition_matrix[ + transition_matrix['counts'] > 0 +] + +daily_incidence = transition_matrix.groupby(['dates', 'states_to'])['counts'].sum().unstack() + +# Plot! +plt.figure(figsize=(10, 6)) +plt.plot(daily_incidence.index, daily_incidence['Infected'], label='New Infected') +plt.plot(daily_incidence.index, daily_incidence['Recovered'], label='New Recovered') + +plt.title('Daily Incidence of Infected and Recovered Cases') +plt.xlabel('Days') +plt.ylabel('Number of New Cases') +plt.legend() +plt.grid(True) +plt.show() +``` + + + +## SEIR model with a fully connected graph + +The SEIR model is similar to the SIR model but includes an exposed +state. Here, we simulate a population of 10,000 agents with a 0.01 +prevalence, a 0.6 transmission rate, a 0.5 recovery rate, and 7 +days-incubation period. The population is fully connected, meaning +agents can transmit the disease to any other agent: + +``` python +model = epiworld.ModelSEIRCONN( + name = 'COVID-19', + prevalence = 0.01, + n = 10000, + contact_rate = 10, + incubation_days = 7, + transmission_rate = 0.1, + recovery_rate = 1 / 7 +) + +# Add a virus. +covid19 = epiworld.Virus( + name = "COVID-19", + prevalence = 0.01, + as_proportion = True, + prob_infecting = 0.01, + prob_recovery = 0.6, + prob_death = 0.5, + post_immunity = -1, + incubation = 7 +) +model.add_virus(covid19) + +# Run for 100 days with a seed of 132. +model.run(100, 132) +``` + +Computing some key statistics. + +``` python +# ... +``` + We can get the effective reproductive number, over time, too: ``` python @@ -209,10 +261,6 @@ plt.grid(True) plt.show() ``` - - Let’s do the same for generation time: ``` python @@ -252,19 +300,29 @@ plt.grid(True) plt.show() ``` - +## Transmission Network -Epiworld records agent-agent interactions, and we can graph those too. -In the below example, we only track all cases stemming from a specific -index case, despite the model having a prevalence of 0.01. +This example shows how we can draw a transmission network from a +simulation. The following code simulates a population of 500 agents in a +small-world network. Each agent is connected to ten other agents. One +percent of the population has the virus, with a 50% chance of +transmission. Infected individuals recover at a 0.5 rate: ``` python import networkx as nx from matplotlib.animation import FuncAnimation -transmissions = covid19.get_db().get_transmissions() +model = epiworld.ModelSIR( + name = "COVID-19", + prevalence = .01, + transmission_rate = 0.5, + recovery = 0.5 +) + +model.agents_smallworld(n = 500, k = 10, d = False, p = 0.01) +model.run(50, 1912) + +transmissions = model.get_db().get_transmissions() start = transmissions['source_exposure_dates'] end = transmissions['dates'] source = transmissions['sources'] @@ -320,3 +378,63 @@ plt.show() hardcoding a GIF. --> ![](README_files/figure-markdown_strict/contact-visualization-output-1.gif) + +## Multiple Simulations + +epiworldpy supports running multiple simulations using the +`run_multiple` function. The following code simulates 50 SIR models with +1000 agents each. Each agent is connected to ten other agents. One +percent of the population has the virus, with a 90% chance of +transmission. Infected individuals recover at a 0.1 rate. The results +are saved in a dataframe: + +``` python +model = epiworld.ModelSIRCONN( + name = "COVID-19", + prevalence = 0.01, + n = 1000, + contact_rate = 2, + transmission_rate = 0.9, + recovery_rate = 0.1 +) + +saver = epiworld.Saver("total_hist", "reproductive") +saver.run_multiple(model, 100, 50, nthreads=2) +``` + + Starting multiple runs (50) + _________________________________________________________________________ + _________________________________________________________________________ + ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. + done. + + + +Let’s grab the results. + +``` python +ans = saver.run_multiple_get_results("total_hist") +ans["total_hist"][0:10] +``` + +# API + +You can find API documentation on the API +documentation page. + +# Existing Alternatives + +There exist a multitude of existing ABM frameworks/libraries available +for Python. See the below (non-exhaustive) list. + +- MESA +- LDG +- BPTK-Py + +A comparison table will be added at a later date. Want to contribute +that, or add a project we missed? Submit a PR! + +# Code of Conduct + +The epiworldPy project is released with a Contributor Code of Conduct. +By contributing to this project, you agree to abide by its terms. diff --git a/README.qmd b/README.qmd index 54a4e1e..876641c 100644 --- a/README.qmd +++ b/README.qmd @@ -1,63 +1,105 @@ --- format: gfm -title: "`Epiworldpy`: Python bindings for Epiworld" +title: "epiworldPy" --- [![](https://github.com/UofUEpiBio/epiworldpy/actions/workflows/pip.yaml/badge.svg)](https://github.com/UofUEpiBio/epiworldpy/actions/workflows/pip.yaml) [![](https://img.shields.io/pypi/v/epiworldpy.svg)](https://pypi.org/project/epiworldpy) -This is a python wrapper of the [`epiworld c++` library][epiworld-git], an ABM -simulation engine. This is possible using the -[`pybind11`][] library (which rocks!). - -The `epiworld` module is already -[implemented in R](https://github.com/UofUEpiBio/epiworldR){target="_blank"}. +This Python package is a wrapper of the C++ library [epiworld](https://github.com/UofUEpiBio/epiworld). +It provides a general framework for modeling disease transmission using agent-based models. +Some of the main features include: + +- Fast simulation with an average of 30 million agents/day per second. +- One model can include multiple diseases. +- Policies (tools) can be multiple and user-defined. +- Transmission can be a function of agents’ features. +- Out-of-the-box parallelization for multiple simulations. + +From the package’s description: + +> A flexible framework for Agent-Based Models (ABM), the epiworldR package provides +> methods for prototyping disease outbreaks and transmission models using a C++ backend, +> making it very fast. It supports multiple epidemiological models, including the +> Susceptible-Infected-Susceptible (SIS), Susceptible-Infected-Removed (SIR), +> Susceptible-Exposed-Infected-Removed (SEIR), and others, involving arbitrary mitigation +> policies and multiple-disease models. Users can specify infectiousness/susceptibility +> rates as a function of agents’ features, providing great complexity for the model +> dynamics. Furthermore, epiworldR is ideal for simulation studies featuring large +> populations. + +Current available models: + +1. `ModelDiffNet` +2. `ModelSEIR` +3. `ModelSEIRCONN` +4. `ModelSEIRD` +5. `ModelSEIRDCONN` +6. `ModelSEIRMixing` +7. `ModelSIR` +8. `ModelSIRCONN` +9. `ModelSIRD` +10. `ModelSIRDCONN` +11. `ModelSIRLogit` +12. `ModelSIRMixing` +13. `ModelSIS` +14. `ModelSISD` +15. `ModelSURV` + +Bindings exist for other languages, [namely R](https://uofuepibio.github.io/epiworldR). # Installation -- clone this repository -- `pip install ./epiworldpy` +Installation can be preformed through pip (pip installs packages). -# API +`pip install epiworldpy` + +If there's a feature that's only available on the repository, +and hasn't yet been published to PyPi, please create an issue +so we know to get on publishing. In the meantime, you can +clone the repository though Git, and install locally. -You can find API documentation on the API page. +```bash +git clone https://github.com/uofUEpiBio/epiworldpy +cd epiworldpy + +git checkout $WANTED_COMMIT +pip install . +``` # Examples -## Basic +This Python package includes several popular epidemiological models, including +SIS, SIR, and SEIR using either a fully connected graph (similar to a compartmental +model) or a user-defined network. -Here we show how to create a `SEIR` object and add terms to it. We will use the following data: +## SIR model using a random graph + +This Susceptible-Infected-Recovered model features a population of 100,000 agents +simulated in a small-world network. Each agent is connected to ten other agents. +One percent of the population has the virus, with a 70% chance of transmission. +Infected individuals recover at a 0.3 rate: ```{python} # Loading the module import epiworldpy as epiworld -# Create a SEIR model (susceptible, exposed, infectious, recovered), representing COVID-19. -covid19 = epiworld.ModelSEIRCONN( - name = 'covid-19', - n = 10000, - prevalence = .01, - contact_rate = 2.0, - transmission_rate = .1, - incubation_days = 7.0, - recovery_rate = 0.14 +# Create a SIR model (susceptible, infectious, recovered). +covid19 = epiworld.ModelSIR( + name = 'COVID-19', + prevalence = 0.01, + transmission_rate = 0.7, + recovery_rate = 0.3 ) -# Taking a look -covid19.print(False) -``` +# Adding a Small world population. +covid19.agents_smallworld(n = 100000, k = 10, d = False, p = .01) -Let's run it and to see what we get: - -```{python} -# Run for 100 days with a seed of 223. -covid19.run(100, 223) - -# Print an overview. -covid19.print(False) +# Run for 50 days with a seed of 1912. +covid19.run(50, 1912) ``` -We can now visualize the model's compartments: +We can now visualize the model's compartments/outputs: ```{python} #| label: series-visualization @@ -101,10 +143,95 @@ plt.grid(True) plt.show() ``` +Let's plot model incidence. + + +```{python} +#| label: case-type-incidence +#| fig-cap: "" +#| echo: true +#| output-location: slide + +import pandas as pd + +# Get the data from the database. +transition_matrix = pd.DataFrame(covid19.get_db().get_hist_transition_matrix(False)) + +# Subsetting rows where states_from != states_to. +transition_matrix = transition_matrix[ + transition_matrix['states_from'] != transition_matrix['states_to'] +] + +# Selecting only those where counts > 0 +transition_matrix = transition_matrix[ + transition_matrix['counts'] > 0 +] + +daily_incidence = transition_matrix.groupby(['dates', 'states_to'])['counts'].sum().unstack() + +# Plot! +plt.figure(figsize=(10, 6)) +plt.plot(daily_incidence.index, daily_incidence['Infected'], label='New Infected') +plt.plot(daily_incidence.index, daily_incidence['Recovered'], label='New Recovered') + +plt.title('Daily Incidence of Infected and Recovered Cases') +plt.xlabel('Days') +plt.ylabel('Number of New Cases') +plt.legend() +plt.grid(True) +plt.show() +``` + +## SEIR model with a fully connected graph + +The SEIR model is similar to the SIR model but includes an exposed state. Here, +we simulate a population of 10,000 agents with a 0.01 prevalence, a 0.6 +transmission rate, a 0.5 recovery rate, and 7 days-incubation period. The +population is fully connected, meaning agents can transmit the disease to +any other agent: + +```{python} +#| label: fully-connected-graph +#| fig-cap: "" +#| eval: false +model = epiworld.ModelSEIRCONN( + name = 'COVID-19', + prevalence = 0.01, + n = 10000, + contact_rate = 10, + incubation_days = 7, + transmission_rate = 0.1, + recovery_rate = 1 / 7 +) + +# Add a virus. +covid19 = epiworld.Virus( + name = "COVID-19", + prevalence = 0.01, + as_proportion = True, + prob_infecting = 0.01, + prob_recovery = 0.6, + prob_death = 0.5, + post_immunity = -1, + incubation = 7 +) +model.add_virus(covid19) + +# Run for 100 days with a seed of 132. +model.run(100, 132) +``` + +Computing some key statistics. + +```{python} +# ... +``` + We can get the effective reproductive number, over time, too: ```{python} #| label: rt-visualization +#| eval: false #| fig-cap: "" reproductive_data = covid19.get_db().get_reproductive_number() @@ -135,6 +262,7 @@ Let's do the same for generation time: ```{python} #| label: gentime-visualization +#| eval: false #| fig-cap: "" from collections import defaultdict @@ -172,7 +300,13 @@ plt.grid(True) plt.show() ``` -Epiworld records agent-agent interactions, and we can graph those too. In the below example, we only track all cases stemming from a specific index case, despite the model having a prevalence of 0.01. +## Transmission Network + +This example shows how we can draw a transmission network from a simulation. +The following code simulates a population of 500 agents in a small-world network. +Each agent is connected to ten other agents. One percent of the population has +the virus, with a 50% chance of transmission. Infected individuals recover at a +0.5 rate: ```{python} #| label: contact-visualization @@ -182,7 +316,17 @@ Epiworld records agent-agent interactions, and we can graph those too. In the be import networkx as nx from matplotlib.animation import FuncAnimation -transmissions = covid19.get_db().get_transmissions() +model = epiworld.ModelSIR( + name = "COVID-19", + prevalence = .01, + transmission_rate = 0.5, + recovery = 0.5 +) + +model.agents_smallworld(n = 500, k = 10, d = False, p = 0.01) +model.run(50, 1912) + +transmissions = model.get_db().get_transmissions() start = transmissions['source_exposure_dates'] end = transmissions['dates'] source = transmissions['sources'] @@ -238,5 +382,59 @@ plt.show() hardcoding a GIF. --> ![](README_files/figure-markdown_strict/contact-visualization-output-1.gif) -[epiworld-git]: https://github.com/UofUEpiBio/epiworld/ -[`pybind11`]: https://pybind11.readthedocs.io/en/stable/ +## Multiple Simulations + +epiworldpy supports running multiple simulations using the `run_multiple` function. +The following code simulates 50 SIR models with 1000 agents each. Each agent is +connected to ten other agents. One percent of the population has the virus, with +a 90% chance of transmission. Infected individuals recover at a 0.1 rate. The +results are saved in a dataframe: + +```{python} +#| label: run-multiple +#| fig-cap: "" + +model = epiworld.ModelSIRCONN( + name = "COVID-19", + prevalence = 0.01, + n = 1000, + contact_rate = 2, + transmission_rate = 0.9, + recovery_rate = 0.1 +) + +saver = epiworld.Saver("total_hist", "reproductive") +saver.run_multiple(model, 100, 50, nthreads=2) +``` + +Let's grab the results. + +```{python} +#| label: run-multiple-get-results +#| eval: false +#| fig-cap: "" + +ans = saver.run_multiple_get_results("total_hist") +ans["total_hist"][0:10] +``` + +# API + +You can find API documentation on the API documentation page. + +# Existing Alternatives + +There exist a multitude of existing ABM frameworks/libraries available for Python. +See the below (non-exhaustive) list. + +- MESA +- LDG +- BPTK-Py + +A comparison table will be added at a later date. Want to contribute that, +or add a project we missed? Submit a PR! + +# Code of Conduct + +The epiworldPy project is released with a Contributor Code of Conduct. By +contributing to this project, you agree to abide by its terms. diff --git a/README_files/figure-markdown_strict/case-type-incidence-output-1.png b/README_files/figure-markdown_strict/case-type-incidence-output-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d0f47f1897c8385164185760c4cfb65b50a64a68 GIT binary patch literal 46096 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 NlTwuYEUy3he*sX?_?`d& literal 40133 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¥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%0A`YV;I5=1;&Fx_*vd@sv{71!W8J+37Zf#%=F z5!HlBjcb>UM`uIF7O+#s8u~D22^$6Cwwv`VA;BEI@62lO%4oqJ6;7VH_X2Tnup7$p zM=(>g(jX>odK%e(nUKuC-{|-<7ZBK9odo25nIuGilI(_0A?^9z%1A!1y=`*8Nxi}G3is{6uRPs z6RC*@vjx8k^k*RSnsF_k&I&bZq_@A=!6@Cc%CY@cw)x)TE0*X&4weXV?BUNjRn+S^ zo^`#cJK-ZujD_v6_X<^Xqx~s8fHcS+iTbO1Bkd#!&$uC1XSp9$FJ# z`@fx@FGJyI<-KfUzZT$SHmzU1<)!r zOoONx&H67bur{HcN$qzj_$q%??Bq%wGl1lN;7T>B?D&$ZLuCEn@haYQH)C;>y{<+4 z=c@u_Y=3%@|7M^42d^*fS;4A(U;|r?jNb=!w%y&&NA27^b!^0ybH&rv%4=8f$600fVgiz;vc*$@G0=EDhk_mcBv-QoV`^7zr zpP!z3=nA<_ro^5D6?mb^xSV{&A*|9usis3ihoDtF(!_M|XuQ+~-mTQ5Vqnms&7 znOB#LdfE(JXmT#s;W3jf8&hTeM3<;EE+VwW@B(k!bw60e4QfcKA&W5!7QX zmW-5wy+y|k+c-Az)?4m6d%R`FlcKU6Na6Esc1y8{P-EM7xJHxR``g?H-Zb&nBVvrK z^)zK0u7o&ob`RMk5#%AZR}r+4@E{m!)4i(`UsYD(Z%R)(Zo(gYAiTu}hd7&O9RFsjtb?ffZg*{Dca@F-bc35F&qlKdE;a zA-J38=&%6DPC$(Vz8oGviGcbH%aWpuPwVEiuL||~@AM=}C$EXn(2AVKQAr zSvH^_+HCZ^`)QY_6`B+21swG(XMU^Ah1ZVV4%8KH-)XAPFhrROV+i+9cd4qG)h&^D z(`Vs*AMGT4-kWnv&t^J;RpvOfg*pFX?Hy^MBY(5UvZ*^Vq8QJkj}^#aC|iT45e)$W zXyEzjQpsM=E(IF4fE0Q>w|_91Ub9eB0JdO@LPu7he_~o~m^XU-#N6$6Ly-T*oXj=K zHf2Zn8{bzI)`U2ApRb=;6AXvFE?sID)5rf%9gZMQ9tN%$Eo={+(Fa%{v{bxxM&Wj3 zH{-zQOBQzR5TfB)DTk>J4uLtLbI%AB~HPY8fe0rR+&^Ba>Z%Xu+)F-GdxaD_l0 zMBDStq4t*49OUDoxKh5ck*f)427|IzZcN`{JpA8bn_Dc(LU*5bh-o9ZYENm@ff}=EcZsPzeB`Ti%;q|0E{m&o_Ng_`5v-Kaw9nWs z4N6yZoP$y9@SminTk!@kQOYBM`BbC;gaweaO(xaG0=n%+R7|R(nYO3GRn7G$o?jdQ z(DoNVAVB8_o3re0J3{_dpS|?16U!*IB~#<=q1fbG*inPOfJlY+X63W_@9Kkc7^}`@ zti90%TX+tny#|gp9HPFWY;Vc3e2wWo?(rC#EeOW!opQ%Y>L&E9CV!Kta$YjN$U&Re zCz{t^`53pTAj$ht`(3#MhkF$c0I$KkWw&z&ei&;m;0Gv;o%%uy8FI z2*H;C=m@x+lCwp%j`kV1nRx(={7%sR7ml(&^s=weaC$HN=1~~tInN6&TIbn@tjj-V zr0&lqrkKej&&0ws<9$pitP56r{xz=I|h$7+!*Gb}}x=9l=cW9#s%27x4#<)<;9w8+W`5TQUUzNCsV@Jj5U~Q79y> z&D?=-%{$=*j$u~FazMH1ONWLiK)bR%G0q|-cmYcPDs}f<%q{%w-!H3ciJO^U&9{`- zEBJBCP|@?HZ{MYjqMlMx4h0i>X@cK!#D2W6|9uVm1D|im^IWyNl_zV4j(!rs;j}w^ z@8lH9+#&xV7Pv7;Uwph)E5ff{la7#A6g80{a6y& zDNmvmY(r8tHMYH+@bXwFL7FbD_XutfjpsX1Y6mDz071oD1MKN8uMh-=eyyJR^mWkK z(<^z8Ajeb80d^9>(xg?nSCeUMf6kPeBQNASrr&RB+^(+Z(RY}28NWmp|8*43wO4_pL<9nr zdf>Dpz4@)fqkw1WpFTRaK!a3;EyYQG6!RZB znR0vSlPX?z#9is7=AQ0V$BpHwfi)2^xlRA1UiN$VEixUEVdGfmdY1H^w1l3NJgqN> zYspDfDBAj+OvUCLSH@&}Ea)S?kc1b{O6dYH^DjMGfA~t{?8PTajwZ#P?Bx#f@9UhC z_Xq^xH{t)GSF$j3q%t=xr|IMAL;5WB0bAbI*IEVDf-=V~M!=-S9N7gwpJN(`xQN~eE(Y@KW0 zuTAMwFI$(&&^M8KuyHRjBQy75uq-M`q3Z}oN~tmS-;#Uz9|CFhUxUUC5|M)QY_D|) zV_H+tHaMXJx+WKkd2+kKD{b{@h5t|j43jKRw$l)$iaqc@g8hrfY2^Km;25zng9sW01sZM zp~^rbGfo$;AmbIwel4$3e}=Dh8z~Xl-#pUa_bt`rNUrMM@?hR)h5^$p+(S!)p}Ue= zYxNS3E-V%9an0m+{cc~jEWV*3tCwax{=HjfReeJ=b$h3F+P&p-OMkaydiATOMi3Zc zvdf2rFLvMmjZ?#$Mw}Lsd?b_deHKS+nX9pjb1I5K#bto3G&N!JL*@I`t|rWru=eZ5 zC{k`&&88;aDigQ1xx$<)z!mxjE^N+>W1`~llq}r#S3x>i1GB@A+GN4s1xoA6bX`?K z?b7^XIdI}SNEIiH8zUz@H6~*7TggPDYefx#RW!9txV0H3`gitNFj1oSGEn)$ts?JX9-swK2cLl*?dw^K;uG7sy!; zEP62HEvDYWxJzzDpP+=Xym3icZb5z|oLj6j;JyS`Jc5iO+59C=^|iqdD)u41X&#p( z66GgWH+px=247k{?ib`rJ>jfu-T65uVm$iDz)CsZ0Dy-p#13rcbH_a+$7_pio*n0^ zGmTo5I`MGVR81urt?uoue3eg)kD7YZJOB2GP?jKy^ZetUC0({s6Y!t8&NJQ4DZ96O zA=K*)Cc(`_#*^qpoQ-HV(jQ8)y^iU-B8G*#%>=7QS>95D?9z3V6^)V}M5h(+7rIAJ zhPp=`XnT><9(6s|E=A)W!^w79CpNQKn2aMdaxlp$V$J0vO?<^o3h$4$t3u{tCwRoG zYq3HKlV`dEY|nk`1+gdu zRP*1hCv{1;N9(;joi$!z@}?u3YAN)oce)hS7%@~ z!i_i>fbDVJZ*SThwfjZgY&k`6@_$_kz1=H64bec!89i8MGQ_p|_?be=2={H-+l@gj zpX?ocVz;LljgLMaq+qzocbHf>~ivIf#b`)$faefQ!#uR7_xb12>A zP}0ED-n)_KXDw1zD0CNT@M)-bxMA1iJ*Ff>6u_VJ5N*MoWx2*v`luypEJN?`^tVjW z9mdxiDz+Q=cbML+M!Tb(j7+ym94K|zyB4AH3xq#8EvWo_SXT5M!u*j~bF9}wDDegu zau^odY^oIyHuq#upJL7*n0n2#ruq9soGlF!k`^yaJo4A{2}8*3HJ(z?7|79j$}QTa zr}soQJhB_ZQ$Yuu=d01s_@~V92Hg!FH#r^AU}vK_*=rH;5Y~#dg^gGoZM_bvxmNhB z&MrLiSnF40g;8bdWaqW{LG;@^e$ROZru5`9Zi`gg*S2UIIaLt~@7dDGdo9{HGCy3!diT0ADwInPxztxfvY=hDg?=72sl%Kl#Ot+c{hX}vEAo!SWlcY?>I zsee*Pw83-B{~0^G+8NF5@HN-be!>Ma1|~vBuyI%3Qp2TmSlTx2=*-7L+!m?t>aV>Q z@C?K(qHKy%qlkme)RuQUUcq=VFqpm)`0NTD#^#R4a-T5gK3g6hLDLW8_iNtrn!0~# z$S7O!2*91XvVH*X#l&^nlWc=nH)9nV^KYNhoa?+c=8g5QOBgH3T;rXy`S(>c`lqjG z^uBNnY72K$gq;%`XjzfbUCaK(v&c06@#YNQLXVvP?Yf&~Tzu@>>zcylcStCkZOSd@|+et11gk~Q69B4hZdkkHB24VThf1JoFl~G;m z$;9i)j55f+P=*BKTN6))`beh4ENK(SNGstXabrlTTL+cuuFhmS6`*p{db5uE;PUeR zQ^AVvIEZ4ekE-@7=q7AkDk(6I^_@~zSvPX8NzX1jR*_3{)L~7A?q5uXXEeN<1>MD; z!u6sripQbNVWEYOK48*~2C)G~5mWEHt+4S|= zXkeJUI{x+YFoN(`lrF3AbBxNj=7(HqatJjD{i`q;`8cy|2E6uhzJXWqR09)Vu?glo zSNi;VEj*pmVf;HI&(ngKPvlV8`}t!2@qt-b>0u!|>2XWq1Gid)G2oF5vNg}%?9~g_ z8uM;+caLhH^?g*0TjpA14O94ou%4A?oB3_qT(l5$#8PlI z%jw=E>-pcFPE%#O4}Pusg`J-KRo7FX{3eob&T@n>pGwD9T+1j*20QWzb|e8cC98zk zD^!|#wlL=l_?t9j$=lqQM|ItU0~wsybdv%SR^(^4sIY;C<_H6?5sNkhSzpo#0{E`A zVufW#)-v+so<}ci)iwGgITY}@!x|0{ed2-_BZAMr;?cD_5F+mq?^O(ATfhA}s56u% z)t4sR8W}pWMc(WFuVK!?XOOVnD0s0<^f2iyO(346Ug&f2aGU^+MKZGv3aBJMy9Wq-0ie*MbZqJpE4!Zwj|NvC352ii#hsG9<*3fDo}4*Xl6<60OTwkkOS1^ebX=SQ!{0tSQl@cFN|{{}_Az*W?N6Gy=MTY}=X* zmK1g1QyKzdNxn|(57-}~UHD_ZFa4wzJ(V*y)lM7hGT7_yD^dMbDYIPJ>4)$_j-!4o z#aVmRQr*TWSor1cPclqAKXuAg)nVIvcm!s>jRgA4DQT+Ymq6lMYn_vT*XCjA_NtBwoc_OMhc)kG1R$wZN*($ZO6k75WHQA8J?_2HK`8cj4uuL zyyd|$qd8?8)L*CSbm8=(F4@&{)X6{Ja8-eaDtwyYN?mig!$O74@u}5rm%B??gTMXn zwALZ_-%+8fAlppA<4E?MD=nUBHdLAXpxyD0jzMb3aHWcS%B=UOxNVP?d6uTn5dDiN zat$M~j_9mdO%dt_gVl2wd7b?Yr&RloTe$N5&h`uK4xx>Eo%T0YxWeuPm%XsQAF*9; zbY6}I8qbB=|0Wf`Cf!9a$8igX6YsM-@02oT8R@Eg`YAH{M;}h^Bre?of570A6&XL~ zwlZrK9}2T0`1&?huh6&3=-jsWHmlfPISW->lbVW*%krUGYM0wgMD8ICpo!o6M7`t1``{a zc2zQe>U61f!iW2(Dy1xlt4>ZWNJJ@0g(48W=FOgs&}iA#$Gb{}{csczsiin3EpKpa zS?GP#^~US3s9f#aF-qp4MAeiMOMMDh^s{$Jw{0`s7qEK&RBONZYB#x3I7vLABi@%u zXrl3-HqRAM8G`6GF<=Sn_IhNN-{LW)XvxPhhZ_~sx#BTjzkZS1?}u}Up00%2_isoF zClHaT!S1_#aIRie`X_nWyF*omGNw});I&akF+aD;DfJ@Xz4AD`D;sJIpGEto;XsZ{ zD2bQzNTge+ixK}~wE9D-#}8i;bDpWG%IMnjcgV;xvNOBI+{&M7Lv~&lZPW(s9M;|F zEi@-6?g+!Y6nCUI1OuMFW$cZ6!a`+mjF*02N4=aE!CGo_D{)BRynmdA@gX~yya?M2 zXK;4SVVeHTm6q2XFPUWa?jf?LBujiWps0=BPL=!OlM|o}ZTj4_e3rW_>U{eLv$HTQ@b^J^dK2`NaLl{#GP8 z2VC{*kJUG}8^ovr89dW`(}cEQ@GzG!>mS!}Ab-#sC{uG-$LllDT;g3{9sJp&)v;SY zg~$v4=W*xq!^~s}i=m_dOXtJW5!o_>UOY%{xD8XF?M6O#tvU;ddr#seWgT_zFo8PZV9X!=%J_-Ys14WT+d%P0Uxo+a$_8=e}Ciu zs@I}vqpLaGpnc5MT#lD@LleU*EcY~K{h`la5{2}Awg$cYKJqT^4SGAuX7~k8knh($ z%WT(T*Vd{*2YrRqFMQLK3b9{0QtG*5R%3n{h&?Q<4+KP3F0QV|U%zSt5#P*fVhogu zii**(u~b~E-V*i_u$J z_cs{}*4Wd;fNj4NsdqcD#l=OWR3ietK05Wd^3Aefs1D@kNw*=>IDWT@rauiWDN{xc!2BkQ)ohg@09865vNQpPVUKWUd*1ub=IX6 zze*29bT}Aa@V39Si2cLoZA1+~^W%C~^PNctc!L=M?H|Y>NrJi+0h8BrWNS4}&EkXO zFmxkDR&gRq-f+Qz)x-2tE@04Yo%QtW%o>dK1d;=DQ4oPd`T(4~d(%@-1rL~}y@ia^ zYJ;K27L;fO#T-8Y4iF%xl=i?lVb;FRS*Y?c(=3&QbwYJ*)1@L>=ylh z&aU2SquVO~H_9hmI00gra6kk*r-u4rR4kN)p}-f5Z^^nhh3V19Pu==aX=$Xh7MyVg z*#*Rr65oNdly?g`X*k{g;l{P$3$qb|#ekV?z8uM6(vk=qSu=n9AfM~NUpsQLD~Ytu z1FQCzdzXkJr#|IxA{)l7Lb45$8iJo6{$qLczf4EsDtMSMc@N<*{9SN*l%co(PwTKZ zTTy_m+w;E@T=9RKMI&t1&ckK|OgSYbF&P;QU>m0k6uq_>hWjlQ%Ei&MjaCcl=e<{SdEaQG?W5>IBTA#4dm`SSVys z1(?e~3#kK$Yo&E!_jH^Cf4E}9e!_Z9CP30;&}vN4XLznZ zD~mbEdx8#4QZk3Rqyqh#uFFQMBP77};w1kT6c!G^<>cr0;_LMR`@oR4 zrMDy`B$*q4Cp)EYWRxsH9aX5?BRV=eYxe5ZD``EwO!z(^K4=lbybi2U+1T0H^#*P` zIU99=5o2^1cxR=}n&e5prMvB{9=O&J`d6=5j-1@=7J$#$$IqX~I$ot^O#u}=*sR`n zAqs?qy_u?=X=Wtzx!N({3jX+oO=`lQi{D_WXZ>$af$S3fD2w~6^!sig!^)7q9G`2c6U27NuE4TGYAh*`3E=>NJ)9z`v z8+aqwVu^s0;NNU1dIkplqvZ}rBL4kvi_!7%FqJ`FK;$LnaR>qGfOfcQj2V{ScGMvD z@c6hAIEWyl$+599K&O|RzTzQo!VLLi8jjE^Thmo7(M1~Mzh*EnFaUhzlH!Zj)2r;k>{=zbIZevvr1bN1+PjmaaCMk;R6imUo;Tn%#71~wUGg+vPKEQ$Jn zjT{pb^9&t1P%INfL;_2lM3(yC#?(5XTHRd-ce_Ck*@vrJ_gAl9PXTeo%|^gyA6^$q zRCPZJ*0KVR!12NT-NCF)?;E|avC&bhn@el&mc`9R;M@T=&~M{S%^wV}z!5C_79YA# zh>yI6ErL9*;yoVxDL#JePcTKz+V(4?NE|%4P|(l_HBeb0Ey~OLSy*V%7xIC}aX;(# z?^k=Aw8z~$`}^yYC3k!mPf< z#UIW)1yvyn2b@gxheEZ%j4xWCXU5vPBriXo6@2*3_Ln9W#`s>dg~mB>mL^6;VLyxr zj11TxkOB!uox82{JNmhfxM2PL*_w4={m0VK&_Ek0k+5*H&Pn_Fb#FZgCTbm|DZsH$ ziyfE%_B;IM(~Ar6nCoH(wj*iK(e5<-el$QGCr#TgaMLD`u)M6ha^%!kF`;R?y|Xi- z!BEo$w_?R5Eh96Ku-DfNU4cdYkyvzev>sT4eG9<0Dd{U)Qm4FBtyL$3NoST}Cou42 zwy2uvOW_{j{kNHE%#f;Xc7GXu|20Q8-2yn$eKa>O02KU_&62q~$7En4PZ$o<3knYI z2SJ5)RJT5%)aw@`K<=*(+$gi4prDY69d@9}$qLj)+c&MjhUb@lcbbdLWja%9pU=F0 z^RTO%5M+LC_)kc{`W5~Em$;#36;d+~Yp%#@ua#XW=1Mq7H>(m(?gv^JzA)Z4ZK*e$|5M-V6*{ zAO~!qzzPgCANKS=Ds5m3gOi|*R#Z|tE=#{P>$`@0VW+33+1wDYu&%11;76jf8XSUf zmte65k8J6K7_Gdr^6%(qJ6Odvz+WSGpzzP8ZZbllKhi4vb%_!99j%gUesoAo^=49?5QeCGB_X(nO#v4 z3rsp$Q?&#|MEEJ80IeGzgg9Yg7$98DD=ON^Nw&zSuP06)gaO@CxUZI$D9|~rX4w!+ zm*(`y6a3)~gq0DBCXy?U!7#*g0Rx7TUC*P1=~DD}em->Oef#!}SiqfF z!d{fj6Vt zkhCqITpeED+S%J%A2eK~oz;HMSNf!>2?=#be*73pi~kI(8_uK!1dvjHA^T$s3r7C* z@abt)P3JY-G}nD@_d_2tI4B`IA-g{!b865mtXU@n%9uR+*AL>-_jlJO4PX|Y#c`Jv zXo7-zkTZyWYk=o0xAQUe)YQ}#BUqMhA`jm||C$)%q>C#2aIDDvGf;b_7KUzRSIj9e z5e3IJ+~t5{WAyr8@K-QVjR%J(5o*0(NRWv3|4Tgk|0OV9xkotP`&*qi95@dLem;oG Kh!hHGd;brVzjqP< diff --git a/docs/conf.py b/docs/conf.py index be15623..5f6bad7 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -58,7 +58,7 @@ master_doc = 'index' # General information about the project. -project = 'Epiworldpy' +project = 'epiworldPy' copyright = '2024, George G. Vega Yon' author = 'Milo Banks' diff --git a/docs/index.md b/docs/index.md index 9d28718..4e52d1f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,142 +1,115 @@ -# `Epiworldpy`: Python bindings for Epiworld +# epiworldPy [![](https://github.com/UofUEpiBio/epiworldpy/actions/workflows/pip.yaml/badge.svg)](https://github.com/UofUEpiBio/epiworldpy/actions/workflows/pip.yaml) [![](https://img.shields.io/pypi/v/epiworldpy.svg)](https://pypi.org/project/epiworldpy) -This is a python wrapper of the [`epiworld c++` -library](https://github.com/UofUEpiBio/epiworld/), an ABM simulation -engine. This is possible using the -[`pybind11`](https://pybind11.readthedocs.io/en/stable/) library (which -rocks!). - -The `epiworld` module is already -implemented in R. +This Python package is a wrapper of the C++ library +[epiworld](https://github.com/UofUEpiBio/epiworld). It provides a +general framework for modeling disease transmission using agent-based +models. Some of the main features include: + +- Fast simulation with an average of 30 million agents/day per second. +- One model can include multiple diseases. +- Policies (tools) can be multiple and user-defined. +- Transmission can be a function of agents’ features. +- Out-of-the-box parallelization for multiple simulations. + +From the package’s description: + +> A flexible framework for Agent-Based Models (ABM), the epiworldR +> package provides methods for prototyping disease outbreaks and +> transmission models using a C++ backend, making it very fast. It +> supports multiple epidemiological models, including the +> Susceptible-Infected-Susceptible (SIS), Susceptible-Infected-Removed +> (SIR), Susceptible-Exposed-Infected-Removed (SEIR), and others, +> involving arbitrary mitigation policies and multiple-disease models. +> Users can specify infectiousness/susceptibility rates as a function of +> agents’ features, providing great complexity for the model dynamics. +> Furthermore, epiworldR is ideal for simulation studies featuring large +> populations. + +Current available models: + +1. `ModelDiffNet` +2. `ModelSEIR` +3. `ModelSEIRCONN` +4. `ModelSEIRD` +5. `ModelSEIRDCONN` +6. `ModelSEIRMixing` +7. `ModelSIR` +8. `ModelSIRCONN` +9. `ModelSIRD` +10. `ModelSIRDCONN` +11. `ModelSIRLogit` +12. `ModelSIRMixing` +13. `ModelSIS` +14. `ModelSISD` +15. `ModelSURV` + +Bindings exist for other languages, [namely +R](https://uofuepibio.github.io/epiworldR). # Installation -- clone this repository -- `pip install ./epiworldpy` +Installation can be preformed through pip (pip installs packages). -# API +`pip install epiworldpy` + +If there’s a feature that’s only available on the repository, and hasn’t +yet been published to PyPi, please create an issue so we know to get on +publishing. In the meantime, you can clone the repository though Git, +and install locally. -You can find API documentation on the API page. +``` bash +git clone https://github.com/uofUEpiBio/epiworldpy +cd epiworldpy + +git checkout $WANTED_COMMIT +pip install . +``` # Examples -## Basic +This Python package includes several popular epidemiological models, +including SIS, SIR, and SEIR using either a fully connected graph +(similar to a compartmental model) or a user-defined network. + +## SIR model using a random graph -Here we show how to create a `SEIR` object and add terms to it. We will -use the following data: +This Susceptible-Infected-Recovered model features a population of +100,000 agents simulated in a small-world network. Each agent is +connected to ten other agents. One percent of the population has the +virus, with a 70% chance of transmission. Infected individuals recover +at a 0.3 rate: ``` python # Loading the module import epiworldpy as epiworld -# Create a SEIR model (susceptible, exposed, infectious, recovered), representing COVID-19. -covid19 = epiworld.ModelSEIRCONN( - name = 'covid-19', - n = 10000, - prevalence = .01, - contact_rate = 2.0, - transmission_rate = .1, - incubation_days = 7.0, - recovery_rate = 0.14 +# Create a SIR model (susceptible, infectious, recovered). +covid19 = epiworld.ModelSIR( + name = 'COVID-19', + prevalence = 0.01, + transmission_rate = 0.7, + recovery_rate = 0.3 ) -# Taking a look -covid19.print(False) -``` - - ________________________________________________________________________________ - ________________________________________________________________________________ - SIMULATION STUDY - - Name of the model : Susceptible-Exposed-Infected-Removed (SEIR) (connected) - Population size : 10000 - Agents' data : (none) - Number of entities : 0 - Days (duration) : 0 (of 0) - Number of viruses : 1 - Last run elapsed t : - - Rewiring : off - - Global events: - - Update infected individuals (runs daily) +# Adding a Small world population. +covid19.agents_smallworld(n = 100000, k = 10, d = False, p = .01) - Virus(es): - - covid-19 - - Tool(s): - (none) - - Model parameters: - - Avg. Incubation days : 7.0000 - - Contact rate : 2.0000 - - Prob. Recovery : 0.1400 - - Prob. Transmission : 0.1000 - - - -Let’s run it and to see what we get: - -``` python -# Run for 100 days with a seed of 223. -covid19.run(100, 223) - -# Print an overview. -covid19.print(False) +# Run for 50 days with a seed of 1912. +covid19.run(50, 1912) ``` _________________________________________________________________________ - Running the model... - ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. - done. - ________________________________________________________________________________ - ________________________________________________________________________________ - SIMULATION STUDY - - Name of the model : Susceptible-Exposed-Infected-Removed (SEIR) (connected) - Population size : 10000 - Agents' data : (none) - Number of entities : 0 - Days (duration) : 100 (of 100) - Number of viruses : 1 - Last run elapsed t : 13.00ms - Last run speed : 74.51 million agents x day / second - Rewiring : off - - Global events: - - Update infected individuals (runs daily) - - Virus(es): - - covid-19 - - Tool(s): - (none) - - Model parameters: - - Avg. Incubation days : 7.0000 - - Contact rate : 2.0000 - - Prob. Recovery : 0.1400 - - Prob. Transmission : 0.1000 - - Distribution of the population at time 100: - - (0) Susceptible : 9900 -> 7275 - - (1) Exposed : 100 -> 269 - - (2) Infected : 0 -> 292 - - (3) Recovered : 0 -> 2164 - - Transition Probabilities: - - Susceptible 1.00 0.00 0.00 0.00 - - Exposed 0.00 0.85 0.15 0.00 - - Infected 0.00 0.00 0.86 0.14 - - Recovered 0.00 0.00 0.00 1.00 - - - -We can now visualize the model’s compartments: + |Running the model... + |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. + | done. + + + +We can now visualize the model’s compartments/outputs: ``` python import numpy as np @@ -181,6 +154,85 @@ plt.show() src="README_files/figure-markdown_strict/series-visualization-output-1.png" id="series-visualization" /> +Let’s plot model incidence. + +``` python +import pandas as pd + +# Get the data from the database. +transition_matrix = pd.DataFrame(covid19.get_db().get_hist_transition_matrix(False)) + +# Subsetting rows where states_from != states_to. +transition_matrix = transition_matrix[ + transition_matrix['states_from'] != transition_matrix['states_to'] +] + +# Selecting only those where counts > 0 +transition_matrix = transition_matrix[ + transition_matrix['counts'] > 0 +] + +daily_incidence = transition_matrix.groupby(['dates', 'states_to'])['counts'].sum().unstack() + +# Plot! +plt.figure(figsize=(10, 6)) +plt.plot(daily_incidence.index, daily_incidence['Infected'], label='New Infected') +plt.plot(daily_incidence.index, daily_incidence['Recovered'], label='New Recovered') + +plt.title('Daily Incidence of Infected and Recovered Cases') +plt.xlabel('Days') +plt.ylabel('Number of New Cases') +plt.legend() +plt.grid(True) +plt.show() +``` + + + +## SEIR model with a fully connected graph + +The SEIR model is similar to the SIR model but includes an exposed +state. Here, we simulate a population of 10,000 agents with a 0.01 +prevalence, a 0.6 transmission rate, a 0.5 recovery rate, and 7 +days-incubation period. The population is fully connected, meaning +agents can transmit the disease to any other agent: + +``` python +model = epiworld.ModelSEIRCONN( + name = 'COVID-19', + prevalence = 0.01, + n = 10000, + contact_rate = 10, + incubation_days = 7, + transmission_rate = 0.1, + recovery_rate = 1 / 7 +) + +# Add a virus. +covid19 = epiworld.Virus( + name = "COVID-19", + prevalence = 0.01, + as_proportion = True, + prob_infecting = 0.01, + prob_recovery = 0.6, + prob_death = 0.5, + post_immunity = -1, + incubation = 7 +) +model.add_virus(covid19) + +# Run for 100 days with a seed of 132. +model.run(100, 132) +``` + +Computing some key statistics. + +``` python +# ... +``` + We can get the effective reproductive number, over time, too: ``` python @@ -209,10 +261,6 @@ plt.grid(True) plt.show() ``` - - Let’s do the same for generation time: ``` python @@ -252,19 +300,29 @@ plt.grid(True) plt.show() ``` - +## Transmission Network -Epiworld records agent-agent interactions, and we can graph those too. -In the below example, we only track all cases stemming from a specific -index case, despite the model having a prevalence of 0.01. +This example shows how we can draw a transmission network from a +simulation. The following code simulates a population of 500 agents in a +small-world network. Each agent is connected to ten other agents. One +percent of the population has the virus, with a 50% chance of +transmission. Infected individuals recover at a 0.5 rate: ``` python import networkx as nx from matplotlib.animation import FuncAnimation -transmissions = covid19.get_db().get_transmissions() +model = epiworld.ModelSIR( + name = "COVID-19", + prevalence = .01, + transmission_rate = 0.5, + recovery = 0.5 +) + +model.agents_smallworld(n = 500, k = 10, d = False, p = 0.01) +model.run(50, 1912) + +transmissions = model.get_db().get_transmissions() start = transmissions['source_exposure_dates'] end = transmissions['dates'] source = transmissions['sources'] @@ -320,3 +378,63 @@ plt.show() hardcoding a GIF. --> ![](README_files/figure-markdown_strict/contact-visualization-output-1.gif) + +## Multiple Simulations + +epiworldpy supports running multiple simulations using the +`run_multiple` function. The following code simulates 50 SIR models with +1000 agents each. Each agent is connected to ten other agents. One +percent of the population has the virus, with a 90% chance of +transmission. Infected individuals recover at a 0.1 rate. The results +are saved in a dataframe: + +``` python +model = epiworld.ModelSIRCONN( + name = "COVID-19", + prevalence = 0.01, + n = 1000, + contact_rate = 2, + transmission_rate = 0.9, + recovery_rate = 0.1 +) + +saver = epiworld.Saver("total_hist", "reproductive") +saver.run_multiple(model, 100, 50, nthreads=2) +``` + + Starting multiple runs (50) + _________________________________________________________________________ + _________________________________________________________________________ + ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| done. + done. + + + +Let’s grab the results. + +``` python +ans = saver.run_multiple_get_results("total_hist") +ans["total_hist"][0:10] +``` + +# API + +You can find API documentation on the API +documentation page. + +# Existing Alternatives + +There exist a multitude of existing ABM frameworks/libraries available +for Python. See the below (non-exhaustive) list. + +- MESA +- LDG +- BPTK-Py + +A comparison table will be added at a later date. Want to contribute +that, or add a project we missed? Submit a PR! + +# Code of Conduct + +The epiworldPy project is released with a Contributor Code of Conduct. +By contributing to this project, you agree to abide by its terms. From 3e771954518c4ad5b99a5bbfa2f20febb13469fe Mon Sep 17 00:00:00 2001 From: IsaccBarker Date: Wed, 8 Jan 2025 12:32:26 -0700 Subject: [PATCH 4/4] [dependencies] depend on pandas --- pyproject.toml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index beb536a..57e6993 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,13 @@ doc = [ "myst_parser", "sphinx-book-theme", ] -viz = ["ipympl>=0.8", "matplotlib>=3.5.0", "networkx>=3.0", "scipy>=1.0"] +viz = [ + "ipympl>=0.8", + "matplotlib>=3.5.0", + "networkx>=3.0", + "scipy>=1.0", + "pandas>=2.1.0", +] [tool.scikit-build.wheel] expand-macos-universal-tags = true