Skip to content

Commit

Permalink
Varous
Browse files Browse the repository at this point in the history
Clean up dependencies
Include optional "dev" component
Update README.md with badges
Test minimal setup.py
Neuter - for now - sample C extension
  • Loading branch information
clorton committed Nov 21, 2024
1 parent eb69b9b commit c59409f
Show file tree
Hide file tree
Showing 7 changed files with 96 additions and 117 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
# MASER - Measles Simulation for ERadication

Spatial measles models implemented with the LASER toolkit.

[![package](https://img.shields.io/pypi/v/laser-measles.svg)](https://pypi.org/project/laser-measles/)
![wheel](https://img.shields.io/pypi/wheel/laser-measles.svg)
![python versions](https://img.shields.io/pypi/pyversions/laser-measles)
![implementation](https://img.shields.io/pypi/implementation/laser-measles.svg)
![license](https://img.shields.io/pypi/l/laser-measles.svg)
10 changes: 7 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ version = "0.5.0"

dependencies = [
"click",
"laser-core @ git+https://github.com/InstituteforDiseaseModeling/[email protected]",
"numpy>=1.26.4,<2.0.0",
"numba>=0.59.1",
"laser-core==0.1.1",
# "numpy>=1.26.4,<2.0.0", # use laser-core version
# "numba~=0.59.1", # use laser-core version
"tqdm",
"geopandas",
"pandas",
Expand Down Expand Up @@ -51,6 +51,10 @@ classifiers = [
"Topic :: Utilities",
]

[project.optional-dependencies]
dev = ["tox", "uv"]
# docs = ["sphinx", "sphinx-rtd-theme"]

[project.urls]
Homepage = "https://example.com"
Documentation = "https://laser-measles.readthedocs.io/en/latest/"
Expand Down
153 changes: 56 additions & 97 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,107 +1,66 @@
#!/usr/bin/env python
import os
import platform
import re
from pathlib import Path

from setuptools import Extension
from setuptools import find_packages
from setuptools import setup
from setuptools.dist import Distribution
import setuptools

# Enable code coverage for C code: we cannot use CFLAGS=-coverage in tox.ini, since that may mess with compiling
# dependencies (e.g. numpy). Therefore, we set SETUPPY_CFLAGS=-coverage in tox.ini and copy it to CFLAGS here (after
# deps have been safely installed).
if "TOX_ENV_NAME" in os.environ and os.environ.get("SETUPPY_EXT_COVERAGE") == "yes" and platform.system() == "Linux":
CFLAGS = os.environ["CFLAGS"] = "-fprofile-arcs -ftest-coverage"
LFLAGS = os.environ["LFLAGS"] = "-lgcov"
else:
CFLAGS = ""
LFLAGS = ""
if __name__ == "__main__":
setuptools.setup()


class BinaryDistribution(Distribution):
"""
Distribution which almost always forces a binary package with platform name
"""
# import os
# import platform
# import re
# from pathlib import Path

def has_ext_modules(self):
return super().has_ext_modules() or not os.environ.get("SETUPPY_ALLOW_PURE")
# from setuptools import Extension
# from setuptools import find_packages
# from setuptools import setup
# from setuptools.dist import Distribution

# # Enable code coverage for C code: we cannot use CFLAGS=-coverage in tox.ini, since that may mess with compiling
# # dependencies (e.g. numpy). Therefore, we set SETUPPY_CFLAGS=-coverage in tox.ini and copy it to CFLAGS here (after
# # deps have been safely installed).
# if "TOX_ENV_NAME" in os.environ and os.environ.get("SETUPPY_EXT_COVERAGE") == "yes" and platform.system() == "Linux":
# CFLAGS = os.environ["CFLAGS"] = "-fprofile-arcs -ftest-coverage"
# LFLAGS = os.environ["LFLAGS"] = "-lgcov"
# else:
# CFLAGS = ""
# LFLAGS = ""

def read(*names, **kwargs):
with Path(__file__).parent.joinpath(*names).open(encoding=kwargs.get("encoding", "utf8")) as fh:
return fh.read()

# class BinaryDistribution(Distribution):
# """
# Distribution which almost always forces a binary package with platform name
# """

setup(
# name="laser-measles",
# version="0.5.0",
# license="MIT",
# description="Spatial models of measles implemented with the LASER toolkit.",
long_description="{}\n{}".format(
re.compile("^.. start-badges.*^.. end-badges", re.M | re.S).sub("", read("README.rst")),
re.sub(":[a-z]+:`~?(.*?)`", r"``\1``", read("CHANGELOG.rst")),
),
# author="Christopher Lorton",
# author_email="[email protected]",
url="https://github.com/InstituteforDiseaseModeling/laser-measles",
packages=find_packages("src"),
package_dir={"": "src"},
py_modules=[path.stem for path in Path("src").glob("*.py")],
include_package_data=True,
zip_safe=False,
# classifiers=[
# # complete classifier list: http://pypi.python.org/pypi?%3Aaction=list_classifiers
# "Development Status :: 5 - Production/Stable",
# "Intended Audience :: Developers",
# "License :: OSI Approved :: MIT License",
# "Operating System :: Unix",
# "Operating System :: POSIX",
# "Operating System :: Microsoft :: Windows",
# "Programming Language :: Python",
# "Programming Language :: Python :: 3",
# "Programming Language :: Python :: 3 :: Only",
# "Programming Language :: Python :: 3.8",
# "Programming Language :: Python :: 3.9",
# "Programming Language :: Python :: 3.10",
# "Programming Language :: Python :: 3.11",
# "Programming Language :: Python :: 3.12",
# "Programming Language :: Python :: Implementation :: CPython",
# "Topic :: Utilities",
# ],
# project_urls={
# "Documentation": "https://laser-measles.readthedocs.io/en/latest/",
# "Changelog": "https://laser-measles.readthedocs.io/en/latest/changelog.html",
# "Issue Tracker": "https://github.com/InstituteforDiseaseModeling/laser-measles/issues",
# },
# keywords=[
# # eg: "keyword1", "keyword2", "keyword3",
# ],
# python_requires=">=3.8",
# install_requires=[
# "click",
# # eg: "aspectlib==1.1.1", "six>=1.7",
# ],
extras_require={
# eg:
# "rst": ["docutils>=0.11"],
# ":python_version=='3.8'": ["backports.zoneinfo"],
},
# entry_points={
# "console_scripts": [
# "laser-measles = laser_measles.cli:run",
# ]
# },
ext_modules=[
Extension(
str(path.relative_to("src").with_suffix("")).replace(os.sep, "."),
sources=[str(path)],
extra_compile_args=CFLAGS.split(),
extra_link_args=LFLAGS.split(),
include_dirs=[str(path.parent)],
)
for path in Path("src").glob("**/*.c")
],
distclass=BinaryDistribution,
)
# def has_ext_modules(self):
# return super().has_ext_modules() or not os.environ.get("SETUPPY_ALLOW_PURE")


# def read(*names, **kwargs):
# with Path(__file__).parent.joinpath(*names).open(encoding=kwargs.get("encoding", "utf8")) as fh:
# return fh.read()


# setup(
# long_description="{}\n{}".format(
# re.compile("^.. start-badges.*^.. end-badges", re.M | re.S).sub("", read("README.rst")),
# re.sub(":[a-z]+:`~?(.*?)`", r"``\1``", read("CHANGELOG.rst")),
# ),
# url="https://github.com/InstituteforDiseaseModeling/laser-measles",
# packages=find_packages("src"),
# package_dir={"": "src"},
# py_modules=[path.stem for path in Path("src").glob("*.py")],
# include_package_data=True,
# zip_safe=False,
# ext_modules=[
# Extension(
# str(path.relative_to("src").with_suffix("")).replace(os.sep, "."),
# sources=[str(path)],
# extra_compile_args=CFLAGS.split(),
# extra_link_args=LFLAGS.split(),
# include_dirs=[str(path.parent)],
# )
# for path in Path("src").glob("**/*.c")
# ],
# distclass=BinaryDistribution,
# )
8 changes: 7 additions & 1 deletion src/laser_measles/core.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
from ._core import compute
try:
from ._core import compute
except ImportError:

def compute(args):
return max(args, key=len)


__all__ = [
"compute",
Expand Down
10 changes: 5 additions & 5 deletions src/laser_measles/generic/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
- nticks (int): Number of ticks to run the simulation. Default is 365.
- seed (int): Random seed for the simulation. Default is 20241107.
- verbose (bool): If True, print verbose output. Default is False.
- viz (bool): If True, display visualizations to help validate the model. Default is True.
- no-viz (bool): If True, suppress visualizations to help validate the model. Default is False.
- pdf (bool): If True, output visualization results as a PDF. Default is False.
- output (str): Output file for results. Default is None.
- params (str): JSON file with parameters. Default is None.
Expand Down Expand Up @@ -55,7 +55,7 @@
@click.option("--nticks", default=365, help="Number of ticks to run the simulation")
@click.option("--seed", default=20241107, help="Random seed")
@click.option("--verbose", is_flag=True, help="Print verbose output")
@click.option("--viz", is_flag=True, default=True, help="Display visualizations to help validate the model")
@click.option("--no-viz", is_flag=True, help="Suppress validation visualizations")
@click.option("--pdf", is_flag=True, help="Output visualization results as a PDF")
@click.option("--output", default=None, help="Output file for results")
@click.option("--params", default=None, help="JSON file with parameters")
Expand All @@ -75,7 +75,7 @@ def run(**kwargs):
Expected keys include:
- "verbose": (bool) Whether to print verbose output.
- "viz": (bool) Whether to visualize the results.
- "no-viz": (bool) Whether to suppress visualizations.
- "pdf": (str) The file path to save the visualization as a PDF.
Returns:
Expand Down Expand Up @@ -107,12 +107,12 @@ def run(**kwargs):

model.run()

if parameters["viz"]:
if not parameters["no_viz"]:
model.visualize(pdf=parameters["pdf"])

return


if __name__ == "__main__":
ctx = click.Context(run)
ctx.invoke(run, nticks=365, seed=20241107, verbose=True, viz=True, pdf=False)
ctx.invoke(run, nticks=365, seed=20241107, verbose=True, pdf=False)
22 changes: 11 additions & 11 deletions src/laser_measles/nigeria/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@
Command-line Options:
--nticks: Number of ticks to run the simulation (default: 365).
--seed: Random seed for reproducibility (default: 20241107).
--verbose: Print verbose output if set.
--viz: Display visualizations to help validate the model if set.
--pdf: Output visualization results as a PDF if set.
--nticks (int): Number of ticks to run the simulation (default: 365).
--seed (int): Random seed for reproducibility (default: 20241107).
--verbose (bool): Print verbose output if set.
--no-viz (bool): If True, suppress visualizations to help validate the model. Default is False.
--pdf (bool): Output visualization results as a PDF if set.
--output: Output file for results (default: None).
--params: JSON file with parameters (default: None).
--param: Additional parameter overrides (param:value or param=value).
--params (filename): JSON file with parameters (default: None).
--param (key:value pairs): Additional parameter overrides (param:value or param=value).
Usage:
Expand Down Expand Up @@ -52,7 +52,7 @@
@click.option("--nticks", default=365, help="Number of ticks to run the simulation")
@click.option("--seed", default=20241107, help="Random seed")
@click.option("--verbose", is_flag=True, help="Print verbose output")
@click.option("--viz", is_flag=True, help="Display visualizations to help validate the model")
@click.option("--no-viz", is_flag=True, help="Suppress validation visualizations")
@click.option("--pdf", is_flag=True, help="Output visualization results as a PDF")
@click.option("--output", default=None, help="Output file for results")
@click.option("--params", default=None, help="JSON file with parameters")
Expand All @@ -71,7 +71,7 @@ def run(**kwargs):
Expected keys include:
- "verbose": bool, whether to print detailed information during the simulation.
- "viz": bool, whether to visualize the results after the simulation.
- "no-viz": (bool) Whether to suppress visualizations.
- "pdf": bool, whether to save the visualization as a PDF.
Returns:
Expand Down Expand Up @@ -103,12 +103,12 @@ def run(**kwargs):

model.run()

if parameters["viz"]:
if not parameters["no_viz"]:
model.visualize(pdf=parameters["pdf"])

return


if __name__ == "__main__":
ctx = click.Context(run)
ctx.invoke(run, nticks=365, seed=20241107, verbose=True, viz=True, pdf=False)
ctx.invoke(run, nticks=365, seed=20241107, verbose=True, pdf=False)
4 changes: 4 additions & 0 deletions src/laser_measles/transmission.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,10 @@ def __call__(self, model, tick) -> None:
)
np.multiply(contagion, beta_effective, out=forces)
np.divide(forces, model.patches.populations[tick, :], out=forces) # per agent force of infection
# rate to probability conversion 1 - e^(-rate)
np.negative(forces, out=forces)
np.expm1(forces, out=forces)
np.negative(forces, out=forces)

Transmission.nb_transmission_update(
population.susceptibility,
Expand Down

0 comments on commit c59409f

Please sign in to comment.