pub mod curves;
pub mod fib;
use super::constants::PPM;
use crate::services::tokens::{Decimal, Precision};
pub trait HasScore {
fn get_score(&self) -> Decimal;
}
fn transform_and_normalize<I, F>(inputs: I, mut curve: F) -> Vec<u32>
where
I: IntoIterator<Item = Decimal>,
F: FnMut(Decimal) -> Decimal,
{
let outputs: Vec<u64> = inputs
.into_iter()
.map(|input| curve(input))
.map(|x| {
x.with_precision(Precision::new(4).unwrap())
.unwrap()
.quantity
.value
})
.collect();
let total: u128 = outputs.iter().map(|&x| x as u128).sum();
if total == 0 {
return vec![0; outputs.len()];
}
outputs
.into_iter()
.map(|output| ((output as u128 * PPM as u128) / total) as u32)
.collect()
}
pub fn weighted_normalization<'a, T, I, Curve>(items: I, curve: Curve) -> Vec<u32>
where
I: IntoIterator<Item = &'a T>,
T: HasScore + 'a,
Curve: FnMut(Decimal) -> Decimal,
{
let inputs = items.into_iter().map(|item| item.get_score());
transform_and_normalize(inputs, curve)
}