2 个不稳定版本

0.2.0 2024 年 1 月 19 日
0.1.0 2024 年 1 月 17 日

#158 in 模拟

MIT/Apache

25KB
485

logprob

本包定义了一个基本的 LogProb 浮点数包装器。该结构体设计得只接受对数概率中合理的值。这意味着 LogProb 可以存储:

  • 任何有限负浮点值(例如 -0.23, -32535.05, -66.0)。
  • 负无穷大(对应于 0.0 概率)
  • 0.0 和 -0.0。

本包旨在用于涉及对数概率的谨慎计算实现。

特性

  • 添加 LogProb 的方法(相当于取对应原始概率的乘积)
  • LogProb 和无符号整数的乘积(例如相当于 p^n)。
  • OrdEq 特质在 LogProb 上,因为没有 NaN
  • 对切片和迭代器的相对高效实现 LogSumExp

示例请参阅文档。


lib.rs:

本包定义了一个基本的 LogProb 浮点数包装器。该结构体设计得只接受对数概率中合理的值。这意味着 LogProb 可以存储:- 任何有限负浮点值(例如 -0.23, -32535.05, -66.0)。- 负无穷大(对应于 0.0 概率)- 0.0 和 -0.0。

如果传入其他任何值,则 LogProb::new 返回一个 FloatIsNanOrPositive 错误。您还可以通过使用 LogProb::from_raw_prob 从 [0,1] 区间的值构建新的 LogProb

该库还包含添加对数概率的功能(相当于取对应原始概率的乘积)。

use logprob::LogProb;
let x = LogProb::from_raw_prob(0.5).unwrap();
let y = LogProb::from_raw_prob(0.5).unwrap();
let z = x + y;
assert_eq!(z, LogProb::from_raw_prob(0.25).unwrap());

还可以将 LogProb 与无符号整数相乘,这相当于将对数概率的指数乘以整数。

let x = LogProb::from_raw_prob(0.5_f64).unwrap();
let y: u8 = 2;
let z = x * y;
assert_eq!(z, LogProb::from_raw_prob(0.25).unwrap());

最后,该库还包含对 LogSumExp 的合理高效实现,以便可以直接使用 LogProb 来取原始概率的总和。

let x = LogProb::from_raw_prob(0.5_f64).unwrap();
let y = LogProb::from_raw_prob(0.25).unwrap();
let z = x.add_log_prob(y).unwrap();
assert_eq!(z, LogProb::from_raw_prob(0.75).unwrap());

这也可以适用于切片或迭代器(通过导入 log_sum_exp)。

use logprob::{LogSumExp, log_sum_exp};
let x = LogProb::from_raw_prob(0.5_f64).unwrap();
let y = LogProb::from_raw_prob(0.25).unwrap();
let z = [x,y].iter().log_sum_exp().unwrap();
assert_eq!(z, LogProb::from_raw_prob(0.75).unwrap());
let v = log_sum_exp(&[x,y]).unwrap();
assert_eq!(z, LogProb::from_raw_prob(0.75).unwrap());

此功能也可以用于切片或迭代器(通过导入 log_sum_exp)。

let x = LogProb::from_raw_prob(0.5_f64).unwrap();
let y = LogProb::from_raw_prob(0.75).unwrap();
let z = [x,y].into_iter().log_sum_exp_clamped();
assert_eq!(z, LogProb::new(0.0).unwrap());
let z = [x,y].into_iter().log_sum_exp_float();
approx::assert_relative_eq!(z, (1.25_f64).ln());

dev rand_chacha 0.3.1

dev rand_chacha 0.3.1