qmc 2.2.2

Quantum Monte Carlo simulations in Rust
Documentation
#![feature(test)]

extern crate qmc;
extern crate test;

#[cfg(test)]
mod tests {
    use super::*;
    use qmc::sse::qmc_traits::*;
    use qmc::sse::simple_ops::*;
    use smallvec::smallvec;
    use test::Bencher;

    fn convert(s: SimpleOpDiagonal) -> SimpleOpDiagonal {
        let l: SimpleOpLooper = s.into();
        l.into()
    }

    #[bench]
    fn bench_empty_graph(b: &mut Bencher) {
        let nvars = 10;
        let a = SimpleOpDiagonal::new(nvars);
        b.iter(|| {
            let a = a.clone();
            (0..1000).fold(a, |a, _| convert(a));
        });
    }

    #[bench]
    fn bench_many_graph(b: &mut Bencher) {
        let nvars = 10;
        let mut a = SimpleOpDiagonal::new(nvars);
        (0..nvars.pow(2)).for_each(|i| {
            let vara = i % nvars;
            let varb = (i + 1) % nvars;
            a.set_pth(
                i,
                Some(SimpleOp::offdiagonal(
                    smallvec![vara, varb],
                    0,
                    smallvec![false, false],
                    smallvec![false, false],
                    false,
                )),
            );
        });
        b.iter(|| {
            let a = a.clone();
            (0..1000).fold(a, |a, _| convert(a));
        });
    }

    #[bench]
    fn bench_many_spaced_graph(b: &mut Bencher) {
        let nvars = 10;
        let mut a = SimpleOpDiagonal::new(nvars);
        (0..nvars.pow(2)).for_each(|i| {
            let vara = i % nvars;
            let varb = (i + 1) % nvars;
            a.set_pth(
                nvars * i,
                Some(SimpleOp::offdiagonal(
                    smallvec![vara, varb],
                    0,
                    smallvec![false, false],
                    smallvec![false, false],
                    false,
                )),
            );
        });
        b.iter(|| {
            let a = a.clone();
            (0..1000).fold(a, |a, _| convert(a));
        });
    }
}