Skip to main content

metacountregressor

A JAX-first Python package for hierarchical model fitting and metaheuristic-driven model structure search. Supports count, CMF, duration, and linear models with random parameters, latent classes, zero-inflation, and heterogeneity in means — all with one unified API.


Table of Contents


Install

pip install metacountregressor
pip install jax jaxlib jaxopt   # JAX backend

Quick import check:

python -c "from metacountregressor import __version__, load_example16_3_raw_data; print(__version__, load_example16_3_raw_data().shape)"

GPU acceleration (optional)

The package runs on CPU out of the box and automatically uses a GPU when JAX can see one — no code changes required. Install the CUDA flavour of JAX instead of the CPU wheel:

pip install -U "jax[cuda]"

Verify what the package picked up:

from metacountregressor import device_summary
print(device_summary())
# e.g. metacountregressor JAX 0.6.2 | backend=cuda | devices=[CpuDevice(id=0), CudaDevice(id=0)] | x64=True | gpu_preallocate=False

Behaviour and controls:

Concern Default Override
Platform choice Auto-detect (GPU if visible, else CPU) `METACOUNT_JAX_PLATFORM=cpu
Float precision float64 enabled (required by the estimators)
GPU memory Grows on demand — safe for shared clusters (XLA's default grabs ~75% of VRAM up front) METACOUNT_GPU_PREALLOCATE=1 for exclusive nodes
GPU out-of-memory Fits transparently retry once after clearing JAX caches, then fall back to the CPU device instead of crashing the search

Transient GPU failures never poison a structure search: candidate structures that fail only because of device memory are retried, not blacklisted.


Tutorials & resources

Everything you need to learn the package in one place.

Bundled notebook tutorials

Six tutorial notebooks ship inside the wheel and use the bundled Example 16-3 crash-frequency dataset, so every cell runs out of the box — no need to source your own data. Copy them into your working directory:

from metacountregressor import get_templates
get_templates()          # copies all six .ipynb files to the current folder
# Notebook What you learn Time
00 00_quickstart.ipynb Install, load bundled data, first search run end-to-end ~10 min
01 01_crash_frequency_search.ipynb Mixed Negative Binomial search — constraints, roles, re-fit with more draws ~20 min
02 02_latent_class_fc_validation.ipynb 2-class latent class model — fit, extract class probabilities, validate against functional class ~20 min
03 03_cmf_aadt_search.ipynb CMF model — baseline + AADT-interaction structure search ~20 min
04 04_linear_speed_prediction.ipynb Gaussian linear model search (platform speed prediction) ~20 min
05 05_batch_script_tutorial.ipynb Batch scripts, parallel seeds, PBS/SLURM HPC job templates, result collection ~30 min

Browse them online in the templates folder or open locally:

jupyter lab   # after get_templates(), the notebooks are in your working directory

Worked example scripts & extended walkthroughs

Resource Format Link
Hierarchical CMF tutorial (full worked analysis) Python script examples/manual_hierarchical_cmf_tutorial.py
Hierarchical CMF narrative guide Markdown examples/TUTORIAL_HIERARCHICAL_CMF.md
General tutorial (search → fit → interpret) Jupyter notebook Tutorial.ipynb
Batch / HPC workflow deep dive Jupyter notebook Tutorial_Batch.ipynb
Batch / HPC workflow deep dive Markdown Tutorial_Batch.md

Built-in help system (no internet needed)

Every workflow has a printable guide built into the package:

from metacountregressor import get_help

get_help()                    # list all available topics
Topic Contents
get_help('roles') Role-code reference (0–8) and random-parameter distributions
get_help('constraints') Full ModelConstraints API with examples
get_help('metaheuristics') SA / DE / HS comparison and tuning parameters
get_help('crash_frequency') End-to-end count-model workflow
get_help('latent_class') Latent-class workflow incl. class-probability extraction
get_help('cmf') Crash Modification Factor workflows (both routes)
get_help('linear') Gaussian linear model workflow
get_help('duration') Duration / survival model workflow
get_help('batch') Batch scripts, walltime detection, PBS/SLURM templates

Other resources


Quick Start

import numpy as np
from metacountregressor import (
    ExperimentBuilder,
    ModelConstraints,
    SearchOutputConfig,
    load_example16_3_model_data,
    get_help,
)

# ── 1. Load the bundled crash-frequency dataset ──────────────────────────────
df = load_example16_3_model_data()
exposure = df['LENGTH'] * df['AADT'] * 365 / 1e8
df['OFFSET'] = np.log(exposure.clip(lower=1e-9))

# ── 2. Build constraints ──────────────────────────────────────────────────────
c = (
    ModelConstraints()
    .force_include('OFFSET')
    .no_zi('LENGTH', 'CURVES', 'WIDTH', 'SLOPE')
    .no_random('URB')
    .allow_random('CURVES', distributions=['lognormal'])
    .mutual_exclusion(['SPEED', 'CURVES'])   # at most one active at a time
)

# ── 3. Create the experiment ──────────────────────────────────────────────────
builder = ExperimentBuilder(df, id_col='ID', y_col='FREQ', offset_col='OFFSET')
builder.describe()              # print data summary
get_help('crash_frequency')     # print end-to-end workflow guide

# ── 4. Build the structure evaluator ─────────────────────────────────────────
evaluator = builder.build_evaluator(
    variables=['AADT', 'LENGTH', 'SPEED', 'CURVES', 'URB', 'AVEPRE'],
    constraints=c,
    default_roles=[0, 1, 2, 3, 5],
    max_latent_classes=1,
    R=200,
)

# ── 5. Run the search ─────────────────────────────────────────────────────────
result = builder.run(
    evaluator,
    algo='sa',          # 'sa' | 'de' | 'hs'
    max_iter=1000,
    seed=42,
    output_config=SearchOutputConfig(output_dir='results', experiment_name='demo'),
)
print('Best BIC:', result.best_score)
print('Saved to:', result.saved_to)

# ── 6. Re-fit with more draws ─────────────────────────────────────────────────
fit = builder.fit_manual_model(manual_spec=result.best_spec, model='nb', R=500)
print(fit)

What the package does

metacountregressor solves two related problems:

  1. Structure search — automatically discover which variables to include, whether each coefficient should be fixed or random, and whether the model needs latent classes, zero-inflation, or heterogeneity in means. The search is driven by metaheuristic algorithms (SA, DE, HS) that minimise BIC.

  2. Model estimation — fit the discovered (or manually specified) model structure using JAX-accelerated simulation-based maximum likelihood with Halton draws.

The same API handles crash-frequency count models, CMF (Crash Modification Factor) models, duration models, and linear (Gaussian) models.


Data loaders

All loaders return a pandas.DataFrame.

from metacountregressor import (
    load_example16_3_raw_data,      # Example 16-3: original 31 columns
    load_example16_3_model_data,    # + OFFSET, FC_ENCODED, FC_LABEL
    load_example_crash_data,        # alias for load_example16_3_model_data
    load_example_duration_data,     # synthetic duration target from Ex 16-3
    load_example_linear_data,       # synthetic linear target from Ex 16-3
    load_example_platform_speed_data,           # speed relative to platform
    load_example_platform_gap_duration_data,    # time until next speeding event
    load_example_panel_data,        # panel-structure example
)

Example 16-3 columns

load_example16_3_raw_data() returns the original source columns:

Group Columns
Identifiers ID
Outcome FREQ
Geometry LENGTH, WIDTH, INCLANES, DECLANES, MEDWIDTH, MIMEDSH, MXMEDSH
Speed / grade SPEED, MIGRADE, MXGRADE, MXGRDIFF, SLOPE
Traffic AADT, SINGLE, DOUBLE, TRAIN, PEAKHR, ADTLANE
Road class URB, FC, ACCESS, TANGENT, CURVES, MINRAD, GRADEBR
Friction / weather FRICTION, INTECHAG, AVEPRE, AVESNOW

load_example16_3_model_data() adds OFFSET, FC_ENCODED, FC_LABEL.


ExperimentBuilder API

from metacountregressor import ExperimentBuilder

builder = ExperimentBuilder(
    df=df,
    id_col='ID',           # required — observation identifier
    y_col='FREQ',          # required — outcome variable
    offset_col='OFFSET',   # optional — log-exposure offset (count models)
    group_id_col='FC',     # optional — group/panel identifier
)

Key methods

Method Purpose
builder.describe() Print data summary: N, outcome stats, variable types
builder.suggest_config(max_latent_classes=2) Print recommended ExperimentBuilder settings
builder.build_evaluator(...) Build a structure evaluator (see below)
builder.build_count_evaluator(...) Shortcut for count models
builder.run(evaluator, algo, max_iter, seed, ...) Run metaheuristic search
builder.run_search(evaluator, ...) Alias for run()
builder.make_manual_spec(...) Build a model spec dict manually
builder.fit_manual_model(manual_spec, model, R) Fit a manually specified structure
builder.compute_latent_class_probabilities(fit, true_class_col) Get class membership probabilities
ExperimentBuilder.get_family_capabilities() Static: list supported model families
ExperimentBuilder.get_search_argument_guide() Static: full argument documentation

build_evaluator arguments

evaluator = builder.build_evaluator(
    variables=['AADT', 'LENGTH', 'SPEED', 'CURVES'],   # candidate columns
    constraints=c,                                       # ModelConstraints object
    model_family='count',          # 'count' | 'cmf' | 'duration' | 'linear'
    default_roles=[0, 1, 2, 3, 5], # roles the search may assign
    max_latent_classes=2,          # 1 = standard, 2 = allow LC
    mode='single',                 # 'single' = minimise BIC
    R=200,                         # Halton simulation draws
    # CMF-only arguments:
    aadt_col='AADT',
    baseline_vars=['URB', 'ACCESS'],
    local_vars=['CURVES', 'WIDTH'],
    # Duration-only:
    budget_col='AADT',
)

ModelConstraints API

ModelConstraints restricts which roles and distributions each variable may take. All methods return self for chaining.

from metacountregressor import ModelConstraints

c = (
    ModelConstraints()
    .force_include('OFFSET')                          # cannot be excluded
    .force_fixed('AADT')                              # only fixed or excluded
    .no_zi('LENGTH', 'CURVES', 'SLOPE', 'WIDTH')      # cannot be ZI term
    .no_random('URB', 'GRADEBR')                      # no random parameter
    .allow_random('CURVES', distributions=['lognormal'])  # restrict distribution
    .membership_only('FC_ENCODED')                    # drives class prob only
    .allow_membership('SPEED')                        # may also enter membership
    .outcome_only('AADT')                             # no membership role
    .exclude('YEAR', 'ID')                            # removed from search
    .mutual_exclusion(['SPEED', 'SPEED_50'])          # never both in the model
    .set_roles('WIDTH', [0, 1, 2])                    # low-level override
)

print(c)           # display all constraints
c.summary()        # same as print(c)

mutual_exclusion prevents multicollinearity or redundancy by ensuring at most one variable per group is active. Pass multiple groups for multiple exclusivity rules:

c = ModelConstraints().mutual_exclusion(
    ['SPEED', 'SPEED_50'],        # speed definitions
    ['AADT', 'ADTLANE'],          # traffic volume measures
    ['TANGENT', 'CURVES'],        # alignment descriptors
)

Get detailed API documentation:

from metacountregressor import get_help
get_help('constraints')

Role codes

Code Name Description
0 Excluded Variable not in the model
1 Fixed Same coefficient for every observation
2 Random (ind.) Individual random effect, independent draws
3 Random (corr.) Individual random effect, correlated with others
4 Grouped Group-level random effect (shared within group)
5 Heterogeneity Explains variation in random-parameter means
6 Zero Inflation Enters the zero-inflation probability equation
7 Membership only Drives latent-class probability — not the outcome
8 Membership + Fixed Drives class membership AND has class-specific outcome effect

Random-parameter distributions: normal, lognormal, triangular, uniform.

get_help('roles')   # full reference with examples

Search algorithms

Alias Algorithm Best for
'sa' Simulated Annealing Robust default — escapes local minima via cooling schedule
'de' Differential Evolution Thorough population-based search — use when SA converges early
'hs' Harmony Search Fast initial convergence — good for a quick first pass
# Run the same evaluator with different algorithms
result_sa = builder.run(evaluator, algo='sa', max_iter=2000, seed=42)
result_de = builder.run(evaluator, algo='de', max_iter=2000, seed=42)
result_hs = builder.run(evaluator, algo='hs', max_iter=2000, seed=42)
get_help('metaheuristics')   # full parameter reference

Model families

Count models (Poisson / Negative Binomial)

evaluator = builder.build_count_evaluator(
    variables=['AADT', 'LENGTH', 'SPEED', 'CURVES', 'URB', 'AVEPRE'],
    constraints=c,
    default_roles=[0, 1, 2, 3, 5],
    max_latent_classes=1,
    R=200,
)
result = builder.run(evaluator, algo='sa', max_iter=2000, seed=42)
fit = builder.fit_manual_model(manual_spec=result.best_spec, model='nb', R=500)

Manual spec:

spec = builder.make_manual_spec(
    fixed_terms=['AADT', 'LENGTH', 'SPEED'],
    rdm_terms=['CURVES:normal'],
    rdm_cor_terms=['TANGENT:normal', 'SLOPE:lognormal'],
    hetro_in_means=['AVEPRE'],
    zi_terms=['ACCESS'],
    membership_terms=['URB'],
    dispersion=1,
    latent_classes=2,
)
fit = builder.fit_manual_model(manual_spec=spec, model='nb', R=200)

CMF models

from metacountregressor import CMFExperimentBuilder

cmf = CMFExperimentBuilder(
    df=df,
    y_col='FREQ',
    aadt_col='AADT',
    baseline_vars=['URB', 'ACCESS', 'GRADEBR', 'CURVES'],
    local_vars=['CURVES', 'WIDTH'],
)

# Route A: full JAX flexibility (random params, LC, ZI)
builder_jax, evaluator_jax, meta = cmf.build_jax_count_evaluator(
    id_col='ID', offset_col='OFFSET', constraints=c, max_latent_classes=1, R=200)
result = builder_jax.run(evaluator_jax, algo='sa', max_iter=500, seed=42)

# Route B: classic GA search (fast, two-component structure)
search = cmf.run_search(R=200)
fit = cmf.fit_best_model(search, final_R=500)
cmf.print_report(search, fit)
get_help('cmf')   # full workflow guide

Duration models

from metacountregressor import load_example_duration_data

duration_df = load_example_duration_data()
duration_builder = ExperimentBuilder(
    df=duration_df, id_col='ID', y_col='DURATION', group_id_col='FC')

evaluator = duration_builder.build_evaluator(
    variables=['WIDTH', 'CURVES', 'SLOPE', 'URB', 'FC_ENCODED'],
    model_family='duration',
    default_roles=[0, 1, 2, 3],
    max_latent_classes=1, R=200,
)
result = duration_builder.run(evaluator, algo='sa', max_iter=500, seed=42)
fit = duration_builder.fit_manual_model(manual_spec=result.best_spec,
                                        model='lognormal', R=500)

Linear models

from metacountregressor import load_example_platform_speed_data

speed_df = load_example_platform_speed_data()
speed_builder = ExperimentBuilder(
    df=speed_df, id_col='PLATFORM_ID', y_col='SPEED', offset_col=None)

evaluator = speed_builder.build_evaluator(
    variables=['DIST_TO_PLATFORM', 'POSTED_SPEED', 'APPROACH_ACCEL',
               'PLATFORM_HEIGHT', 'PLATFORM_WIDTH'],
    model_family='linear',
    default_roles=[0, 1, 2, 3],   # no ZI for linear
    max_latent_classes=1, R=200,
)
result = speed_builder.run(evaluator, algo='sa', max_iter=500, seed=42)
fit = speed_builder.fit_manual_model(manual_spec=result.best_spec,
                                     model='gaussian', R=500)

Latent class models

# 1. Constrain FC_ENCODED to drive class membership only
c = (
    ModelConstraints()
    .membership_only('FC_ENCODED')
    .force_include('OFFSET')
    .no_zi('LENGTH', 'CURVES', 'WIDTH', 'SLOPE')
    .no_random('URB', 'GRADEBR')
)

# 2. Build LC evaluator (max_latent_classes=2, include roles 7 & 8)
evaluator = builder.build_evaluator(
    variables=['URB', 'ACCESS', 'GRADEBR', 'CURVES', 'LENGTH',
               'SPEED', 'WIDTH', 'SLOPE', 'AVEPRE', 'FC_ENCODED'],
    constraints=c,
    default_roles=[0, 1, 2, 3, 5, 7, 8],
    max_latent_classes=2,
    R=150,
)

# 3. Run search
result = builder.run(evaluator, algo='sa', max_iter=500, seed=1)

# 4. Manually fit a specific structure
spec = builder.make_manual_spec(
    fixed_terms=['AADT', 'SPEED', 'LENGTH'],
    rdm_cor_terms=['CURVES:normal', 'SLOPE:normal'],
    hetro_in_means=['AVEPRE'],
    membership_terms=['URB', 'ACCESS', 'GRADEBR'],
    dispersion=1, latent_classes=2,
)
fit = builder.fit_manual_model(manual_spec=spec, model='nb', R=200)

# 5. Extract class membership probabilities
class_probs = builder.compute_latent_class_probabilities(
    fit, true_class_col='FC_ENCODED')
print(class_probs.head())

# 6. Compare predicted class vs actual FC
class_probs['predicted'] = (
    class_probs[['class_1_prob', 'class_2_prob']].to_numpy().argmax(axis=1))
agreement = (class_probs['predicted'] == class_probs['FC_ENCODED']).mean()
print(f'Agreement with FC: {agreement:.1%}')

Pre-specified reference model:

from metacountregressor import (
    load_book_latent_class_spec, describe_book_latent_class_spec)

describe_book_latent_class_spec()
spec = load_book_latent_class_spec()
fit = builder.fit_manual_model(manual_spec=spec, model='nb', R=200)
get_help('latent_class')   # full workflow guide

Output and saving results

from metacountregressor import SearchOutputConfig

output_config = SearchOutputConfig(
    output_dir='results',
    experiment_name='example16_3_count',
    search_description='NB count model search on Example 16-3',
    save_json=True,
)

result = builder.run(evaluator, algo='sa', max_iter=2000,
                     output_config=output_config)
print('Saved to:', result.saved_to)

Each saved JSON contains: experiment name, description, model family, algorithm, best BIC, and the best structural specification.

Collect results from multiple runs:

import json, pathlib

results = sorted(
    [json.load(open(f)) for f in pathlib.Path('results').glob('*.json')],
    key=lambda r: r.get('best_score', float('inf'))
)
print('Best BIC:', results[0]['best_score'])
print('Algorithm:', results[0]['algorithm'])

Help system

The package includes a built-in interactive help system:

from metacountregressor import get_help

get_help()                    # list all topics
get_help('roles')             # role code table + distributions
get_help('constraints')       # ModelConstraints API
get_help('metaheuristics')    # algorithm comparison and parameters
get_help('crash_frequency')   # count model workflow
get_help('latent_class')      # latent class workflow
get_help('cmf')               # CMF workflow
get_help('linear')            # linear model workflow
get_help('duration')          # duration model workflow
get_help('batch')             # batch script and HPC guide

Running on HPC clusters

Automatic walltime detection

On PBS/Torque or SLURM, the package reads the scheduler walltime automatically and uses it as a max_time limit — the search stops cleanly before the job is killed.

Scheduler Environment variable Format
PBS/Torque PBS_WALLTIME HH:MM:SS
SLURM SLURM_TIME_LIMIT seconds or HH:MM:SS

Set manually for local testing:

result = builder.run(evaluator, algo='sa', max_iter=99999, max_time=3600)

PBS job script

#!/bin/bash
#PBS -N metacount_sa
#PBS -l nodes=1:ppn=4
#PBS -l walltime=04:00:00
#PBS -l mem=16gb
#PBS -j oe
#PBS -o logs/sa_seed42.log

module load python/3.11
cd $PBS_O_WORKDIR
source venv/bin/activate

# Walltime auto-detected from PBS_WALLTIME
python run_experiment.py sa 42 200 99999

SLURM job array

#!/bin/bash
#SBATCH --job-name=metacount
#SBATCH --nodes=1
#SBATCH --ntasks=4
#SBATCH --time=04:00:00
#SBATCH --mem=16G
#SBATCH --output=logs/%j.log
#SBATCH --array=1-10

module load python/3.11
source venv/bin/activate

python run_experiment.py sa $SLURM_ARRAY_TASK_ID 200 99999

See 05_batch_script_tutorial.ipynb for a complete worked example including a reusable run_experiment.py template and result-collection scripts.

get_help('batch')   # inline guide

Getting help

If you use metacountregressor in research, please cite the package:

@software{metacountregressor,
  author  = {Ahern, Zeke and Corry, Paul and Paz, Alexander},
  title   = {metacountregressor: JAX-first hierarchical search and fitting
             for count, CMF, duration, and linear models},
  url     = {https://github.com/zahern/MetaCount},
}

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

metacountregressor-1.0.145.tar.gz (6.5 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

metacountregressor-1.0.145-py3-none-any.whl (7.4 MB view details)

Uploaded Python 3

File details

Details for the file metacountregressor-1.0.145.tar.gz.

File metadata

  • Download URL: metacountregressor-1.0.145.tar.gz
  • Upload date:
  • Size: 6.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for metacountregressor-1.0.145.tar.gz
Algorithm Hash digest
SHA256 f8fb9ed45a9734ebfe8b48cbebcaf87d0b573c2c902966635450ff62bc23e838
MD5 8ac88b897911a8cba07ea02aaa0af588
BLAKE2b-256 ef58324458a5a74fe2e3bb52302555d982dad592688853c3b7ebca2d8a2c464b

See more details on using hashes here.

File details

Details for the file metacountregressor-1.0.145-py3-none-any.whl.

File metadata

File hashes

Hashes for metacountregressor-1.0.145-py3-none-any.whl
Algorithm Hash digest
SHA256 9e88f79a8dfcccda1a2f5dde1bf3042ed3ad5d2d1467ec97e771118ed1902970
MD5 0d53dbdf25b2e0e4c7cdf14c8e3d20dc
BLAKE2b-256 5d32c7baf06d9b68514fb0a44020fc8ba62b2f9ac552eda5c2e34641c5bf039e

See more details on using hashes here.

Release history Release notifications | RSS feed

1.0.148

2 files

1.0.147

2 files

1.0.146

2 files

This release

1.0.145 This release

2 files

1.0.144

2 files

1.0.143

2 files

1.0.142

2 files

1.0.140

2 files

1.0.139

2 files

1.0.138

2 files

1.0.137

2 files

1.0.136

2 files

1.0.135

2 files

1.0.134

2 files

1.0.132

2 files

1.0.131

2 files

1.0.128

2 files

1.0.127

2 files

1.0.126

2 files

1.0.125

2 files

1.0.124

2 files

1.0.123

2 files

1.0.122

2 files

1.0.121

2 files

1.0.120

2 files

1.0.119

2 files

1.0.118

2 files

1.0.117

2 files

1.0.116

2 files

1.0.115

2 files

1.0.114

2 files

1.0.113

2 files

1.0.112

2 files

1.0.111

2 files

1.0.110

2 files

1.0.109

2 files

1.0.108

2 files

1.0.107

2 files

1.0.106

2 files

1.0.105

2 files

1.0.104

2 files

1.0.103

2 files

1.0.102

2 files

1.0.101

2 files

1.0.100

2 files

1.0.99

2 files

1.0.98

2 files

1.0.97

2 files

1.0.96

2 files

1.0.95

2 files

1.0.94

2 files

1.0.93

2 files

1.0.92

2 files

1.0.91

2 files

1.0.90

2 files

1.0.89

2 files

1.0.88

2 files

1.0.87

2 files

1.0.86

2 files

1.0.85

2 files

1.0.84

2 files

1.0.83

2 files

1.0.82

2 files

1.0.81

2 files

1.0.80

2 files

1.0.79

2 files

1.0.78

2 files

1.0.77

2 files

1.0.76

2 files

1.0.75

2 files

1.0.74

2 files

1.0.73

2 files

1.0.72

2 files

1.0.71

2 files

1.0.70

2 files

1.0.69

2 files

1.0.68

2 files

1.0.67

2 files

1.0.66

2 files

1.0.65

2 files

1.0.64

2 files

1.0.63

2 files

1.0.62

2 files

1.0.61

2 files

1.0.60

2 files

1.0.59

2 files

1.0.58

2 files

1.0.57

2 files

1.0.56

2 files

1.0.55

2 files

1.0.54

2 files

1.0.53

2 files

1.0.52

2 files

1.0.51

2 files

1.0.50

2 files

1.0.49

2 files

1.0.48

2 files

1.0.47

2 files

1.0.46

2 files

1.0.45

2 files

1.0.44

2 files

1.0.43

2 files

1.0.42

2 files

1.0.41

2 files

1.0.40

2 files

1.0.39

2 files

1.0.38

2 files

1.0.37

2 files

1.0.36

2 files

1.0.35

2 files

1.0.34

2 files

1.0.33

2 files

1.0.32

2 files

1.0.31

2 files

1.0.30

2 files

1.0.29

2 files

1.0.28

2 files

1.0.27

2 files

1.0.26

2 files

1.0.25

2 files

1.0.24

2 files

1.0.23

2 files

1.0.22

2 files

1.0.21

2 files

1.0.20

2 files

1.0.19

1 file

1.0.18

1 file

1.0.17

1 file

1.0.16

1 file

1.0.15

2 files

1.0.13

1 file

1.0.12

1 file

1.0.11

2 files

1.0.10

2 files

1.0.9

2 files

1.0.8

2 files

1.0.7

2 files

1.0.6

2 files

1.0.5

2 files

1.0.4

2 files

1.0.3

1 file

1.0.2

1 file

0.1.350

1 file

0.1.349

1 file

0.1.348

2 files

0.1.347

1 file

0.1.346

1 file

0.1.344

1 file

0.1.342

2 files

0.1.341

1 file

0.1.340

2 files

0.1.339

1 file

0.1.338

2 files

0.1.336

2 files

0.1.335

1 file

0.1.334

2 files

0.1.333

1 file

0.1.332

1 file

0.1.325

1 file

0.1.324

1 file

0.1.323

1 file

0.1.322

2 files

0.1.320

2 files

0.1.319

1 file

0.1.318

2 files

0.1.317

2 files

0.1.316

2 files

0.1.315

2 files

0.1.314

2 files

0.1.313

2 files

0.1.312

2 files

0.1.311

2 files

0.1.310

2 files

0.1.309

2 files

0.1.308

2 files

0.1.307

2 files

0.1.306

2 files

0.1.305

2 files

0.1.304

2 files

0.1.303

1 file

0.1.302

1 file

0.1.243

1 file

0.1.241

2 files

0.1.239

2 files

0.1.238

1 file

0.1.237

2 files

0.1.236

2 files

0.1.235

2 files

0.1.234

1 file

0.1.233

2 files

0.1.232

1 file

0.1.231

2 files

0.1.230

2 files

0.1.229

2 files

0.1.228

1 file

0.1.227

1 file

0.1.215

1 file

0.1.214

1 file

0.1.213

2 files

0.1.212

2 files

0.1.211

2 files

0.1.210

1 file

0.1.209

2 files

0.1.208

1 file

0.1.207

2 files

0.1.206

2 files

0.1.205

2 files

0.1.204

2 files

0.1.203

1 file

0.1.202

1 file

0.1.178

1 file

0.1.177

1 file

0.1.176

1 file

0.1.175

1 file

0.1.170

1 file

0.1.169

1 file

0.1.168

1 file

0.1.167

2 files

0.1.166

1 file

0.1.165

2 files

0.1.164

2 files

0.1.163

2 files

0.1.162

2 files

0.1.161

2 files

0.1.160

1 file

0.1.159

2 files

0.1.158

1 file

0.1.157

2 files

0.1.156

2 files

0.1.155

2 files

0.1.154

1 file

0.1.153

1 file

0.1.152

1 file

0.1.151

1 file

0.1.150

2 files

0.1.149

2 files

0.1.148

2 files

0.1.147

2 files

0.1.146

2 files

0.1.145

2 files

0.1.144

2 files

0.1.143

2 files

0.1.142

2 files

0.1.141

2 files

0.1.140

2 files

0.1.139

2 files

0.1.138

2 files

0.1.137

1 file

0.1.136

2 files

0.1.135

1 file

0.1.134

2 files

0.1.133

1 file

0.1.132

2 files

0.1.131

1 file

0.1.130

2 files

0.1.129

2 files

0.1.128

2 files

0.1.127

2 files

0.1.126

1 file

0.1.125

2 files

0.1.124

1 file

0.1.123

2 files

0.1.122

2 files

0.1.121

2 files

0.1.120

2 files

0.1.119

2 files

0.1.118

2 files

0.1.117

2 files

0.1.116

2 files

0.1.115

1 file

0.1.114

1 file

0.1.113

1 file

0.1.111

1 file

0.1.108

1 file

0.1.107

1 file

0.1.106

1 file

0.1.103

2 files

0.1.101

1 file

0.1.98

1 file

0.1.97

1 file

0.1.96

1 file

0.1.95

1 file

0.1.93

1 file

0.1.91

1 file

0.1.89

1 file

0.1.88

1 file

0.1.87

2 files

0.1.86

1 file

0.1.85

1 file

0.1.84

1 file

0.1.83

1 file

0.1.82

1 file

0.1.81

1 file

0.1.78

1 file

0.1.76

1 file

0.1.73

1 file

0.1.71

1 file

0.1.69

1 file

0.1.67

1 file

0.1.65

2 files

0.1.64

2 files

0.1.63

2 files

0.1.62

1 file

0.1.61

1 file

0.1.60

1 file

0.1.59

1 file

0.1.58

1 file

0.1.57

1 file

0.1.56

1 file

0.1.55

1 file

0.1.54

1 file

0.1.53

1 file

0.1.52

1 file

0.1.51

1 file

0.1.50

1 file

0.1.49

1 file

0.1.48

1 file

0.1.47

1 file

0.1.46

1 file

0.1.45

1 file

0.1.44

1 file

0.1.43

1 file

0.1.42

1 file

0.1.41

1 file

0.1.40

1 file

0.1.39

1 file

0.1.38

1 file

0.1.37

1 file

0.1.36

1 file

0.1.35

1 file

0.1.34

1 file

0.1.33

1 file

0.1.32

1 file

0.1.31

1 file

0.1.30

1 file

0.1.29

1 file

0.1.28

1 file

0.1.27

1 file

0.1.26

1 file

0.1.25

1 file

0.1.24

1 file

0.1.23

1 file

0.1.22

1 file

0.1.21

1 file

0.1.20

1 file

0.1.19

1 file

0.1.18

1 file

0.1.17

1 file

0.1.16

1 file

0.1.15

1 file

0.1.14

1 file

0.1.13

1 file

0.1.12

1 file

0.1.11

1 file

0.1.10

1 file

0.1.9

1 file

0.1.8

1 file

0.1.7

1 file

0.1.6

1 file

0.1.5

1 file

0.1.4

1 file

0.1.3

1 file

0.1.2

1 file

0.1.1

1 file

0.1.0

1 file

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