Warning: This is a development version. The latest stable version is at ReadTheDocs.

pure-python implementation of HS3

GitHub Project GitHub Discussion

Docs from latest Docs from main

PyPI version Conda-forge version Supported Python versions PyPI platforms

Code Coverage CodeFactor pre-commit.ci status Code style: black

Documentation Status GitHub Actions Status GitHub Actions Status: CI GitHub Actions Status: Docs GitHub Actions Status: Publish

Hello World

This section shows two ways to build the same statistical model and evaluate it: using PyHS3 Python objects directly, and using HS3 JSON-like dictionaries.

Hello World (Python)

This is how you use the pyhs3 Python API to build a statistical model directly with objects:

>>> import pyhs3
>>> import scipy
>>> import math
>>> from pyhs3.distributions import GaussianDist
>>> from pyhs3.parameter_points import ParameterPoint, ParameterSet
>>> from pyhs3.domains import ProductDomain, Axis
>>> from pyhs3.metadata import Metadata
>>>
>>> # Create metadata
>>> metadata = Metadata(hs3_version="0.2")
>>>
>>> # Create a Gaussian distribution
>>> gaussian_dist = GaussianDist(name="model", x="x", mean="mu", sigma="sigma")
>>>
>>> # Create parameter points with values
>>> param_points = ParameterSet(
...     name="default_values",
...     parameters=[
...         ParameterPoint(name="x", value=0.0),
...         ParameterPoint(name="mu", value=0.0),
...         ParameterPoint(name="sigma", value=1.0),
...     ],
... )
>>>
>>> # Create domain with parameter bounds
>>> domain = ProductDomain(
...     name="default_domain",
...     axes=[
...         Axis(name="x", min=-5.0, max=5.0),
...         Axis(name="mu", min=-2.0, max=2.0),
...         Axis(name="sigma", min=0.1, max=3.0),
...     ],
... )
>>>
>>> # Build workspace from objects
>>> ws = pyhs3.Workspace(
...     metadata=metadata,
...     distributions=[gaussian_dist],
...     parameter_points=[param_points],
...     domains=[domain],
... )
>>> model = ws.model()

>>> print(model)
Model(
    mode: FAST_RUN
    parameters: 3 (sigma, mu, x)
    distributions: 1 (model)
    functions: 0 ()
)
>>> parameters = {par.name: par.value for par in model.parameterset}
>>> result = -2 * model.logpdf("model", **parameters)
>>> print(f"parameters: {parameters}")
parameters: {'x': 0.0, 'mu': 0.0, 'sigma': 1.0}
>>> print(f"nll: {result:.8f}")
nll: 1.83787707
>>>
>>> # Serialize workspace back to dictionary for saving/sharing
>>> workspace_dict = ws.model_dump()
>>> print("Serialized workspace keys:", list(workspace_dict.keys()))
Serialized workspace keys: ['metadata', 'distributions', 'functions', 'domains', 'parameter_points', 'data', 'likelihoods', 'analyses', 'misc']

Hello World (HS3)

This is the same model built using HS3 JSON-like dictionary format:

>>> import pyhs3
>>> import scipy
>>> import math
>>> workspace_data = {
...     "metadata": {"hs3_version": "0.2"},
...     "distributions": [
...         {
...             "name": "model",
...             "type": "gaussian_dist",
...             "x": "x",
...             "mean": "mu",
...             "sigma": "sigma",
...         }
...     ],
...     "parameter_points": [
...         {
...             "name": "default_values",
...             "parameters": [
...                 {"name": "x", "value": 0.0},
...                 {"name": "mu", "value": 0.0},
...                 {"name": "sigma", "value": 1.0},
...             ],
...         }
...     ],
...     "domains": [
...         {
...             "name": "default_domain",
...             "type": "product_domain",
...             "axes": [
...                 {"name": "x", "min": -5.0, "max": 5.0},
...                 {"name": "mu", "min": -2.0, "max": 2.0},
...                 {"name": "sigma", "min": 0.1, "max": 3.0},
...             ],
...         }
...     ],
... }
>>> ws = pyhs3.Workspace(**workspace_data)
>>> model = ws.model()

>>> print(model)
Model(
    mode: FAST_RUN
    parameters: 3 (sigma, mu, x)
    distributions: 1 (model)
    functions: 0 ()
)
>>> parameters = {par.name: par.value for par in model.parameterset}
>>> result = -2 * model.logpdf("model", **parameters)
>>> print(f"parameters: {parameters}")
parameters: {'x': 0.0, 'mu': 0.0, 'sigma': 1.0}
>>> print(f"nll: {result:.8f}")
nll: 1.83787707
>>> result_scipy = -2 * math.log(scipy.stats.norm.pdf(0, loc=0, scale=1))
>>> print(f"nll: {result_scipy:.8f}")
nll: 1.83787707
>>>
>>> # Round-trip: serialize workspace back to dictionary
>>> serialized_dict = ws.model_dump()
>>> print("Round-trip successful:", serialized_dict["metadata"]["hs3_version"])
Round-trip successful: 0.2
>>>
>>> # Can recreate workspace from serialized dictionary
>>> ws_roundtrip = pyhs3.Workspace(**serialized_dict)
>>> model_roundtrip = ws_roundtrip.model()

>>> print("Round-trip model:", model_roundtrip.parameterset.name)
Round-trip model: default_values

Indices and tables