//! A molecule's ground state by DMRG from its FCIDUMP integrals, against //! Hartree–Fock and, where it fits, full configuration interaction. //! //! ```text //! cargo run --release --example chem_dmrg --features quantum_chem -- FILE BOND SWEEPS [threads] //! ``` use wai_quantum::quantum_chem::{fci, ground_state, hartree_fock_energy, molecular_mpo, read_fcidump, ChemConfig}; fn main() { let a: Vec = std::env::args().collect(); let fd = read_fcidump(&std::fs::read_to_string(&a[1]).expect("read the FCIDUMP")).expect("parse the FCIDUMP"); let bond: usize = a[2].parse().unwrap(); let sweeps: usize = a[3].parse().unwrap(); let mut cfg = ChemConfig { max_bond: bond, sweeps, ..ChemConfig::default() }; if let Some(t) = a.get(4) { cfg.threads = t.parse().unwrap(); } let mpo = molecular_mpo(&fd, &cfg); println!("{}: {} orbitals, {} electrons, MPO bond {}", a[1], fd.norb, fd.nelec, mpo.max_bond()); println!("Hartree–Fock {:.10}", hartree_fock_energy(&fd)); let t0 = std::time::Instant::now(); let r = ground_state(&fd, &cfg); let secs = t0.elapsed().as_secs_f64(); for (i, e) in r.sweep_energies.iter().enumerate() { println!("sweep {:>2} {e:.10}", i + 1); } println!("discarded {:.1e} entropy, mid {:.4} {secs:.1}s", r.discarded, r.entropies[r.entropies.len() / 2]); let t0 = std::time::Instant::now(); match fci(&fd) { Some(f) => println!("full CI {:.10} ({} determinants, {:.1}s) DMRG − full CI {:.2e}", f.energy, f.dim, t0.elapsed().as_secs_f64(), r.energy - f.energy), None => println!("full CI (too large)"), } }