A composable app infrastructure for scientific computing
Project description
scinexus
A composable app infrastructure for scientific computing. What dataclasses are for structured data, scinexus apps are for structured algorithms.
Many scientific problems require repeating calculations across many files or database records. Such tasks suit data-level parallelism, but writing robust, maintainable code for them is often tedious and quickly becomes complex.
As the Unix philosophy articulates, writing algorithms that do one thing well and can be composed together through piping data of known type is a Very Good Thing™.
scinexus encourages this design pattern. We leverage the Python type annotation system to govern the compatibility (composability) of different applications. This enables in-process composition of your applications with validation of the consistency of the pipeline and the consistency of the data being run through it.
scinexus is designed for scientific reproducibility. Scientific computations should record all conditions needed to reproduce an analysis. scinexus reduces the effort by intercepting all arguments (including defaults) used in app construction and logging the resulting app state.
Examples
Developers can choose inheriting from a base class or use the scinexus.define_app decorator to make composable apps. The following examples show simple composition
Loading files so missing data does not cause a crash
from scinexus import define_app
@define_app(app_type="loader")
def read_json(path: str) -> dict:
import json
with open(path) as f:
return json.load(f)
@define_app
def validate(data: dict, required_field: str) -> dict:
if required_field not in data:
raise ValueError(f"missing {required_field!r} field") # becomes NotCompleted, doesn't crash
return data
app = read_json() + validate(required_field="name")
You can apply app to a single file path as app(filepath), or operate in parallel (and show a progress bar) on a sequence of file paths as
results = list(app.as_completed(["some_file_path.json", "some_other_file_path.json"], parallel=True, show_progress=True)
A contrived numerical example
from scinexus import define_app
@define_app
def normalise(values: list[float]) -> list[float]:
lo, hi = min(values), max(values)
return [(v - lo) / (hi - lo) for v in values]
@define_app
def threshold(values: list[float]) -> list[bool]:
return [v > 0.5 for v in values]
app = normalise() + threshold()
app([1.0, 5.0, 3.0, 9.0])
A configurable app
from scinexus import define_app
@define_app(app_type="loader")
def load_csv(path: str) -> list[dict]:
import csv
with open(path) as f:
return list(csv.DictReader(f))
@define_app
class summarise:
def __init__(self, column: str) -> None:
"""column contains the values to produce summary stats for"""
self.column = column
def main(self, rows: list[dict]) -> dict[str, float]:
vals = [float(r[self.column]) for r in rows]
return {"mean": sum(vals) / len(vals), "min": min(vals), "max": max(vals)}
app = load_csv() + summarise(column="price")
Features
- Type checking at composition time
- Durable computing -- failures recorded as
NotCompletedrecords, not exceptions - Data-level parallel execution via
lokyor MPI - Progress bars (
tqdmorrich) - Automated logging and citation tracking
- Checkpointing via data stores (directory, SQLite)
Installation
pip install scinexus
History
The app framework and utility functions in scinexus incubated inside cogent3 from March 2019, accumulating over five years of development, testing, and real-world use in computational genomics before being extracted into a standalone package. The design is mature and has underpinned analyses in published studies.
The extraction into scinexus makes the infrastructure available to any scientific Python project, free of the cogent3 dependency.
We acknowledge here that many members of the cogent3 community contributed to the code that now lives here, including @rmcar17, @Nick-Foto, @KatherineCaley, @fredjaya, and @khiron.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file scinexus-2026.4.17a0.tar.gz.
File metadata
- Download URL: scinexus-2026.4.17a0.tar.gz
- Upload date:
- Size: 249.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
13e0448fd4edfcac9d25d443e92a96315ebd1b7ae55c2e7f146495804a503c1e
|
|
| MD5 |
8e28b1dd8b248e13140f674c104f8f0b
|
|
| BLAKE2b-256 |
09ab6f7b1a2ce26e7cbb88a7051f91d99962cffebc637cf4afb3f1c287058dda
|
Provenance
The following attestation bundles were made for scinexus-2026.4.17a0.tar.gz:
Publisher:
release.yml on cogent3/scinexus
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
scinexus-2026.4.17a0.tar.gz -
Subject digest:
13e0448fd4edfcac9d25d443e92a96315ebd1b7ae55c2e7f146495804a503c1e - Sigstore transparency entry: 1323214153
- Sigstore integration time:
-
Permalink:
cogent3/scinexus@d80de1f59e50d06c5f619d8683926bcc235bfef8 -
Branch / Tag:
refs/tags/2026.4.17a0 - Owner: https://github.com/cogent3
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d80de1f59e50d06c5f619d8683926bcc235bfef8 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file scinexus-2026.4.17a0-py3-none-any.whl.
File metadata
- Download URL: scinexus-2026.4.17a0-py3-none-any.whl
- Upload date:
- Size: 50.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0209214ff5555f264e767c64c89c7d259774380a90e0722c27ac29d77ddcfb71
|
|
| MD5 |
9281cf8d6835d9f819013458e721a2e3
|
|
| BLAKE2b-256 |
b9ae0b928a76109a683ecad3df5951bbdfe92cf39f1235b756cfc4b2c23e4530
|
Provenance
The following attestation bundles were made for scinexus-2026.4.17a0-py3-none-any.whl:
Publisher:
release.yml on cogent3/scinexus
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
scinexus-2026.4.17a0-py3-none-any.whl -
Subject digest:
0209214ff5555f264e767c64c89c7d259774380a90e0722c27ac29d77ddcfb71 - Sigstore transparency entry: 1323214273
- Sigstore integration time:
-
Permalink:
cogent3/scinexus@d80de1f59e50d06c5f619d8683926bcc235bfef8 -
Branch / Tag:
refs/tags/2026.4.17a0 - Owner: https://github.com/cogent3
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d80de1f59e50d06c5f619d8683926bcc235bfef8 -
Trigger Event:
workflow_dispatch
-
Statement type: