This release is a pre-release and may not be stable for production use.
Eqiora
Eqiora is a typed mathematical modeling and execution system backed by one canonical Rust implementation. Its Python SDK provides immutable native declarations, synchronous and awaitable execution, explicit NumPy/DLPack ownership, and bounded first-order PyTorch and JAX adapters without reimplementing model meaning in Python.
Alpha —
0.1.0a1. The supported boundary is intentionally narrow. Consult the capability matrix before relying on a method, backend, or platform.
Install
Eqiora 0.1.0a1 supports ordinary-GIL CPython 3.11–3.14 on
manylinux x86-64:
python -m pip install eqiora==0.1.0a1
Optional first-order framework adapters are explicit:
python -m pip install "eqiora[torch]==0.1.0a1"
python -m pip install "eqiora[jax]==0.1.0a1"
The base package imports neither PyTorch nor JAX. The PyTorch extra declares
torch>=2.13,<2.14; this release verifies exactly PyTorch 2.13.0. It also
verifies the exact JAX/JAXLIB 0.11.0 pair on CPython 3.13. The JAX extra
requires Python 3.12 or newer.
Five-minute model and run
Build a decay relation from frozen native declarations and execute it through the shared native lifecycle:
import eqiora
state = eqiora.Field("state", initial=1.0)
rate = eqiora.Parameter(
"rate",
value=1.0,
dimension=eqiora.Dimension(time=-1),
)
decay = eqiora.Relation(
"decay",
residual=eqiora.derivative(state) + rate * state,
)
model = eqiora.Model.define("decay", state, rate, decay)
result = eqiora.run(model, end_time=1.0, max_step=0.01)
time = result["state"].time.numpy(copy=False)
values = result["state"].values.numpy(copy=False)
print(eqiora.__version__)
print(model.digest)
print(time[-1], values[-1])
Field, Parameter, Relation, and Model are immutable handles over
Rust-owned meaning. A relation declares a residual equal to zero; validation,
typed lowering, atomic commit, execution, and artifact identity remain in
Rust. Spatial authoring and the bounded FEM/FVM realization path are described
in Modeling and realization.
Structured diagnostics
Failures expose stable categories and structured diagnostics:
try:
eqiora.run(model, end_time=-1.0, max_step=0.01)
except eqiora.EqioraError as error:
print(error.category)
for diagnostic in error.diagnostics:
print(diagnostic.code, diagnostic.severity, diagnostic.message)
Validation, compatibility, capability, execution, cancellation, and internal
failures have distinct subclasses. Ordinary Python call-shape errors remain
TypeError.
NumPy ownership and copies
Eqiora Array values own dense, rank-one CPU float64 storage:
array = result["state"].values
view = array.numpy(copy=False)
writable = array.numpy(copy=True)
assert not view.flags.writeable
assert writable.flags.writeable
copy=False and copy=None return the same lifetime-safe, read-only NumPy
projection. If that contract cannot be honored, Eqiora fails instead of
copying silently. copy=True returns an independent writable allocation.
DLPack exports are fresh versioned CPU snapshots, not aliases of immutable
result evidence. The complete contract is in
Execution, diagnostics, and arrays.
Await, progress, and cancellation
run(...), submit(...).result(), and await submit(...) share one native
state machine and one materialized result:
async def simulate(model):
run = eqiora.submit(model, end_time=10.0, max_step=0.001)
try:
print(run.status, run.progress)
return await run
finally:
if not run.done:
run.cancel()
Cancelling the surrounding asyncio task or dropping a Run does not
implicitly cancel native work. Call run.cancel() explicitly. Cancellation
is cooperative at accepted execution boundaries and never publishes a
partial result.
PyTorch and JAX
Both optional adapters consume the same accepted, opaque
DifferentiableProgram. They do not define a second model. This complete
example constructs the spatial model and its matching realization before
compiling the differentiable program:
import numpy as np
model = eqiora.compile(
"""
model differentiated_poisson {
domain square = box(0, 1, 0, 1);
domain x_lower = boundary(square, axis = 0, side = lower);
domain x_upper = boundary(square, axis = 0, side = upper);
domain y_lower = boundary(square, axis = 1, side = lower);
domain y_upper = boundary(square, axis = 1, side = upper);
representation scalar_space = continuum;
field potential on square as scalar_space: 1 = 0;
parameter diffusion: 1 = 1;
parameter wave_number: 1 / m = 3.141592653589793;
parameter source_scale: 1 / m ^ 2 = 19.739208802178716;
parameter boundary_offset: 1 = 0;
relation balance continuous on square {
-div(diffusion * grad(potential))
- source_scale * sin(wave_number * coordinate(0))
* sin(wave_number * coordinate(1)) = 0;
}
relation x_lower_value continuous on x_lower {
trace(potential) - boundary_offset = 0;
}
relation x_upper_value continuous on x_upper {
trace(potential) - boundary_offset = 0;
}
relation y_lower_value continuous on y_lower {
trace(potential) - boundary_offset = 0;
}
relation y_upper_value continuous on y_upper {
trace(potential) - boundary_offset = 0;
}
}
"""
)
realization = eqiora.preview_realization(
model,
eqiora.ScalarElliptic(
method=eqiora.ScalarEllipticMethod.FiniteElement,
cells_per_axis=4,
),
)
program = eqiora.diff.compile(
model,
realization,
inputs=(
model.parameter("source_scale"),
model.parameter("diffusion"),
model.parameter("boundary_offset"),
),
output=model.field("potential"),
)
point = np.array([19.739208802178716, 1.0, 0.0], dtype=np.float64)
evaluation = program.evaluate(point)
values = evaluation.primal().output.numpy(copy=False)
The current path is host-CPU, rank-one float64, generated-Cartesian scalar
elliptic Q1 FEM or TPFA FVM.
PyTorch uses Eqiora's accepted VJP in backward:
import torch
import eqiora.torch as eqtorch
torch_program = eqtorch.bind(program)
theta = torch.tensor(point, dtype=torch.float64, requires_grad=True)
state = torch_program(theta)
state.square().sum().backward()
JAX uses typed native CPU FFI for primal, JVP, and VJP:
import jax
import jax.numpy as jnp
import eqiora.jax as eqjax
jax.config.update("jax_enable_x64", True)
jax_program = eqjax.bind(program)
theta = jnp.array(point, dtype=jnp.float64)
gradient = jax.grad(lambda point: jnp.sum(jax_program(point) ** 2))(theta)
Device transfer is never hidden. GPU execution, output sharding, higher-order differentiation, export/serialization, and general transformation support are not claimed. See Differentiation and framework adapters.
Compatibility and limitations
0.1.0a1 is an alpha prerelease. Public Python names and serialized contracts
change only deliberately and are documented in release notes, but breaking
changes may occur before 1.0. Corrections to a published artifact use a new
version; an existing release is never overwritten.
This distribution does not support macOS, Windows, free-threaded CPython, GPU wheels, bundled MPI, or arbitrary user-defined native operators. It is not a complete physics library or a safety-certified engineering tool.
Links
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
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 eqiora-0.1.0a1.tar.gz.
File metadata
- Download URL: eqiora-0.1.0a1.tar.gz
- Upload date:
- Size: 3.8 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2b43206d80328bed65ee064e21f1faa6f39f887dda2b9be32b67276111a44ee0
|
|
| MD5 |
94b61b2c3d0b3586a62a7f6a24b0def6
|
|
| BLAKE2b-256 |
263732a3e4d38a71aeaefc38ab2a04309d32097cd29af0e25cc3ea88043f8b6e
|
Provenance
The following attestation bundles were made for eqiora-0.1.0a1.tar.gz:
Publisher:
python-production-publish.yml on nkiyohara/eqiora
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eqiora-0.1.0a1.tar.gz -
Subject digest:
2b43206d80328bed65ee064e21f1faa6f39f887dda2b9be32b67276111a44ee0 - Sigstore transparency entry: 2232510042
- Sigstore integration time:
-
Permalink:
nkiyohara/eqiora@a7adc6bdc2aeb351fb518a5343df0baf556c3ce5 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/nkiyohara
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-production-publish.yml@a7adc6bdc2aeb351fb518a5343df0baf556c3ce5 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file eqiora-0.1.0a1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: eqiora-0.1.0a1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 3.0 MB
- Tags: CPython 3.14, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
81bea5d37b8c3d4ad9dfa66c77f1378280234d7a9afa6784f19a0e79ddf7b32f
|
|
| MD5 |
2555c3dc56fb69d218a2e9f7cf3a3295
|
|
| BLAKE2b-256 |
bbccf8b6f3ef3fe8fe8bdd635ddd24d7f8638e26214c056a1e7b86d972eb9acf
|
Provenance
The following attestation bundles were made for eqiora-0.1.0a1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
python-production-publish.yml on nkiyohara/eqiora
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eqiora-0.1.0a1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
81bea5d37b8c3d4ad9dfa66c77f1378280234d7a9afa6784f19a0e79ddf7b32f - Sigstore transparency entry: 2232512725
- Sigstore integration time:
-
Permalink:
nkiyohara/eqiora@a7adc6bdc2aeb351fb518a5343df0baf556c3ce5 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/nkiyohara
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-production-publish.yml@a7adc6bdc2aeb351fb518a5343df0baf556c3ce5 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file eqiora-0.1.0a1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: eqiora-0.1.0a1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 3.0 MB
- Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2b8692527ed03ab4058edf693cd0757c1f42acd142dd9b933030f76f7d8d1a62
|
|
| MD5 |
01142e82a699eb1974dadeb8f9646392
|
|
| BLAKE2b-256 |
b92ab84601c27715ec5c46920768d75bd054e85b21901ae1712fa4cc3e594f4c
|
Provenance
The following attestation bundles were made for eqiora-0.1.0a1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
python-production-publish.yml on nkiyohara/eqiora
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eqiora-0.1.0a1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
2b8692527ed03ab4058edf693cd0757c1f42acd142dd9b933030f76f7d8d1a62 - Sigstore transparency entry: 2232513187
- Sigstore integration time:
-
Permalink:
nkiyohara/eqiora@a7adc6bdc2aeb351fb518a5343df0baf556c3ce5 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/nkiyohara
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-production-publish.yml@a7adc6bdc2aeb351fb518a5343df0baf556c3ce5 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file eqiora-0.1.0a1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: eqiora-0.1.0a1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 3.0 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eaa587330f40f277cd94e87238e16715bfdd7fe4e00e3ed2445ecf91cab6ff6d
|
|
| MD5 |
df0cccbff163c17fefd83344d88cb61c
|
|
| BLAKE2b-256 |
6ed53df3ab033cd889955275e9a764da11527637f1cac5eebe0ae817053762af
|
Provenance
The following attestation bundles were made for eqiora-0.1.0a1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
python-production-publish.yml on nkiyohara/eqiora
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eqiora-0.1.0a1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
eaa587330f40f277cd94e87238e16715bfdd7fe4e00e3ed2445ecf91cab6ff6d - Sigstore transparency entry: 2232511917
- Sigstore integration time:
-
Permalink:
nkiyohara/eqiora@a7adc6bdc2aeb351fb518a5343df0baf556c3ce5 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/nkiyohara
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-production-publish.yml@a7adc6bdc2aeb351fb518a5343df0baf556c3ce5 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file eqiora-0.1.0a1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: eqiora-0.1.0a1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 3.0 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5091c9e76cc9169a18e3ba4472fc793c0fc360c1f29ec99c3e288d2ce7655c29
|
|
| MD5 |
c7656ea1eec17f103479d168bc834cb0
|
|
| BLAKE2b-256 |
84fb8700875a515cdef55753beddd9b72c34924897efc8e9c6d6a88e492e941f
|
Provenance
The following attestation bundles were made for eqiora-0.1.0a1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
python-production-publish.yml on nkiyohara/eqiora
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eqiora-0.1.0a1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
5091c9e76cc9169a18e3ba4472fc793c0fc360c1f29ec99c3e288d2ce7655c29 - Sigstore transparency entry: 2232510829
- Sigstore integration time:
-
Permalink:
nkiyohara/eqiora@a7adc6bdc2aeb351fb518a5343df0baf556c3ce5 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/nkiyohara
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-production-publish.yml@a7adc6bdc2aeb351fb518a5343df0baf556c3ce5 -
Trigger Event:
workflow_dispatch
-
Statement type: