Custom Lattice Workflow¶
Model. This notebook builds a user-defined six-site ring with a complex chord and nonuniform onsite energies using Lattice and TightBindingModel.
Typical uses. Prototyping custom graphs, encoding Peierls phases, checking dense/sparse agreement, visualizing eigenstates, and integrating user builders with the model registry.
Parameters. Site positions, bond records, complex matrix elements, onsite energies, Hermiticity, and default hopping determine the custom Hamiltonian.
Useful plots. Phase-colored graph connectivity, Hamiltonian phase matrix, and the ground state plotted on lattice coordinates.
InĀ [1]:
import matplotlib.pyplot as plt
import numpy as np
from quantum_lattice_models import Lattice, TightBindingModel
from quantum_lattice_models.plotting import (
plot_hamiltonian_matrix,
plot_lattice_graph,
plot_lattice_state,
)
from quantum_lattice_models.registry import get_model_info, register_model, unregister_model
from quantum_lattice_models.spectra import eigensystem
InĀ [2]:
angles = np.linspace(0.0, 2.0 * np.pi, 6, endpoint=False)
positions = np.column_stack([np.cos(angles), np.sin(angles)])
bonds = [(index, (index + 1) % 6) for index in range(6)]
bonds.append((0, 3, 0.35j))
lattice = Lattice(
positions=positions,
bonds=bonds,
metadata={"description": "six-site ring with a complex chord"},
)
model = TightBindingModel(lattice)
H = model.hamiltonian(hopping=1.0, onsite=[0.2, 0.0, -0.2, 0.2, 0.0, -0.2])
H_sparse = model.sparse_hamiltonian(
hopping=1.0,
onsite=[0.2, 0.0, -0.2, 0.2, 0.0, -0.2],
)
values, vectors = eigensystem(H)
print("Custom lattice summary")
print(f" shape: {H.shape}")
print(f" dense/sparse agree: {np.allclose(H, H_sparse.toarray())}")
print(f" Hermitian: {np.allclose(H, H.conj().T)}")
print(f" ground energy: {values[0]:.6f}")
Custom lattice summary shape: (6, 6) dense/sparse agree: True Hermitian: True ground energy: -2.032287
InĀ [3]:
fig, axes = plt.subplots(1, 3, figsize=(12, 3.6))
plot_lattice_graph(H, ax=axes[0], show_colorbar=True, labels=True, arrows=True)
axes[0].set_title("Custom connectivity and phase")
plot_hamiltonian_matrix(H, ax=axes[1], mode="phase")
plot_lattice_state(H, vectors[:, 0], ax=axes[2])
axes[2].set_title("Ground state on lattice")
fig.tight_layout()
InĀ [4]:
def six_site_ring(hopping: float = 1.0):
return TightBindingModel(lattice).hamiltonian(hopping=hopping)
register_model(
"six_site_ring_demo",
category="user",
basis="single particle",
dimension="6",
return_type="LatticeHamiltonian",
description="Notebook-defined six-site ring",
builder=six_site_ring,
defaults={"hopping": 1.0},
)
try:
info = get_model_info("six_site_ring_demo")
print("Temporary registry entry")
print(f" category: {info.category}")
print(f" dimension: {info.dimension}")
print(f" default shape: {info.builder(**info.defaults).shape}")
finally:
unregister_model("six_site_ring_demo")
Temporary registry entry category: user dimension: 6 default shape: (6, 6)