Use and Index struct instead of str and String for player id

This commit is contained in:
2022-06-27 10:16:12 +02:00
parent d52895f804
commit cd1079a811
4 changed files with 514 additions and 455 deletions

View File

@@ -1,5 +1,8 @@
use std::borrow::{Borrow, ToOwned};
use std::cmp::Reverse;
use std::collections::HashMap;
use std::f64::consts::{FRAC_1_SQRT_2, FRAC_2_SQRT_PI, SQRT_2};
use std::hash::Hash;
mod agent;
#[cfg(feature = "approx")]
@@ -27,19 +30,55 @@ pub const ITERATIONS: usize = 30;
const SQRT_TAU: f64 = 2.5066282746310002;
const N01: Gaussian = Gaussian {
pub const N01: Gaussian = Gaussian {
mu: 0.0,
sigma: 1.0,
};
pub(crate) const N00: Gaussian = Gaussian {
pub const N00: Gaussian = Gaussian {
mu: 0.0,
sigma: 0.0,
};
pub(crate) const N_INF: Gaussian = Gaussian {
pub const N_INF: Gaussian = Gaussian {
mu: 0.0,
sigma: f64::INFINITY,
};
#[derive(Copy, Clone, Default, PartialEq, PartialOrd, Eq, Ord, Hash, Debug)]
pub struct Index(usize);
impl From<usize> for Index {
fn from(ix: usize) -> Self {
Self(ix)
}
}
pub struct IndexMap<K>(HashMap<K, Index>);
impl<K> IndexMap<K>
where
K: Eq + Hash,
{
pub fn new() -> Self {
Self(HashMap::new())
}
pub fn get_or_create<Q: ?Sized>(&mut self, k: &Q) -> Index
where
K: Borrow<Q>,
Q: Hash + Eq + ToOwned<Owned = K>,
{
if let Some(idx) = self.0.get(k) {
*idx
} else {
let idx = Index::from(self.0.len());
self.0.insert(k.to_owned(), idx);
idx
}
}
}
fn erfc(x: f64) -> f64 {
let z = x.abs();
let t = 1.0 / (1.0 + z / 2.0);