2 个不稳定版本
0.2.0 | 2024 年 1 月 19 日 |
---|---|
0.1.0 | 2024 年 1 月 17 日 |
#158 in 模拟
25KB
485 行
logprob
本包定义了一个基本的 LogProb
浮点数包装器。该结构体设计得只接受对数概率中合理的值。这意味着 LogProb
可以存储:
- 任何有限负浮点值(例如 -0.23, -32535.05, -66.0)。
- 负无穷大(对应于 0.0 概率)
- 0.0 和 -0.0。
本包旨在用于涉及对数概率的谨慎计算实现。
特性
- 添加
LogProb
的方法(相当于取对应原始概率的乘积) - 取
LogProb
和无符号整数的乘积(例如相当于 p^n)。 Ord
和Eq
特质在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