diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml new file mode 100644 index 0000000..dc5af2d --- /dev/null +++ b/.github/workflows/master.yml @@ -0,0 +1,27 @@ +name: Cargo build + +on: + push: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + toolchain: 1.70.0 + - run: cargo test -- --include-ignored + - run: cargo test --examples + - run: cargo doc --no-deps + - run: cargo bench --no-run --profile dev + benchmark: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + - run: cargo install cargo-criterion + - run: cargo criterion \ No newline at end of file diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml new file mode 100644 index 0000000..11a0c92 --- /dev/null +++ b/.github/workflows/pull_request.yml @@ -0,0 +1,27 @@ +name: Cargo build + +on: + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + toolchain: 1.70.0 + - run: cargo test -- --include-ignored + - run: cargo test --examples + - run: cargo doc --no-deps + - run: cargo bench --no-run --profile dev + benchmark: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + - run: cargo install cargo-criterion + - run: cargo criterion \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index 935e0d9..76df573 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "mcmc" +name = "metromc" version = "0.1.0" edition = "2021" authors = ["Emil Koutanov"] @@ -14,4 +14,9 @@ statrs = "0.16.0" tinyrand = "0.5.0" [dev-dependencies] -assert_float_eq = "1.1.3" \ No newline at end of file +assert_float_eq = "1.1.3" +criterion = { version = "0.5.1", features = ["html_reports"] } + +[[bench]] +name = "cri_gaussian" +harness = false \ No newline at end of file diff --git a/README.md b/README.md index 326d8d0..4e30330 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,12 @@ -`mcmc` +`metromc` === Markov chain Monte Carlo sampling using the _Independence Metropolis-Hastings_ algorithm with uniform transition kernel. -Uses the [tinyrand](https://github.com/obsidiandynamics/tinyrand) RNG. +[![Crates.io](https://img.shields.io/crates/v/mcmc?style=flat-square&logo=rust)](https://crates.io/crates/mcmc) +[![docs.rs](https://img.shields.io/badge/docs.rs-mcmc-blue?style=flat-square&logo=docs.rs)](https://docs.rs/mcmc) +[![Build Status](https://img.shields.io/github/actions/workflow/status/obsidiandynamics/mcmc/master.yml?branch=master&style=flat-square&logo=github)](https://github.com/obsidiandynamics/mcmc/actions/workflows/master.yml) + +Uses the [tinyrand](https://github.com/obsidiandynamics/tinyrand) RNG to sample at rate of ~50M samples/sec. # Example Draw samples from the Gaussian distribution. @@ -10,8 +14,8 @@ Draw samples from the Gaussian distribution. ```rust use std::ops::RangeInclusive; use tinyrand::Wyrand; -use mcmc::gaussian::Gaussian; -use mcmc::sampler::{Config, Sampler}; +use metromc::gaussian::Gaussian; +use metromc::sampler::{Config, Sampler}; // sample from Gaussian with µ=0.0 and σ=1.0, in the interval [-5.0, 5.0] let sampler = Sampler::new(Config { diff --git a/benches/cri_gaussian.rs b/benches/cri_gaussian.rs new file mode 100644 index 0000000..607685b --- /dev/null +++ b/benches/cri_gaussian.rs @@ -0,0 +1,29 @@ +use std::ops::RangeInclusive; + +use criterion::{Criterion, criterion_group, criterion_main}; +use tinyrand::Wyrand; + +use metromc::gaussian::Gaussian; +use metromc::sampler::{Config, Sampler}; + +fn criterion_benchmark(c: &mut Criterion) { + const MEAN: f64 = 0.0; + const STD_DEV: f64 = 1.0; + const RANGE: RangeInclusive = -5.0..=5.0; + + let mut sampler = Sampler::new(Config { + rand: Wyrand::default(), + dist: Gaussian::new(MEAN, STD_DEV), + range: RANGE, + }); + + // sanity check + assert!(RANGE.contains(&sampler.next())); + + c.bench_function("cri_gaussian", |b| { + b.iter(|| sampler.next()); + }); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/examples/gamma_pdf.rs b/examples/gamma_pdf.rs index f2a262e..aadefd1 100644 --- a/examples/gamma_pdf.rs +++ b/examples/gamma_pdf.rs @@ -1,5 +1,5 @@ -use mcmc::gamma::Gamma; -use mcmc::Pdf; +use metromc::gamma::Gamma; +use metromc::Pdf; fn main() { const SHAPE: f64 = 2.0; diff --git a/examples/gaussian_pdf.rs b/examples/gaussian_pdf.rs index 517c414..2b438c0 100644 --- a/examples/gaussian_pdf.rs +++ b/examples/gaussian_pdf.rs @@ -1,5 +1,5 @@ -use mcmc::Pdf; -use mcmc::gaussian::Gaussian; +use metromc::Pdf; +use metromc::gaussian::Gaussian; fn main() { const MEAN: f64 = 3.0; diff --git a/examples/sample_gamma.rs b/examples/sample_gamma.rs index b7d017d..6edd11f 100644 --- a/examples/sample_gamma.rs +++ b/examples/sample_gamma.rs @@ -2,8 +2,8 @@ use std::ops::RangeInclusive; use tinyrand::Wyrand; -use mcmc::gamma::Gamma; -use mcmc::sampler::{Config, Sampler}; +use metromc::gamma::Gamma; +use metromc::sampler::{Config, Sampler}; fn main() { const SHAPE: f64 = 2.0; diff --git a/examples/sample_gaussian.rs b/examples/sample_gaussian.rs index a949423..ef8b6a7 100644 --- a/examples/sample_gaussian.rs +++ b/examples/sample_gaussian.rs @@ -1,7 +1,7 @@ use std::ops::RangeInclusive; use tinyrand::Wyrand; -use mcmc::gaussian::Gaussian; -use mcmc::sampler::{Config, Sampler}; +use metromc::gaussian::Gaussian; +use metromc::sampler::{Config, Sampler}; fn main() { const MEAN: f64 = 0.0;