HamiltonZero / README.md
Aleksei Ustimenko
Publish HamiltonZero 0.1.1 package
6f01cc0
|
Raw
History Blame Contribute Delete
11.4 kB
---
license: apache-2.0
---
# HamiltonZero
HamiltonZero is Simulacra Research's research release for compiled neural
wavefunctions of quantum spin Hamiltonians. It exposes three workflows:
- learned-router multisystem training;
- compiled single-system fine-tuning;
- compiled single-system evaluation, with optional router contest or large-N
execution.
## Installation
HamiltonZero requires Python 3.12 or newer and JAX-compatible accelerator
drivers.
```bash
python -m pip install hamiltonzero
```
To install from a source checkout instead, run `python -m pip install .` in
the repository root.
Example configurations and research datasets are repository assets rather
than wheel data. Clone the matching
[`v0.1.1` source tree](https://github.com/simulacra-research/HamiltonZero/tree/v0.1.1)
to run the documented commands unchanged.
The package pins `jax==0.11.0` and `jaxlib==0.11.0`. Install the accelerator
plugin appropriate for the host using the standard JAX instructions.
Learned-router training uses eight visible accelerators and requires an MCMC
batch size divisible by eight. Fine-tuning uses all visible accelerators and
requires its MCMC batch size to be divisible by their count. Evaluation chooses
a visible-device subset compatible with its walker batch.
## Foundation checkpoint
This Hugging Face repository stores the directly loadable HamiltonZero v1
foundation checkpoint at `weights/hamiltonzero_v1.eqx`, with its manifest in
`config.json`. To download both files without cloning the repository:
```bash
hf download simulacra-research/HamiltonZero \
config.json \
weights/hamiltonzero_v1.eqx \
--local-dir .
```
The checkpoint contains the complete foundation wavefunction and its learned
router. `router` is the checkpoint kind, not a router-only parameter file.
To load the model directly, construct an architecture template and deserialize
its array leaves:
```python
import jax
from hamiltonzero.checkpoint import load_model
from hamiltonzero.config import ModelConfig
from hamiltonzero.model import build_model
template = build_model(
ModelConfig(),
jax.random.PRNGKey(0),
n_max=64,
)
model = load_model("weights/hamiltonzero_v1.eqx", template)
```
The template key initializes placeholder values only; deserialization replaces
all serialized array leaves. Set `n_max` to the padded width of the system when
constructing a template for direct model use. The command-line evaluation path
does this from the input system automatically.
## Hamiltonians and NetworkX
The public API follows the textbook convention
```text
H = sum_(i<j) S_i^T J_ij S_j + sum_i h_i^T S_i, S = sigma/2.
```
Construct and save a system from a simple undirected NetworkX graph:
```python
from pathlib import Path
import networkx as nx
from hamiltonzero import SpinHamiltonian
from hamiltonzero.data import save_system
graph = nx.path_graph(8)
nx.set_edge_attributes(graph, 1.0, "J")
nx.set_node_attributes(graph, 0.0, "h")
system = SpinHamiltonian.from_networkx(graph)
save_system(Path("outputs/systems/chain_8.json"), system)
```
The same example is runnable as `python examples/networkx_system.py`. An edge
`J` may be an isotropic scalar, a length-three diagonal, or a 3-by-3 exchange
matrix. A node `h` may be a scalar z-field or a length-three field vector.
`SpinHamiltonian.from_arrays` accepts dense arrays instead.
HamiltonZero converts public inputs to the model's internal `-J/2` and `-h`
representation. The `SpinHamiltonian.J` and `SpinHamiltonian.h` properties
return the public textbook values. If `mu` is omitted, a conservative value is
computed from the Hamiltonian.
## Standalone compiled inference
The compact inference API loads the foundation checkpoint, runs the
beam-8 router, permutes the Hamiltonian, and compiles the selected physical
wavefunction in one call:
```python
import jax
import networkx as nx
from hamiltonzero import SpinHamiltonian, burn_in, energy, prepare, spin, step
graph = nx.path_graph(8)
nx.set_edge_attributes(graph, 1.0, "J")
system = SpinHamiltonian.from_networkx(graph)
route_key, mcmc_key = jax.random.split(jax.random.PRNGKey(0))
compiled, order = prepare(
system,
"weights/hamiltonzero_v1.eqx",
route_key,
)
state, q = burn_in(
compiled,
mcmc_key,
batch_size=256,
replicas=8,
burn_in=1024,
walker_chunk_size=16,
)
local_energy = energy(compiled, q)
local_spin = spin(compiled, q)
state, q = step(compiled, state, steps=24, walker_chunk_size=16)
```
`state` is the complete replica-exchange MCMC state and `q` is its cold-chain
population. `energy` returns named `total`, `exchange`, `casimir`, and `field`
local-energy samples. `spin` returns the complex local spin estimator in the
routed `(site, x/y/z)` order; contracting it with the routed public field
reproduces the energy field channel. The selected padded-site permutation is
returned as `order`. `order.leaf_to_input[leaf]` is the public input-site index
assigned to a compiled tree leaf; `order.input_to_leaf[site]` is its inverse.
The first mapping is also available as `compiled.route`. The public NetworkX
path starts in exactly the supplied `system.nodes` order, applies this route
once to the context and walkers, and then compiles an identity-routed tree.
There is no additional bit reversal: applying one would corrupt the mapping.
Both arrays include padded virtual leaves when the model width exceeds the
physical site count. A complete runnable version that prints sample means and
standard deviations is in
[`examples/compiled_inference.py`](https://github.com/simulacra-research/HamiltonZero/blob/v0.1.1/examples/compiled_inference.py).
[`examples/j1j2_4x4_route.ipynb`](https://github.com/simulacra-research/HamiltonZero/blob/v0.1.1/examples/j1j2_4x4_route.ipynb) constructs a
periodic 4-by-4 J1-J2 model from NetworkX and visualizes the returned order as
the successive cells of the compiled binary merge tree. Install its plotting
dependencies with `python -m pip install '.[notebooks]'`.
For a normalized pure state, the full-state `Tr(|psi><psi|)` is exactly one.
The nontrivial purity observable is the subsystem second Renyi value
`Tr(rho_A^2)`. It uses two independent computational-basis chains and a
two-replica SWAP estimator:
```python
import jax
from hamiltonzero import burn_in_basis, measure_renyi2
x_key, y_key = jax.random.split(jax.random.PRNGKey(1))
x_state, x = burn_in_basis(compiled, x_key, batch_size=256, burn_in=1024)
y_state, y = burn_in_basis(compiled, y_key, batch_size=256, burn_in=1024)
x_state, y_state, result = measure_renyi2(
compiled,
x_state,
y_state,
subsystem=range(4),
blocks=16,
steps_between=24,
)
print(result.purity, result.standard_error, result.renyi2_nats)
print(result.resolved, result.failure_reasons)
```
`subsystem` accepts public site indices or a boolean mask. The result also
retains each SWAP sample in stable log-polar form. Entropy is reported only
when the block-count, effective-sample-size, autocorrelation,
heavy-tail, imaginary-null, and physical-bound checks resolve the estimate;
otherwise `renyi2_nats` is `None` and `failure_reasons` says why.
`burn_in_basis` samples the computational basis required by this estimator.
The SU(2)-quaternion walkers returned by `burn_in` cannot be substituted for
those samples.
## Datasets
The repository includes the exact 5,000-system foundation training panel and
the evaluation systems with at least 256 physical spins. Every file uses the
public textbook units above.
- `datasets/train/foundation_5000.jsonl` contains systems from 2 through 64
spins, fixed WL1/FWL2 dispatch, and available exact-diagonalization energies.
- `datasets/eval/` contains the PPP-Ohno, RUDY, square-lattice J1-J2, and
triangular-Heisenberg evaluation systems from 256 through 8,100 physical
spins.
Large-N files store physical sites only; the loader reconstructs power-of-two
padding in memory. See [`datasets/README.md`](https://github.com/simulacra-research/HamiltonZero/blob/v0.1.1/datasets/README.md) for the full
inventory and sparse exchange encoding.
## Train
The training command starts a new learned-router multisystem run and writes one
final full foundation-model checkpoint, including its learned router, plus a
metadata sidecar:
```bash
hamiltonzero train examples/train.json
```
The example uses `datasets/train/foundation_5000.jsonl`, writes
`outputs/foundation.eqx`, and exposes model, MCMC, KFAC, router, and energy
parameters through JSON. The command writes the trained model at the end of
the run.
Set the optional top-level `checkpoint` field to start from a full router-model
checkpoint. This loads model parameters only; KFAC state, sampler state, the
step counter, and the learning-rate schedule start fresh.
To load compatible sampler states:
```bash
hamiltonzero train examples/train.json --reuse-mcmc path/to/mcmc-states
```
For multisystem training, the path is a directory containing
`<system-index>.eqx` files. For a one-system training panel it may be a single
file. Training runs `mcmc.burn_in` iterations after either fresh initialization
or loading reused states. Each iteration uses `mcmc.burn_in_replica_steps`
MCMC moves.
## Fine-tune
Fine-tuning selects and freezes a route from a router checkpoint, compiles the
single-system wavefunction, and optimizes that compiled model:
```bash
hamiltonzero finetune examples/finetune.json
```
The example fine-tunes on the 256-spin PPP-Ohno system and writes
`outputs/ppp_ohno_n256.eqx`. A neighboring `.eqx.json` sidecar records the
compiled-fine-tune kind, frozen model width, and configured ranks. A compatible
single post-burn-in state can also be supplied:
```bash
hamiltonzero finetune examples/finetune.json --reuse-mcmc path/to/state.eqx
```
## Evaluate
Compiled evaluation uses the route selected by a router checkpoint, or the
embedded frozen route in a compiled fine-tune checkpoint:
```bash
hamiltonzero eval examples/eval.json
```
Use router contest to compare candidate routes before evaluating the winner:
```bash
hamiltonzero eval examples/eval.json --contest
```
Use the sequence-sharded large-N implementation for the large systems:
```bash
hamiltonzero eval examples/eval_large_n.json --large-n
```
Each evaluation writes `eval.json` and `eval.metrics.jsonl` inside its
configured output directory.
Training and fine-tuning metrics are written beside the final checkpoint as
`<checkpoint>.metrics.jsonl`. Evaluation writes the same per-measurement fields
to `eval.metrics.jsonl`. These JSONL rows contain step, energy, energy standard
deviation, step wall time, and total wall time. Final `eval.json` additionally
reports exchange/field channels and lag-one autocorrelation when available.
## Configuration
Every command accepts one JSON configuration. The files in `examples/` are
minimal runnable configurations; omitted parameters use the defaults in
`hamiltonzero.config`.
The KFAC-JAX fork is vendored under `src/kfac_jax`.
## License
HamiltonZero first-party source, datasets, and released model weights are
licensed under Apache-2.0, copyright Simulacra Research Inc. The vendored
KFAC-JAX fork and JAX-derived large-N attention kernel remain under
Apache-2.0. The Microsoft-Folx-derived attention forward and reverse-mode
kernels remain under MIT. See
[`THIRD_PARTY_NOTICES.md`](https://github.com/simulacra-research/HamiltonZero/blob/v0.1.1/THIRD_PARTY_NOTICES.md).