Skip to main content

voiage: Value of Information Analysis

PyPI Python CI Coverage CodeQL OpenSSF Scorecard Documentation License

voiage provides Value of Information (VOI) methods for comparing decisions under uncertainty and assessing whether additional evidence may be worth collecting. The v2.0 release combines:

  • a Python API and command-line interface (CLI);
  • binding-independent Rust domain, diagnostics, numerical, and serialization crates;
  • selected Rust-backed aggregation kernels exposed to Python through PyO3;
  • an R package and Julia package that call the versioned Rust C application binary interface (ABI) for Expected Value of Perfect Information (EVPI);
  • labelled data structures, diagnostics, plotting, reporting, and provenance-aware interchange.

Python currently retains the broader model orchestration, validation, labelled data, plotting, and reporting paths. The R and Julia packages do not yet expose the full Python method surface. See Architecture and Language support for the precise boundary.

When voiage is useful

VOI analysis asks whether uncertainty could change a decision and whether the expected benefit of resolving some uncertainty justifies further research. voiage supports analyses including:

  • EVPI for the expected cost of current decision uncertainty;
  • Expected Value of Partial Perfect Information (EVPPI) for selected parameters;
  • Expected Value of Sample Information (EVSI) and Expected Net Benefit of Sampling (ENBS) for proposed studies;
  • cost-effectiveness acceptability and frontier analysis;
  • structural, network meta-analysis, subgroup, sequential, adaptive, and portfolio-oriented VOI workflows;
  • fixture-backed experimental work on perspective, equity, implementation, expected-utility information pricing, and adjacent VOI questions.

Stable and experimental surfaces are distinguished in the method documentation and frontier roadmap. An implemented method is not, by itself, evidence that it is appropriate for a particular decision problem; users remain responsible for model structure, inputs, assumptions, and interpretation.

Installation

Install the released Python package:

python -m pip install voiage

Python 3.12, 3.13, and 3.14 are supported. Wheels use the CPython 3.12 stable ABI and are published for the platforms listed in the v2.1.0 release.

The current source tree prepares v2.2.0; its publication and review submissions remain pending the release gates.

Optional features are installed explicitly:

python -m pip install "voiage[plotting]"       # Matplotlib and Seaborn
python -m pip install "voiage[jax]"            # experimental JAX backend
python -m pip install "voiage[experimental]"   # experimental serializers

Development installation and complete verification instructions are in CONTRIBUTING.md.

Quick start

import numpy as np

from voiage.analysis import DecisionAnalysis
from voiage.schema import ValueArray

net_benefit = ValueArray.from_numpy(
    np.array(
        [
            [10.0, 12.0],
            [11.0, 9.0],
            [13.0, 14.0],
        ]
    ),
    strategy_names=["Standard care", "New treatment"],
)

analysis = DecisionAnalysis(net_benefit)
print(f"EVPI: {analysis.evpi():.3f}")

The rows are uncertainty draws and the columns are decision strategies. For real analyses, preserve the units, population scaling, time horizon, discount rate, and strategy labels needed to interpret the result.

Command-line interface

The CLI supports batch workflows over CSV inputs:

voiage calculate-evpi examples/cli_samples/evpi_net_benefit.csv

voiage calculate-evpi examples/cli_samples/evpi_net_benefit.csv \
  --population 100000 \
  --time-horizon 10 \
  --discount-rate 0.03 \
  --output evpi-result.txt

voiage calculate-evppi \
  examples/cli_samples/evpi_net_benefit.csv \
  examples/cli_samples/evppi_parameters.csv

voiage --help

See the CLI reference for input schemas, output formats, logging controls, and additional commands.

Standardized dataset ingestion

voiage can also safely normalize conservative local profiles of Croissant ML 1.1 and Frictionless Data Package CSV descriptors before calculation. Source format parsers remain separate from the calculation runtime: each produces an Arrow-backed NormalizedInputBundle, and callers supply an explicit VOI binding. Use voiage ingest validate, voiage ingest inspect, and voiage ingest normalize for a descriptor workflow; remote URLs, archives, implicit column inference, and unsafe paths are rejected. See the standardized-ingestion guide for the supported-profile matrix, offline replay policy, and ML, engineering, and business examples.

Capability status

Capability Status Scope
EVPI, EVPPI, ENBS Stable Python API and CLI with Rust-owned numerical policy
EVSI Method-specific The analytical two-arm normal path is stable; the developing two-loop path uses one coherent fitted Gaussian prior or explicit custom sampling and joint-posterior callbacks; compatibility estimators without a complete validated study-model contract are non-stable
Acceptability, frontier, dominance, heterogeneity Stable Analysis and plotting helpers
Structural and network meta-analysis VOI Stable Python method surface
Adaptive, calibration, observational, sequential VOI Stable Python study-design workflows
Portfolio VOI Stable Budget-constrained portfolio analysis
COSS and EVSI/EVPI study efficiency Experimental Rust-owned finite-design kernels with Python contracts, CLI/reporting, accessible plotting, and an exact constrained portfolio slice; no stable or full-polyglot claim
Diagnostics and data interchange Stable Versioned contracts; Arrow/Parquet is the canonical tabular interchange
R and Julia EVPI Released binding source Direct versioned Rust interface; both require the separately supplied voiage-ffi library
Broader R and Julia method parity Partial Advanced R paths retain the documented Python bridge; Julia is EVPI-focused
Perspective and frontier extensions Experimental Fixture-backed contracts; not represented as stable
Expected-utility information pricing and VoC Experimental Rust/Python EUI, CEI, BPI, SPI, and anchored PPI; VoC is presentation-only and the EVPI alias requires positive-affine utility; R/Julia are unsupported and Mojo is an external boundary
Mojo binding Not released No publishable Mojo package is claimed
FPGA and ASIC execution Evidence only Simulation and pre-silicon evidence do not establish production hardware support

Architecture

The repository is moving towards a binding-independent Rust core, but v2.0 is still a hybrid implementation:

Python API / CLI / orchestration / labelled data / plots / reports
                              |
                         PyO3 adapter
                              |
Rust domain + diagnostics + selected numerical kernels + serialization
                              |
                    versioned C ABI adapter
                         /             \
                  R package        Julia package

The publishable Rust workspace crates live under rust/crates/:

  • voiage-domain: validated binding-independent domain contracts;
  • voiage-diagnostics: structured diagnostics and error contracts;
  • voiage-numerics: binding-independent numerical kernels;
  • voiage-serialization: canonical serialization adapters.

The voiage-ffi, voiage-python, and voiage-test-support crates are private adapters or test infrastructure. Python remains responsible for wider method orchestration and user-facing analytical features not yet migrated to Rust. The polyglot release documentation records the supported boundary and migration policy.

Language support

Surface Source Current use Distribution status
Python voiage/ Primary API, CLI, orchestration, plots, reports PyPI v2.1.0 and TestPyPI; v2.2.0 source candidate
Rust rust/ Domain contracts, diagnostics, selected kernels, serialization Crates are package-ready; consult the release checklist for verified registry state
R r-package/voiageR/ Direct C-ABI EVPI; documented bridge for wider Python methods r-universe; CRAN review remains external
Julia bindings/julia/ Direct C-ABI EVPI Prepared for Julia General; registry entry is not yet verified

Registry readiness and actual registry publication are reported separately. The binding submission checklist is the maintained evidence record for conda-forge, CRAN, Julia General, crates.io, and other external channels.

Documentation and examples

Example plots generated by the maintained documentation fixtures:

Acceptability curve EVSI and ENBS EVPI by threshold
Cost-effectiveness acceptability curve EVSI and ENBS by sample size EVPI by willingness-to-pay threshold

Quality, testing, and security

The repository applies different forms of evidence to different failure modes:

Area Repository controls
Style and prose Ruff formatting/linting, Vale, ChkTeX, LaCheck
Static analysis ty, BasedPyright, Bandit, Vulture, Clippy, CodeQL
Unit and contract testing Pytest and Cargo tests across APIs, schemas, versions, provenance, and registries
Integration and end-to-end testing CLI, package, clean-install, workflow, FFI, and cross-language paths
Generative testing Hypothesis, proptest, metamorphic, differential, and parity checks
Mutation testing Ratcheted Python mutation cohorts and critical-kernel policy
Coverage Branch coverage, changed-line policy, critical-module checks, Codecov, and a 90% Python threshold
Rust-specific assurance MSRV, Clippy, Miri, fuzzing, sanitizer jobs, advisory and license policy
Supply chain Pinned Actions, Dependency Review, OpenSSF Scorecard, Zizmor, SBOMs, checksums, provenance attestations, and release signatures
Platform assurance Linux, macOS, Windows, UTF-8/LF, Python 3.12–3.14, minimum and maximum dependencies
Documentation and papers Astro/Starlight builds, link/semantic checks, arXiv source and PDF audits, deterministic readability evidence

Renovate manages Python/uv, Cargo, npm, and GitHub Actions updates. Dependabot version-update configuration is intentionally absent so the repository has one dependency-update bot and does not create duplicate pull requests. Full commands and control boundaries are in the quality and security guide and SECURITY.md.

Releases, citation, and archival

The canonical preprint source is paper/main.tex. Repository automation builds, lints, audits, and packages the non-submitting arXiv source. Permanent arXiv announcement and identifier assignment remain an author-controlled external gate. The separate paper.md adaptation passes repository-owned JOSS preflight; no JOSS submission, review, or acceptance is claimed.

Project status and roadmap

The repository-owned v1 programme is implemented and archived. That does not mean every proposed extension or external publication is complete. Current boundaries include:

  • migration of wider Python orchestration into the Rust core;
  • broader native R and Julia API parity;
  • experimental frontier-method validation and promotion;
  • external registry review or indexing where not yet evidenced;
  • SciCrunch registration was submitted on 27 July 2026 after a no-match duplicate check and account confirmation; curation and RRID assignment remain external, alongside later arXiv/JOSS author-led submissions;
  • physical FPGA or fabricated-silicon evidence.

See roadmap.md, todo.md, and the Conductor registry for evidence-backed status.

Contributing and support

This is currently a solo-maintainer repository. Pull requests remain the auditable change boundary, with automated quality and security checks required but no independent approval requirement. See:

Use GitHub Issues for reproducible bugs and feature requests, and GitHub Discussions for design or usage questions.

License

voiage is licensed under the Apache License 2.0.

Download files

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

Source Distribution

voiage-2.2.0.tar.gz (931.0 kB view details)

Uploaded Source

Built Distributions

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

voiage-2.2.0-cp312-abi3-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.12+Windows x86-64

voiage-2.2.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.17+ x86-64

voiage-2.2.0-cp312-abi3-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.12+macOS 11.0+ ARM64

File details

Details for the file voiage-2.2.0.tar.gz.

File metadata

  • Download URL: voiage-2.2.0.tar.gz
  • Upload date:
  • Size: 931.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for voiage-2.2.0.tar.gz
Algorithm Hash digest
SHA256 e4edfd41011891a94cbc2b144ff1d20340fcc32481e7a2b24157494b7490a16b
MD5 172c10a8ecdd1e6508a67c3319b2ea71
BLAKE2b-256 ac85697bbefd2f9e78b28fba8a8b981217e8dafe7f0b28ec6ee233960cca9896

See more details on using hashes here.

Provenance

The following attestation bundles were made for voiage-2.2.0.tar.gz:

Publisher: release.yml on edithatogo/voiage

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file voiage-2.2.0-cp312-abi3-win_amd64.whl.

File metadata

  • Download URL: voiage-2.2.0-cp312-abi3-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.12+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for voiage-2.2.0-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 97f23021683ce7c4010e6d7aa6ff7f02b758db09f18da6582bd2ac0e4719a9d2
MD5 0fcdfc431d8f8fd40db753f23c566c77
BLAKE2b-256 0fd0d6c1da59ccc190cadd984ad6b270bc6f430e766d6164186325584effa464

See more details on using hashes here.

Provenance

The following attestation bundles were made for voiage-2.2.0-cp312-abi3-win_amd64.whl:

Publisher: release.yml on edithatogo/voiage

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file voiage-2.2.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for voiage-2.2.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8eb3ba00ec24efcc2f8213141a0343456f28a4cfa8ae25ca9d5d19ad4effe119
MD5 bdc79c983c9afbb9cd2f2c4a5ee2eaee
BLAKE2b-256 ab0183dad965fe279e606f35fddbcdf415ed950e1623b8dab749b3bcf4ccd7ca

See more details on using hashes here.

Provenance

The following attestation bundles were made for voiage-2.2.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on edithatogo/voiage

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file voiage-2.2.0-cp312-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for voiage-2.2.0-cp312-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c7c26afe72de58c02a49f0b734fa0f69adf4c8c073a59b71ea888feaa77e1056
MD5 cb0e160e681be5ee44b094570c72b8b5
BLAKE2b-256 e4820bde57f7859fb7dbf3c343d26496b38cb1d3c63d15778f1454cbcd1779aa

See more details on using hashes here.

Provenance

The following attestation bundles were made for voiage-2.2.0-cp312-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on edithatogo/voiage

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

2.2.0 This release

4 files

2.1.0

4 files

2.0.1

4 files

2.0.0

4 files

1.0.0

4 files

0.2.1

2 files

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