//! Ground-state DMRG on a spin chain, against the exact answer where one //! exists. //! //! ```text //! cargo run --release --example dmrg_chain --features quantum_dmrg -- ising|heisenberg N BOND SWEEPS [h] //! ``` use wai_quantum::quantum_dmrg::{dmrg, exact_ground_energy, ising_exact_energy, Chain, DmrgConfig}; fn main() { let a: Vec = std::env::args().collect(); let n: usize = a[2].parse().unwrap(); let bond: usize = a[3].parse().unwrap(); let sweeps: usize = a[4].parse().unwrap(); let field: f64 = a.get(5).map_or(1.0, |x| x.parse().unwrap()); let (chain, exact) = match a[1].as_str() { "ising" => (Chain::ising(n, 1.0, field), Some(ising_exact_energy(n, 1.0, field))), "heisenberg" => { let c = Chain::heisenberg(n, 1.0, 1.0, 0.0); let e = if n <= 20 { exact_ground_energy(&c) } else { None }; (c, e) } other => panic!("{other}"), }; let t0 = std::time::Instant::now(); let r = dmrg(&chain, &DmrgConfig { max_bond: bond, sweeps, ..DmrgConfig::default() }); let dt = t0.elapsed().as_secs_f64(); let mid = r.entropies[n / 2 - 1]; print!("{} n={n} bond={bond} sweeps={sweeps} E={:.12} per site {:.12} discarded {:.1e} S(mid) {:.4}", a[1], r.energy, r.energy / n as f64, r.discarded, mid); if let Some(e) = exact { print!(" exact {e:.12} error/site {:.1e}", (r.energy - e) / n as f64); } println!(" {dt:.1}s"); println!("sweeps: {:?}", r.sweep_energies.iter().map(|e| format!("{e:.10}")).collect::>()); }