From fdddf5615619c3987546a5d64c2f0360ee98346e Mon Sep 17 00:00:00 2001 From: Anders Olsson Date: Tue, 27 Dec 2022 22:11:04 +0100 Subject: [PATCH] Remove unused mut reference --- src/batch.rs | 2 +- src/gaussian2.rs | 159 +++++++++++++++++++++++++++++++++++++++++++++++ src/history.rs | 4 +- src/lib.rs | 1 + 4 files changed, 163 insertions(+), 3 deletions(-) create mode 100644 src/gaussian2.rs diff --git a/src/batch.rs b/src/batch.rs index d974214..e7fe1a1 100644 --- a/src/batch.rs +++ b/src/batch.rs @@ -203,7 +203,7 @@ impl Batch { composition: Vec>>, results: Vec>, weights: Vec>>, - agents: &mut HashMap, + agents: &HashMap, ) { let this_agent = composition .iter() diff --git a/src/gaussian2.rs b/src/gaussian2.rs new file mode 100644 index 0000000..8a26261 --- /dev/null +++ b/src/gaussian2.rs @@ -0,0 +1,159 @@ +use std::ops; + +#[derive(Clone, Copy, PartialEq, Debug)] +pub struct Gaussian { + mu: f64, + sigma: f64, +} + +impl Gaussian { + #[inline(always)] + pub const fn from_ms(mu: f64, sigma: f64) -> Self { + Self { mu, sigma } + } + + #[inline(always)] + pub fn from_pt(pi: f64, tau: f64) -> Self { + Self::from_ms(tau / pi, (1.0 / pi).sqrt()) + } + + #[inline(always)] + pub fn mu(&self) -> f64 { + self.mu + } + + #[inline(always)] + pub fn sigma(&self) -> f64 { + self.sigma + } + + #[inline(always)] + pub fn pi(&self) -> f64 { + if self.sigma > 0.0 { + self.sigma.powi(-2) + } else { + f64::INFINITY + } + } + + #[inline(always)] + pub fn tau(&self) -> f64 { + if self.sigma > 0.0 { + self.mu * self.pi() + } else { + f64::INFINITY + } + } +} + +impl ops::Add for Gaussian { + type Output = Gaussian; + + fn add(self, rhs: Gaussian) -> Self::Output { + Self { + mu: self.mu + rhs.mu, + sigma: (self.sigma.powi(2) + rhs.sigma.powi(2)).sqrt(), + } + } +} + +impl ops::Sub for Gaussian { + type Output = Gaussian; + + fn sub(self, rhs: Gaussian) -> Self::Output { + Self { + mu: self.mu - rhs.mu, + sigma: (self.sigma.powi(2) + rhs.sigma.powi(2)).sqrt(), + } + } +} + +impl ops::Mul for Gaussian { + type Output = Gaussian; + + fn mul(self, rhs: Gaussian) -> Self::Output { + /* + if self.sigma == 0.0 || rhs.sigma == 0.0 { + let mu = self.mu / (self.sigma.powi(2) / rhs.sigma.powi(2) + 1.0) + + rhs.mu / (rhs.sigma.powi(2) / self.sigma.powi(2) + 1.0); + + let sigma = (1.0 / ((1.0 / self.sigma.powi(2)) + (1.0 / rhs.sigma.powi(2)))).sqrt(); + + Self::from_ms(mu, sigma) + } else { + Self::from_pt(self.pi() + rhs.pi(), self.tau() + rhs.tau()) + } + */ + + Self::from_pt(self.pi() + rhs.pi(), self.tau() + rhs.tau()) + } +} + +impl ops::Div for Gaussian { + type Output = Gaussian; + + fn div(self, rhs: Gaussian) -> Self::Output { + /* + let (mu, sigma) = if self.sigma == 0.0 || rhs.sigma == 0.0 { + let mu = self.mu / (1.0 - self.sigma.powi(2) / rhs.sigma.powi(2)) + + rhs.mu / (rhs.sigma.powi(2) / self.sigma.powi(2) - 1.0); + + let sigma = (1.0 / ((1.0 / self.sigma.powi(2)) - (1.0 / rhs.sigma.powi(2)))).sqrt(); + + Self::from_ms(mu, sigma) + } else { + Self::from_pt(self.pi() - rhs.pi(), self.tau() - rhs.tau()) + } + */ + + Self::from_pt(self.pi() - rhs.pi(), self.tau() - rhs.tau()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_add() { + let n = Gaussian::from_ms(25.0, 25.0 / 3.0); + let m = Gaussian::from_ms(0.0, 1.0); + + assert_eq!(n + m, Gaussian::from_ms(25.0, 8.393118874676116)); + } + + #[test] + fn test_sub() { + let n = Gaussian::from_ms(25.0, 25.0 / 3.0); + let m = Gaussian::from_ms(1.0, 1.0); + + assert_eq!(n - m, Gaussian::from_ms(24.0, 8.393118874676116)); + } + + #[test] + fn test_mul() { + let n = Gaussian::from_ms(25.0, 25.0 / 3.0); + let m = Gaussian::from_ms(0.0, 1.0); + + assert_eq!( + n * m, + Gaussian::from_ms(0.35488958990536273, 0.992876838486922) + ); + } + + #[test] + fn test_div() { + let n = Gaussian::from_ms(25.0, 25.0 / 3.0); + let m = Gaussian::from_ms(0.0, 1.0); + + assert_eq!( + m / n, + Gaussian::from_ms(-0.3652597402597402, 1.0072787050317253) + ); + + assert_eq!( + n / m, + Gaussian::from_ms(-0.3652597402597402, 1.0072787050317253) + ); + } +} diff --git a/src/history.rs b/src/history.rs index 9dddd70..25ea651 100644 --- a/src/history.rs +++ b/src/history.rs @@ -87,7 +87,7 @@ impl Default for HistoryBuilder { pub struct History { size: usize, - pub batches: Vec, + pub(crate) batches: Vec, agents: HashMap, time: bool, mu: f64, @@ -354,7 +354,7 @@ impl History { if self.time && self.batches.len() > k && self.batches[k].time == t { let b = &mut self.batches[k]; - b.add_events(composition, results, weights, &mut self.agents); + b.add_events(composition, results, weights, &self.agents); for a in b.skills.keys() { let agent = self.agents.get_mut(a).unwrap(); diff --git a/src/lib.rs b/src/lib.rs index dbe72ef..0a8054a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,6 +10,7 @@ mod approx; pub mod batch; mod game; pub mod gaussian; +// mod gaussian2; mod history; mod message; pub mod player;