pub struct MultiBodyQuantumSolver {
pub n_particles: usize,
pub local_dim: usize,
pub tolerance: f64,
pub max_sweeps: usize,
}Expand description
CPU exact-diagonalization solver for small multi-body quantum Hamiltonians.
Diagonalizes the full Hamiltonian matrix exactly via Jacobi iteration for
Hermitian matrices with dimension ≤ 2^20 (typically ≤ 20 qubits). For
very small systems (dim ≤ 512) the algorithm converges quickly; for larger
ones it is still correct but will be slow — use GPUMultiBodyQuantumSolver
for production large-system calculations.
Fields§
§n_particles: usizeNumber of particles / sites in the many-body Hilbert space.
local_dim: usizeLocal Hilbert-space dimension per site (e.g. 2 for spin-1/2).
tolerance: f64Convergence tolerance for the Jacobi sweeps.
max_sweeps: usizeMaximum number of Jacobi sweeps.
Implementations§
Source§impl MultiBodyQuantumSolver
impl MultiBodyQuantumSolver
Sourcepub fn new(n_particles: usize, local_dim: usize) -> Self
pub fn new(n_particles: usize, local_dim: usize) -> Self
Create a new CPU multi-body quantum solver.
§Arguments
n_particles– number of particles / sites.local_dim– local Hilbert-space dimension per site (2 for qubits).
Sourcepub fn hilbert_dim(&self) -> usize
pub fn hilbert_dim(&self) -> usize
Total Hilbert-space dimension: local_dim^n_particles.
Sourcepub fn diagonalize(
&self,
hamiltonian: &Array2<Complex64>,
) -> Result<MultiBodyEigenResult>
pub fn diagonalize( &self, hamiltonian: &Array2<Complex64>, ) -> Result<MultiBodyEigenResult>
Diagonalize the given Hermitian Hamiltonian and return all eigenvalues and eigenvectors.
The input must be a square Hermitian matrix whose dimension equals
self.hilbert_dim().
Sourcepub fn find_ground_states(
&self,
hamiltonian: &Array2<Complex64>,
k: usize,
) -> Result<MultiBodyEigenResult>
pub fn find_ground_states( &self, hamiltonian: &Array2<Complex64>, k: usize, ) -> Result<MultiBodyEigenResult>
Find the k lowest-energy eigenpairs using the Lanczos algorithm.
This is more efficient than full diagonalization for large matrices when only a few eigenvalues are needed.
Sourcepub fn build_heisenberg_chain(
&self,
j_coupling: f64,
) -> Result<Array2<Complex64>>
pub fn build_heisenberg_chain( &self, j_coupling: f64, ) -> Result<Array2<Complex64>>
Build a nearest-neighbor Heisenberg XXX Hamiltonian on a 1D chain with periodic boundary conditions:
H = J Σ_i (S^x_i S^x_{i+1} + S^y_i S^y_{i+1} + S^z_i S^z_{i+1})
This is a convenience constructor for testing and benchmarking. Only works for spin-1/2 (local_dim == 2).
Auto Trait Implementations§
impl Freeze for MultiBodyQuantumSolver
impl RefUnwindSafe for MultiBodyQuantumSolver
impl Send for MultiBodyQuantumSolver
impl Sync for MultiBodyQuantumSolver
impl Unpin for MultiBodyQuantumSolver
impl UnsafeUnpin for MultiBodyQuantumSolver
impl UnwindSafe for MultiBodyQuantumSolver
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more