#![deny(missing_docs)]
#![allow(non_upper_case_globals)]
extern crate approx;
extern crate nalgebra;
extern crate rand;
extern crate regex;
#[cfg(all(feature = "f32", feature = "f64"))]
compile_error!(
"modppl: features `f32` and `f64` are mutually exclusive; \
enable `f32` with `default-features = false`."
);
pub mod real {
#[cfg(feature = "f32")]
pub type Real = f32;
#[cfg(not(feature = "f32"))]
pub type Real = f64;
#[cfg(feature = "f32")]
pub use std::f32::consts;
#[cfg(not(feature = "f32"))]
pub use std::f64::consts;
}
pub use real::Real;
pub mod prelude;
pub mod gfi;
pub mod address;
pub mod trie;
pub mod modeling;
pub mod inference;
pub fn logsumexp(xs: &Vec<Real>) -> Real {
let max = xs.iter().cloned().fold(-1. / 0. , Real::max);
if max == Real::NEG_INFINITY {
Real::NEG_INFINITY
} else {
let mut sum_exp = 0.;
for x in xs {
sum_exp += (x - max).exp();
}
max + sum_exp.ln()
}
}
pub use address::{normalize_addr, AddrMap, SplitAddr};
pub use gfi::{ArgDiff, GenFn, Trace};
pub use modeling::dists::{
bernoulli, beta, binomial, categorical, cauchy, dirichlet, exponential, gamma, geometric,
inv_gamma, laplace, mvnormal, normal, poisson, u01, uniform, uniform_continuous,
uniform_discrete, Distribution,
};
pub use modeling::dyngenfn::{DynGenFn, DynGenFnHandler};
pub use modeling::dyntrie::{
dyn_debug_formatter, dyn_display_formatter, dyn_value_to_string, dyn_value_to_string_with,
dyntrace_to_string, dyntrace_to_string_with, dyntrace_to_string_with_options,
dyntrie_to_string, dyntrie_to_string_with, dyntrie_to_string_with_options, print_dyntrace,
print_dyntrace_with, print_dyntrace_with_options, DynAutoCast, DynTrace, DynTracePrintOptions,
DynTrie, DynValueFormatter,
};
pub use modeling::dynunfold::{DynParticles, DynUnfold};
pub use trie::Trie;
pub use inference::ParticleSystem;
pub use inference::{importance_resampling, importance_sampling};
pub use inference::{metropolis_hastings, mh, regen_mh, regenerative_metropolis_hastings};