ask-bayes 0.2.1

CLI tool for Bayesian inference
Documentation
use anyhow::Result;
use ask_bayes::prelude::*;
use clap::Parser;
use log::{debug, info, LevelFilter};
use simplelog::{ColorChoice, Config, TermLogger, TerminalMode};

#[cfg(not(tarpaulin_include))]
fn main() -> Result<()> {
    TermLogger::init(
        LevelFilter::Info,
        Config::default(),
        TerminalMode::Mixed,
        ColorChoice::Auto,
    )?;

    let args = Args::parse();
    debug!("{:?}", args);
    if args.wizard {
        wizard()?;
        return Ok(());
    }

    let name = args.name.ok_or(anyhow::anyhow!("name is required"))?;

    if args.get_prior {
        let p = get_prior(&name)?;
        info!("P({name}) = {}", p);
        return Ok(());
    }

    if args.remove_prior {
        remove_prior(&name)?;
        info!("P({name}) removed");
        return Ok(());
    }

    if let Some(prior) = args.set_prior {
        set_prior(&name, prior)?;
        info!("P({name}) = {}", prior);
        return Ok(());
    }

    let prior = args.prior.ok_or(anyhow::anyhow!("prior is required"))?;
    let likelihood = args
        .likelihood
        .ok_or(anyhow::anyhow!("likelihood is required"))?;
    let likelihood_not = args
        .likelihood_null
        .ok_or(anyhow::anyhow!("likelihood_not is required"))?;
    let evidence = args
        .evidence
        .ok_or(anyhow::anyhow!("evidence is required"))?;
    let posterior_probability =
        calculate_posterior_probability(prior, likelihood, likelihood_not, &evidence, &name)?;
    let output_format = args.output.ok_or(anyhow::anyhow!("output is required"))?;

    report_posterior_probability(
        prior,
        likelihood,
        likelihood_not,
        &evidence,
        posterior_probability,
        &name,
        &output_format,
    );

    if let Some(UpdateHypothesis::Update) = args.update_prior {
        set_prior(&name, posterior_probability)?;
        info!("P({name}) has been updated to {}", posterior_probability);
    }
    Ok(())
}