ferrotherm
Thermodynamic computing from Python: state a problem, get named values back.
The physics is open and old — Ising (1925), Glauber dynamics (1963), Gibbs sampling (Geman & Geman
1984) — and a "thermodynamic sampling unit" accelerates exactly these loops. This package binds the
ferrotherm Rust library through its C ABI: the solver is
zero-dependency Rust, deterministic by seed, verified against exact physics.
pip install ferrotherm
State a problem in the vocabulary of the problem
Not a QUBO matrix. Variables have names and domains, constraints say what they mean, and the answer comes back keyed by the names you used.
import ferrotherm as ft
p = ft.Problem()
a = p.categorical("a", 3)
b = p.categorical("b", 3)
p.not_equal(a, b)
p.maximize(3 * a.is_(1) + 4 * b.is_(2))
ans = p.solve(tries=32)
print(ans.values) # {'a': 1, 'b': 2}
print(ans.feasible) # True
A constraint can be soft — a price rather than a wall — and the answer reports what it cost:
import ferrotherm as ft
p = ft.Problem()
x = p.categorical("x", 3)
y = p.categorical("y", 3)
p.not_equal(x, y, soft=2.0) # breaking this costs 2.0 x amount squared
ans = p.solve(tries=32)
print(ans.soft_cost, ans.violated)
Or sample the physics directly
import ferrotherm as ft
s = ft.lattice2d(64, 1.0, beta=0.6) # a magnet below critical temperature
s.sweep(2000)
print(f"|M| = {abs(s.magnetization):.4f}") # 0.9736
print(f"Onsager = {ft.onsager(0.6):.4f}") # 0.9736 — the closed form, matched to 4 dp
That second line is the check that matters: Onsager's 1944 closed form for the infinite 2D lattice, and a 64x64 sampler reproducing it to four decimals. The size is not decoration — 16x16 over 500 sweeps gives 0.898 against 0.974, because a small lattice sampled briefly is not the thermodynamic limit. Verify against exact physics before opinions.
ft.ring, ft.z1_grid, ft.frustrated and ft.wishart build the other standard graphs, and
ft.Model takes an explicit edge list when you want to write the couplings yourself.
Every run carries its joules
The ledger is not an appendix. A sampler counts the work it did and prices it at Z1-class device figures, so the energy question is answerable rather than rhetorical. Note what is being priced: the modelled device, not the CPU this ran on.
import ferrotherm as ft
s = ft.lattice2d(64, 1.0, beta=0.6)
s.sweep(2000)
print(f"{s.node_updates} node updates -> {s.joules:.2e} J")
The library it binds
This package carries no solver of its own — it loads the shared library and calls it. In order:
FERROTHERM_LIB, if you set it. An explicit path always wins.- The copy shipped in the wheel.
target/release/of a checkout, for developing against a local build.
ft.library_path() tells you which one answered.
Apache-2.0. Source, the Rust crate and eight other bindings: https://github.com/dcharlot-physicalai-bmi/ferrotherm. From the Institute for Physical AI @ BMI.
Metadata
Release files for ferrotherm 0.29.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ferrotherm-0.29.0-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| ferrotherm-0.29.0-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details |
| ferrotherm-0.29.0-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
Total release size: 1.3 MB
Release files / ferrotherm-0.29.0-py3-none-win_amd64.whl
| Download URL | ferrotherm-0.29.0-py3-none-win_amd64.whl |
|---|---|
| Size | 350.9 kB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
37075a0eb378155d1d5405e3682d9d7fee8401957996da1c779ca302eff3b4f1
|
|
BLAKE2b-256 checksum How to use checksums |
e45cf6601c2d4af69ea1d403ed3e84972ca48297a4bef708c8514b7a8a780a43
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 28, 2026.
Transparency logRelease files / ferrotherm-0.29.0-py3-none-manylinux_2_28_x86_64.whl
| Download URL | ferrotherm-0.29.0-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 485.8 kB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
75986d2c5268d74218638f09bf949e94b8b3a8dd6ed5a05a7ededb4ce408387f
|
|
BLAKE2b-256 checksum How to use checksums |
6ac0703fb17ae943ed4f2e1b9b35cafca0dde7a76e0d16e821a16e93615e118e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 28, 2026.
Transparency logRelease files / ferrotherm-0.29.0-py3-none-macosx_11_0_arm64.whl
| Download URL | ferrotherm-0.29.0-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 424.0 kB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
d7b2f014cd1361910aa78b80be15d1b4567d299f371798512b79813ad5d2add3
|
|
BLAKE2b-256 checksum How to use checksums |
c24149fa88d06caa767d5982cef83bd505b9320139acaa7cc3ba247dff7c7e13
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 28, 2026.
Transparency log