#编程语言 #语法 #变量 #声明式 #随机 #ferric #概率

ferric-macros

一种用于随机变量的声明式语法的概率编程语言

2 个版本

0.1.2 2022年6月25日
0.1.1 2022年6月25日
0.1.0 2022年1月9日

#37 in #概率

每月 23 次下载
ferric 中使用

MIT/Apache 许可

24KB
552 代码行

Github Actions Tests crates.io Coverage Status

Ferric

Rust 中的一种具有声明式语法的概率编程语言。

用法

将以下内容添加到您的 Cargo.toml

[dependencies]
ferric = "0.1"

示例

use std::time::Instant;
use ferric::make_model;

make_model! {
    mod grass;
    use ferric::distributions::Bernoulli;

    let rain : bool ~ Bernoulli::new( 0.2 );

    let sprinkler : bool ~
        if rain {
            Bernoulli::new( 0.01 )
        } else {
            Bernoulli::new( 0.4 )
        };

    let grass_wet : bool ~ Bernoulli::new(
        if sprinkler && rain { 0.99 }
        else if sprinkler && !rain { 0.9 }
        else if !sprinkler && rain { 0.8 }
        else { 0.0 }
    );

    observe grass_wet;
    query rain;
    query sprinkler;
}

fn main() {
    let model = grass::Model {grass_wet: true};
    let mut num_rain = 0;
    let mut num_sprinkler = 0;
    let num_samples = 100000;
    let start = Instant::now();
    for sample in model.sample_iter().take(num_samples) {
        if sample.rain {
            num_rain += 1;
        }
        if sample.sprinkler {
            num_sprinkler += 1;
        }
    }
    let num_samples = num_samples as f64;
    println!(
        "posterior: rain = {} sprinkler = {}. Elapsed {} millisec for {} samples",
        (num_rain as f64) / num_samples,
        (num_sprinkler as f64) / num_samples,
        start.elapsed().as_millis(),
        num_samples,
    );
}

许可证

许可协议为

任选其一。

贡献

除非您明确声明,否则任何提交给作品以供包含的贡献,根据 Apache-2.0 许可协议定义,将以上双重许可,不附加任何额外的条款或条件。

依赖

~1.5MB
~39K SLoC