use crate::global::Float;
use nar_dev_utils::macro_once;
use serde::{Deserialize, Serialize};
pub type EvidentialHorizon = Float;
macro_once! {
macro parameters(
$(#[$struct_attr:meta])*
pub struct $struct_name:ident {
$( $(#[$attr:meta])*
$v:vis $name:ident : $type:ty = $default:expr
),* $(,)?
}
) {
$(#[$struct_attr])*
pub struct $struct_name {
$(
$(#[$attr])*
// #[serde(default = concat!("default_values::", $name))]
$v $name: $type,
)*
}
#[doc(hidden)]
mod default_values {
use super::*;
$(
#[doc(hidden)]
pub const fn $name() -> $type { $default }
)*
}
impl $struct_name {
pub const fn default_const() -> Self {
Self {
$(
$name: default_values::$name(),
)*
}
}
}
impl Default for $struct_name {
#[inline]
fn default() -> Self {
Self::default_const()
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct Parameters {
pub concept_forgetting_cycle: usize = 10,
pub task_link_forgetting_cycle: usize = 20,
pub term_link_forgetting_cycle: usize = 50,
pub silent_level: usize = 0,
pub new_task_forgetting_cycle: usize = 1,
pub max_matched_term_link: usize = 10,
pub max_reasoned_term_link: usize = 3,
pub horizon: EvidentialHorizon = 1.0,
pub reliance: Float = 0.9,
pub budget_threshold: Float = 0.01,
pub default_confirmation_expectation: Float = 0.8,
pub default_creation_expectation: Float = 0.66,
pub default_truth_analytic: bool = false,
pub default_judgement_frequency: Float = 1.0,
pub default_judgement_confidence: Float = 0.9,
pub default_judgement_priority: Float = 0.8,
pub default_judgement_durability: Float = 0.8,
pub default_question_priority: Float = 0.9,
pub default_question_durability: Float = 0.9,
pub bag_level: usize = 100,
pub bag_threshold: usize = 10,
pub load_factor: Float = 0.5,
pub concept_bag_size: usize = 1000,
pub task_link_bag_size: usize = 20,
pub term_link_bag_size: usize = 100,
pub task_buffer_size: usize = 10,
pub concept_initial_priority: Float = 0.01,
pub concept_initial_durability: Float = 0.01,
pub concept_initial_quality: Float = 0.01,
pub maximum_stamp_length: usize = 8,
pub term_link_record_length: usize = 10,
pub maximum_belief_length: usize = 7,
pub maximum_questions_length: usize = 5,
#[serde(default = "default_values::novel_task_bag_size")] pub novel_task_bag_size: usize = 1000,
#[serde(default = "default_values::novel_task_forgetting_cycle")]
pub novel_task_forgetting_cycle: usize = 10,
}
}
pub const DEFAULT_PARAMETERS: Parameters = Parameters::default_const();
#[cfg(test)]
mod tests {
use super::*;
use nar_dev_utils::asserts;
#[test]
fn test_default_value() {
let parameters = DEFAULT_PARAMETERS;
macro_once! {
macro test_default_value($(
$field:ident => $expected:expr
)*) {
let expected = Parameters {
$( $field: $expected ),*
};
assert_eq!(parameters, expected);
$(
assert_eq!(parameters.$field, $expected);
)*
}
concept_forgetting_cycle => 10
task_link_forgetting_cycle => 20
term_link_forgetting_cycle => 50
silent_level => 0
new_task_forgetting_cycle => 1
max_matched_term_link => 10
max_reasoned_term_link => 3
horizon => 1.0
reliance => 0.9
budget_threshold => 0.01
default_confirmation_expectation => 0.8
default_creation_expectation => 0.66
default_truth_analytic => false
default_judgement_frequency => 1.0
default_judgement_confidence => 0.9
default_judgement_priority => 0.8
default_judgement_durability => 0.8
default_question_priority => 0.9
default_question_durability => 0.9
bag_level => 100
bag_threshold => 10
load_factor => 0.5
concept_bag_size => 1000
task_link_bag_size => 20
term_link_bag_size => 100
task_buffer_size => 10
concept_initial_priority => 0.01
concept_initial_durability => 0.01
concept_initial_quality => 0.01
maximum_stamp_length => 8
term_link_record_length => 10
maximum_belief_length => 7
maximum_questions_length => 5
novel_task_bag_size => 1000
novel_task_forgetting_cycle => 10
}
}
#[test]
fn test_default_consistency() {
asserts! {
Parameters::default_const() == Parameters::default()
Parameters::default_const() == DEFAULT_PARAMETERS
}
}
}