use crate::{entity::ShortFloat, global::Float, symbols::*, util::ToDisplayAndBrief};
use nar_dev_utils::join;
use narsese::lexical::Budget as LexicalBudget;
pub trait Budget: ToDisplayAndBrief {
fn priority(&self) -> ShortFloat;
fn __priority_mut(&mut self) -> &mut ShortFloat;
#[inline(always)]
fn set_priority(&mut self, new_p: ShortFloat) {
self.__priority_mut().set(new_p)
}
fn durability(&self) -> ShortFloat;
fn __durability_mut(&mut self) -> &mut ShortFloat;
#[inline(always)]
fn set_durability(&mut self, new_d: ShortFloat) {
self.__durability_mut().set(new_d)
}
fn quality(&self) -> ShortFloat;
fn __quality_mut(&mut self) -> &mut ShortFloat;
#[inline(always)]
fn set_quality(&mut self, new_q: ShortFloat) {
self.__quality_mut().set(new_q)
}
fn pdq(&self) -> [ShortFloat; 3] {
[self.priority(), self.durability(), self.quality()]
}
fn pdq_float(&self) -> [Float; 3] {
[
self.priority().to_float(),
self.durability().to_float(),
self.quality().to_float(),
]
}
fn copy_budget_from(&mut self, from: &impl Budget) {
self.set_priority(from.priority());
self.set_durability(from.durability());
self.set_quality(from.quality());
}
#[inline(always)]
#[doc(alias = "summary")]
fn budget_summary(&self) -> ShortFloat {
ShortFloat::geometrical_average([self.priority(), self.durability(), self.quality()])
}
#[inline(always)]
fn budget_above_threshold(&self, budget_threshold: Float) -> bool {
self.budget_summary().to_float() >= budget_threshold
}
fn budget_to_display(&self) -> String {
join!(
=> MARK.to_string()
=> &self.priority().to_display()
=> SEPARATOR
=> &self.durability().to_display()
=> SEPARATOR
=> &self.quality().to_display()
=> MARK
)
}
fn budget_to_display_brief(&self) -> String {
MARK.to_string()
+ &self.priority().to_display_brief()
+ SEPARATOR
+ &self.durability().to_display_brief()
+ SEPARATOR
+ &self.quality().to_display_brief()
+ MARK
}
fn budget_to_lexical(&self) -> LexicalBudget {
vec![
self.priority().to_string(),
self.durability().to_string(),
self.quality().to_string(),
]
}
}
const MARK: &str = BUDGET_VALUE_MARK;
const SEPARATOR: &str = VALUE_SEPARATOR;