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/commolor/home/my projects/commol. Use full paths like/home/username/projects/commolinstead.
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
$compartmentwith 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
- Installation Guide - Setup and installation
- Quick Start - Build your first model
- User Guide - Core concepts and tutorials
- Model Calibration - Parameter fitting and optimization
- API Reference - Complete API documentation
- Examples - SIR, SEIR, and advanced models
Development
For contributors and developers:
- Development Workflow - Setup, branching, CI/CD
- Contributing Guidelines - How to contribute
- Release Process - Version management
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
- Rafael J. Villanueva Micó - rjvillan@imm.upv.es
- Carlos Andreu Vilarroig - caranvi1@upv.es
- David Martínez Rodríguez - damarro3@upv.es
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
- Documentation: https://munqu.github.io/commol
- Issue Tracker: https://github.com/MUNQU/commol/issues
- Discussions: https://github.com/MUNQU/commol/discussions
Metadata
Release files for commol 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| commol-0.1.2.tar.gz | 421.1 kB | With provenance | Details |
Built distributions (wheels)
Total release size: 40.3 MB
Release files / commol-0.1.2.tar.gz
| Download URL | commol-0.1.2.tar.gz |
|---|---|
| Size | 421.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0f66072eabf177a77b3beada5593c76cbad35ce6a732ef39a6f8e56626cda66a
|
|
BLAKE2b-256 checksum How to use checksums |
aec058138f9e4e91b2abd018a86b8ef0c8c06241599e364741634508ac4c631e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.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 30, 2026.
Transparency logRelease files / commol-0.1.2-cp314-cp314-win_amd64.whl
| Download URL | commol-0.1.2-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
b5bea1be796fb0cd1f605a8cc232b008114073aa419b08923fc784d4e90c1464
|
|
BLAKE2b-256 checksum How to use checksums |
afff595a7c08f35c3abb0735face1bf720163be8a61c6116ef738df8ee2c7ed4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.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 30, 2026.
Transparency logRelease files / commol-0.1.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | commol-0.1.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 3.0 MB |
| Tags | CPython 3.14 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
ee72a799d46f1fc076891e6eeaa0169b85a2467bde39e9a696b754912872b042
|
|
BLAKE2b-256 checksum How to use checksums |
52ea8053de3d4613a82df205a6ed72d9a9881f4dc82b6e074eeb8cdc7238a227
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.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 30, 2026.
Transparency logRelease files / commol-0.1.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | commol-0.1.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.14 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
999320f0ce760814ab9214b5fced445ef54dc0aeaf181c666f8ba7edb14dde01
|
|
BLAKE2b-256 checksum How to use checksums |
e17ab1ef11cbb9a073fb03535b44e8ad44ecbf8ed0e25c0fc4a031d261bd634f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.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 30, 2026.
Transparency logRelease files / commol-0.1.2-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | commol-0.1.2-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c535772e991f9815b3a6cc4f8643a35afcb6a222458f9bc1e83460c4c738f20d
|
|
BLAKE2b-256 checksum How to use checksums |
68733546a83f4bc69dea5301c4f34d20ea97447d8549064c79c09343665567ab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.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 30, 2026.
Transparency logRelease files / commol-0.1.2-cp314-cp314-macosx_10_12_x86_64.whl
| Download URL | commol-0.1.2-cp314-cp314-macosx_10_12_x86_64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | CPython 3.14 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
0313253406731a28c3a5407bf84fe90324ed6d5e4e76f94cfc790363ae68a788
|
|
BLAKE2b-256 checksum How to use checksums |
6f8a38bf885191877ec342d540804098f10500d388547bb92682d20a109ecc97
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.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 30, 2026.
Transparency logRelease files / commol-0.1.2-cp313-cp313-win_amd64.whl
| Download URL | commol-0.1.2-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
3642bc5830d39a488b4d680b26e8d924918c76655cdcd55ea1e8212706e3e31f
|
|
BLAKE2b-256 checksum How to use checksums |
c7853d8b2b9a7fa94b021150927452b4f19fefe0c02d2fc1c1eb79bb5b245da0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.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 30, 2026.
Transparency logRelease files / commol-0.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | commol-0.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 3.0 MB |
| Tags | CPython 3.13 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
aae66ba41d3ef7310bd339e49a019d0af0b9ee3ab7ffbe51834fbd3826d554bb
|
|
BLAKE2b-256 checksum How to use checksums |
60b446360c679d133e8815c1cbb427ace7a50d792de71334433e40cf75d86adc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.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 30, 2026.
Transparency logRelease files / commol-0.1.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | commol-0.1.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.13 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
f2493872b4440a55b629218791eb66d11d030d500d39cc61f4fc6bb75bfad83f
|
|
BLAKE2b-256 checksum How to use checksums |
deadfae87300978c5478fe892d49219656b6c58ac960acb4dfb5bb77205ef243
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.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 30, 2026.
Transparency logRelease files / commol-0.1.2-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | commol-0.1.2-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
e8b3a3b290ecee3d30cf1725f944b341ba098531d326afd6473c2f148c8c7409
|
|
BLAKE2b-256 checksum How to use checksums |
d9ca0a55ed3c8ff925c42ba9f7128b65fcaa882a7dc215888f38d8e5bfc809a6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.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 30, 2026.
Transparency logRelease files / commol-0.1.2-cp313-cp313-macosx_10_12_x86_64.whl
| Download URL | commol-0.1.2-cp313-cp313-macosx_10_12_x86_64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | CPython 3.13 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
b7c1fe4cc57b201c77cf70fc81438fa2461a4e4484dbcc7b07425df22295e85c
|
|
BLAKE2b-256 checksum How to use checksums |
8c7ad5a441948291d5b7e84abf546d41dc3e6f49703ab18099aea6c54fcbfe11
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.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 30, 2026.
Transparency logRelease files / commol-0.1.2-cp312-cp312-win_amd64.whl
| Download URL | commol-0.1.2-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
8b246a2caa10d9301ffcbc932b3a68f5fbe009364c7de9bfc45806f5b8cfa2f0
|
|
BLAKE2b-256 checksum How to use checksums |
d82799481c0310ccdf2631aaa778dce0807a3812fbb78ba64bc6f8e356dd3b4a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.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 30, 2026.
Transparency logRelease files / commol-0.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | commol-0.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 3.0 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
d3518a5e8ae802b645a7709276742d9b77f30b0a3e8ad9ae9175ed04e7d88979
|
|
BLAKE2b-256 checksum How to use checksums |
38a5b09bb9870c563c059a83e9636d4185f147ea6bc128599277ee4dfba20227
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.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 30, 2026.
Transparency logRelease files / commol-0.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | commol-0.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
7fcee7023c6231456679c11e08636c33ad929c5b39ef3645a35d302110d71428
|
|
BLAKE2b-256 checksum How to use checksums |
223474410ef75f2deabaee759d96262c5d4ffeb202d60cd01aa7c10abcb3f1e1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.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 30, 2026.
Transparency logRelease files / commol-0.1.2-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | commol-0.1.2-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
4c35990166de937ae22d7002a9014310772d20fe085ca0eafa9637622fbea92c
|
|
BLAKE2b-256 checksum How to use checksums |
ba134ccb15dca7f26d15964d1fc83939121e92836f8d1523af6a166bfd67de93
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.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 30, 2026.
Transparency logRelease files / commol-0.1.2-cp312-cp312-macosx_10_12_x86_64.whl
| Download URL | commol-0.1.2-cp312-cp312-macosx_10_12_x86_64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | CPython 3.12 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
77b07aed9b7f49eb539815edf56eceedbb1eded2f18bab4d6e13fe431cdf107a
|
|
BLAKE2b-256 checksum How to use checksums |
e8f6ebe5abffce9f55679340acc2ccf628ce2a13377fa55ba56586c12e954eda
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.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 30, 2026.
Transparency logSecurity for commol 0.1.2
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.
Attestation for commol-0.1.2.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 30, 2026.
Transparency logA 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.