| |
| |
|
|
| from pathlib import Path |
|
|
| import jax |
| import jax.numpy as jnp |
| import networkx as nx |
| import numpy as np |
|
|
| from hamiltonzero import ( |
| SpinHamiltonian, |
| burn_in, |
| burn_in_basis, |
| energy, |
| measure_renyi2, |
| prepare, |
| spin, |
| step, |
| step_basis, |
| ) |
|
|
|
|
| graph = nx.path_graph(8) |
| nx.set_edge_attributes(graph, 1.0, "J") |
| system = SpinHamiltonian.from_networkx(graph) |
|
|
| route_key, mcmc_key, basis_x_key, basis_y_key = jax.random.split( |
| jax.random.PRNGKey(0), 4 |
| ) |
| compiled, order = prepare( |
| system, |
| Path("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) |
| print("leaf_to_input", np.asarray(order.leaf_to_input)) |
| print("input_to_leaf", np.asarray(order.input_to_leaf)) |
| print("energy", float(jnp.mean(local_energy.total.real))) |
| print("energy_std", float(jnp.std(local_energy.total.real))) |
| print("spin", np.asarray(jnp.mean(local_spin.real, axis=0))) |
|
|
| state, q = step(compiled, state, steps=24, walker_chunk_size=16) |
|
|
| basis_x, bits_x = burn_in_basis(compiled, basis_x_key, batch_size=256, burn_in=1024) |
| basis_y, bits_y = burn_in_basis(compiled, basis_y_key, batch_size=256, burn_in=1024) |
| basis_x, bits_x = step_basis(compiled, basis_x, steps=24) |
| basis_y, bits_y = step_basis(compiled, basis_y, steps=24) |
| basis_x, basis_y, purity = measure_renyi2( |
| compiled, |
| basis_x, |
| basis_y, |
| subsystem=range(4), |
| blocks=16, |
| samples_per_block=1, |
| steps_between=24, |
| ) |
| print("purity", purity.purity) |
| print("purity_standard_error", purity.standard_error) |
| print("purity_resolved", purity.resolved, purity.failure_reasons) |
| print("renyi2_nats", purity.renyi2_nats) |
|
|