Metadata-Version: 2.4
Name: energyir
Version: 1.23.1
Summary: Structure-preserving, certificate-aware, multi-backend energy compiler for optimization, constraint solving, and ML subproblems.
Author-email: David Johnson <david@energyir.io>
License-Expression: Apache-2.0
Project-URL: Documentation, https://energyir.io/docs
Project-URL: Homepage, https://energyir.io
Project-URL: Source, https://github.com/dmjdxb/energyir
Keywords: compiler,qubo,ising,optimization,energy,sat,smt,cp-sat,energy-based-model
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Science/Research
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering :: Mathematics
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Typing :: Typed
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: numpy>=1.26
Requires-Dist: scipy>=1.11
Requires-Dist: typer>=0.12
Requires-Dist: rich>=13.7
Requires-Dist: uv>=0.11.17
Provides-Extra: fast
Requires-Dist: energyir-native>=0.1.0; extra == "fast"
Provides-Extra: reuse
Requires-Dist: scipy>=1.11; extra == "reuse"
Provides-Extra: array
Requires-Dist: numexpr>=2.8; extra == "array"
Provides-Extra: agent
Requires-Dist: sentence-transformers>=2.2; extra == "agent"
Provides-Extra: qubo
Requires-Dist: dimod>=0.12; extra == "qubo"
Requires-Dist: openjij>=0.11; extra == "qubo"
Provides-Extra: cp
Requires-Dist: ortools>=9.10; extra == "cp"
Provides-Extra: smt
Requires-Dist: z3-solver>=4.13; extra == "smt"
Provides-Extra: numba
Requires-Dist: numba>=0.59; extra == "numba"
Provides-Extra: jax
Requires-Dist: jax>=0.4; extra == "jax"
Requires-Dist: jaxlib>=0.4; extra == "jax"
Provides-Extra: torch
Requires-Dist: torch>=2.3; extra == "torch"
Provides-Extra: quantize-hf
Requires-Dist: huggingface_hub>=0.23; extra == "quantize-hf"
Requires-Dist: safetensors>=0.4; extra == "quantize-hf"
Provides-Extra: thermo
Provides-Extra: thermo-torch
Requires-Dist: torch>=2.6; extra == "thermo-torch"
Provides-Extra: thermo-jax
Requires-Dist: jax>=0.4; extra == "thermo-jax"
Requires-Dist: jaxlib>=0.4; extra == "thermo-jax"
Provides-Extra: thermo-tf
Requires-Dist: tensorflow>=2.16; extra == "thermo-tf"
Provides-Extra: optimize
Requires-Dist: cvxpy>=1.4; extra == "optimize"
Requires-Dist: scipy>=1.11; extra == "optimize"
Provides-Extra: thermo-pbit
Requires-Dist: pbitlang>=2.0; extra == "thermo-pbit"
Provides-Extra: bayes
Requires-Dist: pymc>=5.10; extra == "bayes"
Requires-Dist: arviz>=0.17; extra == "bayes"
Provides-Extra: thermo-hw
Provides-Extra: thermoboard
Provides-Extra: thermo-dwave
Requires-Dist: dwave-ocean-sdk>=6; extra == "thermo-dwave"
Provides-Extra: serving
Requires-Dist: vllm>=0.6; extra == "serving"
Requires-Dist: transformers>=4.40; extra == "serving"
Requires-Dist: torch>=2.3; extra == "serving"
Provides-Extra: tokens
Requires-Dist: together>=1.2; extra == "tokens"
Requires-Dist: tiktoken>=0.5; extra == "tokens"
Provides-Extra: energydb
Requires-Dist: torch>=2.3; extra == "energydb"
Provides-Extra: dbassistant
Requires-Dist: psycopg2-binary>=2.9; extra == "dbassistant"
Requires-Dist: databricks-sql-connector>=3.0; extra == "dbassistant"
Requires-Dist: cryptography>=42; extra == "dbassistant"
Provides-Extra: energydb-pg
Requires-Dist: psycopg[binary]>=3.1; extra == "energydb-pg"
Requires-Dist: cryptography>=42; extra == "energydb-pg"
Provides-Extra: ml
Requires-Dist: scikit-learn>=1.4; extra == "ml"
Provides-Extra: bench
Requires-Dist: pandas>=2.2; extra == "bench"
Requires-Dist: matplotlib>=3.8; extra == "bench"
Requires-Dist: jsonschema>=4; extra == "bench"
Provides-Extra: pro
Requires-Dist: cryptography>=42; extra == "pro"
Provides-Extra: erasure
Requires-Dist: thermoc-erasure>=0.2.0; extra == "erasure"
Provides-Extra: rust
Requires-Dist: maturin>=1.6; extra == "rust"
Provides-Extra: dev
Requires-Dist: pytest>=8; extra == "dev"
Requires-Dist: hypothesis>=6; extra == "dev"
Requires-Dist: ruff>=0.5; extra == "dev"
Requires-Dist: mypy>=1.10; extra == "dev"
Requires-Dist: pytest-cov; extra == "dev"
Requires-Dist: pytest-xdist; extra == "dev"
Requires-Dist: pytest-rerunfailures; extra == "dev"
Provides-Extra: all
Requires-Dist: scipy>=1.11; extra == "all"
Requires-Dist: dimod>=0.12; extra == "all"
Requires-Dist: openjij>=0.11; extra == "all"
Requires-Dist: ortools>=9.10; extra == "all"
Requires-Dist: z3-solver>=4.13; extra == "all"
Requires-Dist: numba>=0.59; extra == "all"
Requires-Dist: jax>=0.4; extra == "all"
Requires-Dist: jaxlib>=0.4; extra == "all"
Requires-Dist: scikit-learn>=1.4; extra == "all"
Requires-Dist: pandas>=2.2; extra == "all"
Requires-Dist: matplotlib>=3.8; extra == "all"
Requires-Dist: jsonschema>=4; extra == "all"
Requires-Dist: cryptography>=42; extra == "all"
Requires-Dist: pytest>=8; extra == "all"
Requires-Dist: hypothesis>=6; extra == "all"
Requires-Dist: ruff>=0.5; extra == "all"
Requires-Dist: mypy>=1.10; extra == "all"
Requires-Dist: pytest-cov; extra == "all"
Requires-Dist: pytest-xdist; extra == "all"
Requires-Dist: pytest-rerunfailures; extra == "all"
Dynamic: license-file

# EnergyIR

Measurement-first efficiency tooling for numerical and ML Python.

`pip install energyir` installs the `energy` CLI — diagnostic tools that **measure-verify**
performance/energy fixes in your numpy / PyTorch / JAX / pandas code, plus BLAS, dependency-upgrade,
and CVE-reachability checks, and a reuse runtime. Diagnosis and measurement are free; advanced
optimization features are licensed.

- **Install:** `pip install energyir` (Python 3.11+)
- **Docs:** <https://energyir.io/docs>
- **License:** Apache-2.0
- **Contact:** david@energyir.io

## EnergyFlow — whole-program compilation

`energyir.flow` sees a whole application rather than one call: what depends on
what, which state continues and which resets, which draws are independent, which
stages are barriers, and which groupings are legal. It then lowers every
candidate to the residency compiler, which remains the only thing that decides
where values live and what crossing the boundary costs.

```python
from energyir import flow

with flow.capture(name="bundle") as f:      # existing code, unchanged
    x, _ = thermo_solve(A, b)
    d, _ = thermo_logdet(A)

compilation = flow.compile_program(f.build())
print(flow.explain(compilation))            # every decision, every refusal
```

It reports hard counts, never a projected joule, and it refuses rather than
guessing: an unsupported state mode, a random stream two "independent" replicas
would share, a commit that could race its own verification, or a comparison
between a measured number and a modelled one all produce a named refusal.

`energy flow check|compile|explain|run|verify|targets|capture-registry`
