use super::ReasonRecorder;
use crate::{
global::ClockTime,
inference::InferenceEngine,
parameters::Parameters,
storage::{Memory, TaskBuffer},
util::Serial,
};
use navm::output::Output;
use rand::{rngs::StdRng, SeedableRng};
use std::fmt::Debug;
#[derive(Debug /* Serialize, Deserialize */)]
pub struct Reasoner {
name: String,
pub(in super::super) parameters: Parameters,
pub(in super::super) memory: Memory,
pub(super) recorder: ReasonRecorder,
pub(in super::super) inference_engine: InferenceEngine,
pub(in super::super) task_buffer: TaskBuffer,
clock: ClockTime,
volume: usize,
stamp_current_serial: ClockTime,
task_current_serial: Serial,
pub(in super::super) shuffle_rng: StdRng,
}
impl Reasoner {
pub fn new(
name: impl Into<String>,
parameters: impl Into<Parameters>,
inference_engine: impl Into<InferenceEngine>,
) -> Self {
Self {
name: name.into(),
parameters: parameters.into(),
memory: Memory::default(),
recorder: ReasonRecorder::default(),
inference_engine: inference_engine.into(),
task_buffer: TaskBuffer::default(),
clock: 0,
volume: 0,
stamp_current_serial: 0,
task_current_serial: 0,
shuffle_rng: Self::new_shuffle_rng(),
}
}
fn new_shuffle_rng() -> StdRng {
StdRng::seed_from_u64(0x137442)
}
}
impl Reasoner {
pub fn reset(&mut self) {
self.memory.init();
self.task_buffer.reset();
self.recorder.reset();
self.clock = 0;
self.stamp_current_serial = 0;
self.task_current_serial = 0;
self.report_info("-----RESET-----");
}
pub fn name(&self) -> &str {
&self.name
}
pub fn memory(&self) -> &Memory {
&self.memory
}
pub fn memory_mut(&mut self) -> &mut Memory {
&mut self.memory
}
pub fn parameters(&self) -> &Parameters {
&self.parameters
}
pub fn volume(&self) -> usize {
self.volume
}
pub fn set_volume(&mut self, volume: usize) {
self.volume = volume;
}
pub fn stamp_current_serial(&self) -> ClockTime {
self.stamp_current_serial
}
pub(crate) fn set_stamp_current_serial(&mut self, value: ClockTime) {
self.stamp_current_serial = value;
}
pub fn updated_stamp_current_serial(&mut self) -> ClockTime {
self.stamp_current_serial += 1;
self.stamp_current_serial
}
pub(crate) fn task_current_serial(&self) -> Serial {
self.task_current_serial
}
pub(crate) fn set_task_current_serial(&mut self, value: Serial) {
self.task_current_serial = value;
}
pub(crate) fn updated_task_current_serial(&mut self) -> Serial {
self.task_current_serial += 1;
self.task_current_serial
}
#[doc(alias = "clock")]
pub fn time(&self) -> ClockTime {
self.clock
}
pub fn tick(&mut self) {
self.clock += 1;
}
#[doc(alias = "set_clock")]
pub(crate) fn set_time(&mut self, value: ClockTime) {
self.clock = value;
}
pub fn take_output(&mut self) -> Option<Output> {
self.recorder.take()
}
}