use crate::float::Float;
use crate::value::{GtZero, NormalizedContainer, NormalizedWeight, Value01};
use witnessed::Witnessed;
#[doc(hidden)]
pub trait Members<T: Float>: Sized {
type Raw;
fn extract_raw_weights(raw: &Self::Raw) -> Vec<T>;
fn from_raw_with_weights(
raw: Self::Raw,
container: &Witnessed<Vec<T>, NormalizedContainer>,
) -> Self;
}
#[doc(hidden)]
#[derive(Debug, Clone, Copy)]
pub struct RawMember<T: Float, M> {
pub(crate) weight: Witnessed<T, GtZero>,
pub(crate) metric: M,
}
impl<T: Float, M> RawMember<T, M> {
pub fn weight(&self) -> T {
*self.weight
}
pub fn metric(&self) -> &M {
&self.metric
}
}
#[doc(hidden)]
#[inline]
pub fn raw_member<T: Float, M>(weight: T, metric: M) -> Result<RawMember<T, M>, &'static str> {
let w = GtZero::witness(weight)?;
Ok(RawMember { weight: w, metric })
}
#[derive(Debug, Clone, Copy)]
pub struct Member<T: Float, M> {
pub weight: Witnessed<T, NormalizedWeight>,
pub metric: M,
}
impl<T: Float, M> Member<T, M> {
#[inline]
pub fn contribute(&self, value: Witnessed<T, Value01>) -> T {
value.into_inner() * self.weight.into_inner()
}
#[inline]
pub fn metric(&self) -> &M {
&self.metric
}
}
#[cfg(test)]
mod tests_for_member;