Skip to main content

Commol

A high-performance compartment modelling library for mathematical modeling using difference equations. Commol provides a clean Python API backed by a fast Rust engine for numerical computations.

⚠️ Alpha Stage Warning: Commol is currently in alpha development. The API is not yet stable and may change between versions without backward compatibility guarantees. Use in production at your own risk.

Features

  • Intuitive Model Building: Fluent API for constructing compartment models
  • Mathematical Expressions: Support for complex mathematical formulas in transition rates (sin, cos, exp, log, etc.)
  • Stratified Populations: Multi-dimensional population stratification with optional conditional stratifications
  • Unit Checking: Automatic dimensional analysis to catch unit errors before simulation
  • High Performance: Rust-powered simulation engine with JIT-compiled (Cranelift) rate expressions
  • Flexible Architecture: Support for stratified populations, per-compartment rates, and time-varying parameters
  • Type Safety: Comprehensive validation using Pydantic models
  • Multiple Output Formats: Get results as dictionaries or lists for easy analysis
  • Parameter Calibration: Built-in optimization (Nelder-Mead, PSO) with probabilistic ensemble calibration

Installation

# Install from PyPI (once published)
pip install commol

# Or install from source
git clone https://github.com/MUNQU/commol.git
cd commol/py-commol
pip install maturin

# If using a virtual environment, activate it first
# source venv/bin/activate  # On Linux/macOS
# venv\Scripts\activate     # On Windows

maturin develop --release

⚠️ Important: The project directory path must not contain tildes (~) or spaces. Maturin may fail with paths like ~/projects/commol or /home/my projects/commol. Use full paths like /home/username/projects/commol instead.

Quick Start

from commol import ModelBuilder, Simulation

# Build a simple SIR model
model = (
    ModelBuilder(name="Basic SIR", version="1.0")
    .add_bin(id="S", name="Susceptible")
    .add_bin(id="I", name="Infected")
    .add_bin(id="R", name="Recovered")
    .add_parameter(id="beta", value=0.3)
    .add_parameter(id="gamma", value=0.1)
    .add_transition(
        id="infection",
        source=["S"],
        target=["I"],
        rate="beta * S * I / N"
    )
    .add_transition(
        id="recovery",
        source=["I"],
        target=["R"],
        rate="gamma"
    )
    .set_initial_conditions(
        population_size=1000,
        bin_fractions=[
            {"bin": "S", "fraction": 0.99},
            {"bin": "I", "fraction": 0.01},
            {"bin": "R", "fraction": 0.0}
        ]
    )
    .build(typology="DifferenceEquations")
)

# Run simulation
simulation = Simulation(model)
results = simulation.run(num_steps=100)

# Display results
print(f"Final infected: {results['I'][-1]:.0f}")

# Visualize results
from commol import SimulationPlotter

plotter = SimulationPlotter(simulation, results)
plotter.plot_series(output_file="sir_model.png")

Using $compartment Placeholder for Multiple Transitions

When you need to apply the same transition to multiple compartments (like removal rates), use the $compartment placeholder instead of writing repetitive code:

model = (
    ModelBuilder(name="SLIR with Removal", version="1.0")
    .add_bin(id="S", name="Susceptible")
    .add_bin(id="L", name="Latent")
    .add_bin(id="I", name="Infected")
    .add_bin(id="R", name="Recovered")
    .add_parameter(id="beta", value=0.3)
    .add_parameter(id="gamma", value=0.2)
    .add_parameter(id="delta", value=0.1)
    .add_parameter(id="mu", value=0.01)
    .add_transition(
        id="infection",
        source=["S"],
        target=["L"],
        rate="beta * S * I / N"
    )
    .add_transition(
        id="progression",
        source=["L"],
        target=["I"],
        rate="gamma * L"
    )
    .add_transition(
        id="recovery",
        source=["I"],
        target=["R"],
        rate="delta * I"
    )
    # Single transition automatically expands to 4 separate removal transitions
    .add_transition(
        id="removal",
        source=["S", "L", "I", "R"],
        target=[],
        rate="mu * $compartment"  # Expands to: mu*S, mu*L, mu*I, mu*R
    )
    .set_initial_conditions(
        population_size=1000,
        bin_fractions=[
            {"bin": "S", "fraction": 0.99},
            {"bin": "L", "fraction": 0.005},
            {"bin": "I", "fraction": 0.005},
            {"bin": "R", "fraction": 0.0}
        ]
    )
    .build(typology="DifferenceEquations")
)

The $compartment placeholder:

  • Automatically expands to multiple transitions (one per source compartment)
  • Replaces $compartment with the actual compartment name in the rate formula
  • Works with stratified rates for age-structured or location-based models
  • Reduces code duplication and improves maintainability

Example with stratified rates:

.add_transition(
    id="removal",
    source=["S", "I", "R"],
    target=[],
    rate="mu_base * $compartment",  # Fallback rate
    stratified_rates=[
        {
            "conditions": [{"stratification": "age", "category": "young"}],
            "rate": "mu_young * $compartment"
        },
        {
            "conditions": [{"stratification": "age", "category": "old"}],
            "rate": "mu_old * $compartment"
        }
    ]
)

Stratified Populations

Stratifications add population dimensions as a Cartesian product. A model with bins [S, I, R] and stratification age: [young, old] produces compartments S_young, S_old, I_young, I_old, R_young, R_old.

model = (
    ModelBuilder(name="SIR-age")
    .add_bin(id="S", name="Susceptible")
    .add_bin(id="I", name="Infected")
    .add_bin(id="R", name="Recovered")
    .add_stratification(id="age", categories=["young", "old"])
    .add_parameter(id="beta", value=0.3)
    .add_parameter(id="gamma", value=0.1)
    # S and I here are aggregate totals (S_young + S_old, etc.)
    # per_compartment=True replaces S→S_young/S_old per flow
    .add_transition(
        id="infection",
        source=["S"],
        target=["I"],
        rate="beta * S * I / N",
        per_compartment=True
    )
    .add_transition(
        id="recovery",
        source=["I"],
        target=["R"],
        rate="gamma"
    )
    .set_initial_conditions(
        population_size=10000,
        bin_fractions=[
            {"bin": "S", "fraction": 0.99},
            {"bin": "I", "fraction": 0.01},
            {"bin": "R", "fraction": 0.0},
        ],
        stratification_fractions=[
            {"stratification": "age", "fractions": [
                {"category": "young", "fraction": 0.6},
                {"category": "old", "fraction": 0.4},
            ]}
        ]
    )
    .build(typology="DifferenceEquations")
)

Conditional stratifications allow a stratification to only apply to compartments whose already-assigned categories satisfy specified conditions. This enables non-uniform, nested population structures:

# "risk" stratification only applies to the "old" age group
model = (
    ModelBuilder(name="SIR-age-risk")
    .add_bin(id="S", name="Susceptible")
    .add_bin(id="I", name="Infected")
    .add_bin(id="R", name="Recovered")
    .add_stratification(id="age", categories=["young", "old"])
    .add_stratification(
        id="risk",
        categories=["low", "high"],
        conditions=[{"stratification": "age", "category": "old"}]
    )
    ...
)
# Resulting compartments: S_young, S_old_low, S_old_high,
#                         I_young, I_old_low, I_old_high,
#                         R_young, R_old_low, R_old_high

With Unit Checking

Add units to parameters and bins for automatic dimensional validation and annotated equation display:

from commol import ModelBuilder

model = (
    ModelBuilder(name="SIR with Units", version="1.0", bin_unit="person")
    .add_bin(id="S", name="Susceptible")
    .add_bin(id="I", name="Infected")
    .add_bin(id="R", name="Recovered")
    .add_parameter(id="beta", value=0.5, unit="1/day")
    .add_parameter(id="gamma", value=0.1, unit="1/day")
    .add_transition(
        id="infection",
        source=["S"],
        target=["I"],
        rate="beta * S * I / N"
    )
    .add_transition(
        id="recovery",
        source=["I"],
        target=["R"],
        rate="gamma * I"
    )
    .set_initial_conditions(
        population_size=1000,
        bin_fractions=[
            {"bin": "S", "fraction": 0.99},
            {"bin": "I", "fraction": 0.01},
            {"bin": "R", "fraction": 0.0}
        ]
    )
    .build(typology="DifferenceEquations")
)

# Validate dimensional consistency
model.check_unit_consistency()

# Print equations with unit annotations
model.print_equations()
# Output shows:
#   S -> I: beta(1/day) * S(person) * I(person) / N(person) [person/day]
#   I -> R: gamma(1/day) * I(person) [person/day]

# Export equations in LaTeX format for publications
model.print_equations(format="latex")
# Output: \[\frac{dS}{dt} = - (\beta \cdot S \cdot I / N)\]

Note: Units must be defined for ALL parameters and bins, or for NONE. Partial unit definitions will raise a ValueError to prevent inconsistent models.

Model Calibration

Fit model parameters to observed data using optimization algorithms. Parameters to be calibrated should be set to None:

from commol import (
    ModelBuilder,
    Simulation,
    Calibrator,
    CalibrationProblem,
    CalibrationParameter,
    ObservedDataPoint,
    ParticleSwarmConfig,
)

# Build model with unknown parameters
model = (
    ModelBuilder(name="SIR Model", version="1.0")
    .add_bin(id="S", name="Susceptible")
    .add_bin(id="I", name="Infected")
    .add_bin(id="R", name="Recovered")
    .add_parameter(id="beta", value=None)   # To be calibrated
    .add_parameter(id="gamma", value=None)  # To be calibrated
    .add_transition(
        id="infection",
        source=["S"],
        target=["I"],
        rate="beta * S * I / N"
    )
    .add_transition(
        id="recovery",
        source=["I"],
        target=["R"],
        rate="gamma * I"
    )
    .set_initial_conditions(
        population_size=1000,
        bin_fractions=[
            {"bin": "S", "fraction": 0.99},
            {"bin": "I", "fraction": 0.01},
            {"bin": "R", "fraction": 0.0}
        ]
    )
    .build(typology="DifferenceEquations")
)

# Define observed data
observed_data = [
    ObservedDataPoint(step=10, compartment="I", value=45.2),
    ObservedDataPoint(step=20, compartment="I", value=78.5),
    ObservedDataPoint(step=30, compartment="I", value=62.3),
]

# Simulation can be created with None parameters for calibration
simulation = Simulation(model)

# Specify parameters to calibrate with bounds and initial guesses
parameters = [
    CalibrationParameter(
        id="beta",
        parameter_type="parameter",
        min_bound=0.0,
        max_bound=1.0,
        initial_guess=0.3
    ),
    CalibrationParameter(
        id="gamma",
        parameter_type="parameter",
        min_bound=0.0,
        max_bound=1.0,
    ),
]

# Configure optimization algorithm (config type determines the algorithm)
pso_config = ParticleSwarmConfig(
    num_particles=40,
    max_iterations=300,
    verbose=True
)

# Configure calibration problem
problem = CalibrationProblem(
    observed_data=observed_data,
    parameters=parameters,
    loss_function="sse",
    optimization_config=pso_config,  # ParticleSwarmConfig or NelderMeadConfig
)

# Run calibration
calibrator = Calibrator(simulation, problem)
result = calibrator.run()

print(f"Calibrated beta: {result.best_parameters['beta']:.4f}")
print(f"Calibrated gamma: {result.best_parameters['gamma']:.4f}")
print(f"Final loss: {result.final_loss:.6f}, converged: {result.converged}")

# Update model with calibrated parameters
model.update_parameters(result.best_parameters)

# Create new simulation with calibrated model
calibrated_simulation = Simulation(model)
calibrated_results = calibrated_simulation.run(num_steps=100)

Calibrating with Scale Parameters:

When observed data is underreported, use scale parameters to estimate the reporting rate:

from commol import SimulationPlotter

# Reported cases (potentially underreported)
reported_cases = [10, 15, 25, 40, 60, 75, 85, 70, 50, 30]

# Link observed data to scale parameter
observed_data = [
    ObservedDataPoint(
        step=idx,
        compartment="I",
        value=cases,
        scale_id="reporting_rate"  # Links to scale parameter
    )
    for idx, cases in enumerate(reported_cases)
]

parameters = [
    CalibrationParameter(
        id="beta",
        parameter_type="parameter",
        min_bound=0.1,
        max_bound=1.0
    ),
    CalibrationParameter(
        id="gamma",
        parameter_type="parameter",
        min_bound=0.05,
        max_bound=0.5
    ),
    CalibrationParameter(
        id="reporting_rate",
        parameter_type="scale",
        min_bound=0.01,
        max_bound=1.0
    ),
]

problem = CalibrationProblem(
    observed_data=observed_data,
    parameters=parameters,
    loss_function="sse",
    optimization_config=pso_config,
)

calibrator = Calibrator(simulation, problem)
result = calibrator.run()

print(f"Calibrated reporting rate: {result.best_parameters['reporting_rate']:.2%}")

# plot_series extracts scale values automatically from calibration_result
results = simulation.run(num_steps=len(reported_cases))
plotter = SimulationPlotter(simulation, results)
plotter.plot_series(observed_data=observed_data, calibration_result=result)

Constraining Parameters:

Apply constraints to enforce domain knowledge during calibration.

from commol import CalibrationConstraint

# Add constraint: beta/gamma <= 5 (written as 5 - beta/gamma >= 0)
constraints = [
    CalibrationConstraint(
        id="r0_bound",
        expression="5.0 - beta/gamma",
        description="R0 <= 5",
    )
]

problem = CalibrationProblem(
    observed_data=observed_data,
    parameters=parameters,
    constraints=constraints,
    loss_function="sse",
    optimization_config=pso_config,
)

calibrator = Calibrator(simulation, problem)
result = calibrator.run()

Probabilistic Calibration:

For uncertainty quantification, use probabilistic calibration to get an ensemble of parameter sets:

from commol import ProbabilisticCalibrationConfig

# Configure probabilistic calibration
prob_config = ProbabilisticCalibrationConfig(
    n_runs=20,          # Number of independent calibration runs
    confidence_level=0.95
)

problem = CalibrationProblem(
    observed_data=observed_data,
    parameters=parameters,
    loss_function="sse",
    optimization_config=pso_config,
    probabilistic_config=prob_config,  # Enable probabilistic mode
)

# run_probabilistic() runs multiple calibrations, clusters results,
# and selects an ensemble via NSGA-II multi-objective optimization
calibrator = Calibrator(simulation, problem)
prob_result = calibrator.run_probabilistic()

ensemble = prob_result.selected_ensemble
print(f"Ensemble size: {ensemble.ensemble_size}")
print(f"Coverage: {ensemble.coverage_percentage:.1f}%")
print(f"Average CI width: {ensemble.average_ci_width:.4f}")

# Plot with confidence interval bands
plotter.plot_series(calibration_result=prob_result)

Documentation

Full Documentation

Development

For contributors and developers:

Local Development

# Clone repository
git clone https://github.com/MUNQU/commol.git
cd commol

# Create and activate virtual environment
python -m venv venv
source venv/bin/activate  # On Linux/macOS
venv\Scripts\activate     # On Windows

# Install Python dependencies and build the Rust extension
cd py-commol
pip install -e ".[dev,docs]"
maturin develop --release

# Run tests
pytest
cd ..
cargo test --workspace

# Build documentation locally
cd py-commol
mkdocs serve

⚠️ Path Requirements: Ensure the project path contains no tildes (~) or spaces. Maturin may fail otherwise.

💡 Tip: Make sure your virtual environment is activated before running maturin develop.

License

Commol is licensed under the MIT License. See LICENSE for details.

Authors

Citation

If you use Commol in your research, please cite:

@software{commol2025,
  title = {Commol: A High-Performance Compartment Modelling Library},
  author = {
    Villanueva Micó, Rafael J.
    and Andreu Vilarroig, Carlos
    and Martínez Rodríguez, David
  },
  year = {2025},
  url = {https://github.com/MUNQU/commol}
}

Support

Metadata

Release files for commol 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for commol 0.1.1
File Size Uploaded Provenance
commol-0.1.1.tar.gz 395.5 kB With provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for commol 0.1.1
File
commol-0.1.1-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
commol-0.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.17+ x86-64 Details
commol-0.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.17+ ARM64 Details
commol-0.1.1-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
commol-0.1.1-cp314-cp314-macosx_10_12_x86_64.whl CPython 3.14 CPython 3.14 macOS 10.12+ x86-64 Details
commol-0.1.1-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
commol-0.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ x86-64 Details
commol-0.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ ARM64 Details
commol-0.1.1-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
commol-0.1.1-cp313-cp313-macosx_10_12_x86_64.whl CPython 3.13 CPython 3.13 macOS 10.12+ x86-64 Details
commol-0.1.1-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
commol-0.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-64 Details
commol-0.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ ARM64 Details
commol-0.1.1-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
commol-0.1.1-cp312-cp312-macosx_10_12_x86_64.whl CPython 3.12 CPython 3.12 macOS 10.12+ x86-64 Details

Total release size: 38.8 MB

Release files / commol-0.1.1.tar.gz

Download URL commol-0.1.1.tar.gz
Size 395.5 kB
Tags Source
SHA-256 checksum
How to use checksums
303e93f435bb5342e88e9714c9c55dc35325a940b22b8829ab490650954da07e
BLAKE2b-256 checksum
How to use checksums
93dc8eee54ce5becab72c0cc1f215c54b5434b3c4b17a7f445ed586dd7b47a7e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / commol-0.1.1-cp314-cp314-win_amd64.whl

Download URL commol-0.1.1-cp314-cp314-win_amd64.whl
Size 2.5 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
b56afb04a3debb998a3378ef97f12b1a8da9ca95ae30d2476ac3bed9a9841793
BLAKE2b-256 checksum
How to use checksums
dd0ddaa27830a9f3e4174dd70a04e7408582db4bd604fdfdb6b9837e56f373d1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / commol-0.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL commol-0.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 2.9 MB
Tags CPython 3.14 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
616d22184bc50fda0e6ff9c685d4c4e31d4b927aeea44b25ce894f0f4e7d9369
BLAKE2b-256 checksum
How to use checksums
1fc63eef72004b739d393f3fcd9bed07c6e9cd9a4645fab4315130f22e307945
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / commol-0.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL commol-0.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 2.4 MB
Tags CPython 3.14 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
4fec0b459c85d0ea5bf2c8243e5bacf57cd4fb14ef023a28082c596fd21dcfb1
BLAKE2b-256 checksum
How to use checksums
e6e66629a22a8ab2ae6ef604cc006e679b0665d73f8bfe08c64614a420fad5f5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / commol-0.1.1-cp314-cp314-macosx_11_0_arm64.whl

Download URL commol-0.1.1-cp314-cp314-macosx_11_0_arm64.whl
Size 2.2 MB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
764a90c106d12a5a76ae08fa7f5d78a7e1d06eb1e6adb2ecb3ca39ff6295b6b0
BLAKE2b-256 checksum
How to use checksums
1e73c7a308f5c4aee5c44387cb2ad556eac92fccfbeeb590780dcc4657e329c7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / commol-0.1.1-cp314-cp314-macosx_10_12_x86_64.whl

Download URL commol-0.1.1-cp314-cp314-macosx_10_12_x86_64.whl
Size 2.7 MB
Tags CPython 3.14 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
804ba50ba9c7bd575d17d014920bf083ae3afdf99f454b39c395da0468296f10
BLAKE2b-256 checksum
How to use checksums
4c6fcf29740c26544e78823a2620822b7b38a81a2a67dda17e6ee75d656bc969
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / commol-0.1.1-cp313-cp313-win_amd64.whl

Download URL commol-0.1.1-cp313-cp313-win_amd64.whl
Size 2.5 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
334761008e89a10210226b226e347c6397a08e0aba77e445936a4fbac9ed92ed
BLAKE2b-256 checksum
How to use checksums
235b750d82066dce9ca59a450a650fa474184bf8457eab10699f4064dd3db394
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / commol-0.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL commol-0.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 2.9 MB
Tags CPython 3.13 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
a5a2a50c93a1a553facbeab51f4a7da2e97d9a22608807d26dfa082d97da6d7c
BLAKE2b-256 checksum
How to use checksums
3decdba1475511905166b2e5fa2d9806713546372c44c2501b8c32c66333c104
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / commol-0.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL commol-0.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 2.4 MB
Tags CPython 3.13 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
8987f95296b0b7be4fdfbf81ba1973ae1733df39195677cd51d1cb9f417512be
BLAKE2b-256 checksum
How to use checksums
8ccbfab745a493ec7a2c69fd1c0b38f97ecd9bc2e9bc115fa964f8da3efcd20d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / commol-0.1.1-cp313-cp313-macosx_11_0_arm64.whl

Download URL commol-0.1.1-cp313-cp313-macosx_11_0_arm64.whl
Size 2.2 MB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
a00950f7e462985975316628ac58aa121c4e4f06b9f7462b851390310d133115
BLAKE2b-256 checksum
How to use checksums
2ed348590a0095b4120c7e0de390f63d3826e64a1ad1a3574edc9f1a7d9e01d9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / commol-0.1.1-cp313-cp313-macosx_10_12_x86_64.whl

Download URL commol-0.1.1-cp313-cp313-macosx_10_12_x86_64.whl
Size 2.7 MB
Tags CPython 3.13 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
fcf9785f5cbf83a0b1eae9a966f61065c017b9a235db3b1b9d9b7047b31a4750
BLAKE2b-256 checksum
How to use checksums
ae3b6b3a6b5143db2e01da71d401220ab1687d714ad0e690826f09cae17d3f4c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / commol-0.1.1-cp312-cp312-win_amd64.whl

Download URL commol-0.1.1-cp312-cp312-win_amd64.whl
Size 2.5 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
f9721c0c186e780268c4a708d1b045e2e8e5edc0e4fd1cc5cc8de4f3dac432d2
BLAKE2b-256 checksum
How to use checksums
701cb278c94231f9ee3cc7d30d7f2dd09dc763e0ae13db2a04067adb8f897c55
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / commol-0.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL commol-0.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 2.9 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
4fb55508f68930bd51eef603d7845de859820ac50f118d8577f3cd38fa980054
BLAKE2b-256 checksum
How to use checksums
72d899c1d75fdb247be46256cdbe32a7d942295ae7bb187cce71d528de91834e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / commol-0.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL commol-0.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 2.4 MB
Tags CPython 3.12 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
3133f24d1db400f0dbf1cd6a0ea04bec14ef1e97264fc72474b1d276831c37b4
BLAKE2b-256 checksum
How to use checksums
ebdbcc48f729d5ae389e2b679da3e919ec590109b8991dc5b235d969778ef3c1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / commol-0.1.1-cp312-cp312-macosx_11_0_arm64.whl

Download URL commol-0.1.1-cp312-cp312-macosx_11_0_arm64.whl
Size 2.2 MB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
e07828b1daf8070d06077575f4b38aa59282500ed0ccb9432b4ccc1ba115312a
BLAKE2b-256 checksum
How to use checksums
15e3af7deb4aefd2d82bd9a6da800d7fcc025461b4874b465ea225cffabce20f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Release files / commol-0.1.1-cp312-cp312-macosx_10_12_x86_64.whl

Download URL commol-0.1.1-cp312-cp312-macosx_10_12_x86_64.whl
Size 2.7 MB
Tags CPython 3.12 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
2399caf8bfc0e6cfebb57790a1eb42ec2d311dbe196bb615f8424dacbae98c5c
BLAKE2b-256 checksum
How to use checksums
07faf579ac5d758d4735b84f571d46e267866b7c3d9634de8cd78e0c5dac17fb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

Security for commol 0.1.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 16 files in this release have been uploaded with provenance metadata.

Select from 16 files

Attestation for commol-0.1.1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page