1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
//! This module holds all the traits that have to be implemented for
//! the agent to be a plugable compontent.
//!
//! The following mental model is used to the api design.
//!
//! There will be constructor functions that construct and run the simulation automatically. These
//! functions can take in any abritrary type that has implemented the correct traits. This makes it
//! so multiple types can be defined as agents and a simulation can be run in the same manner as
//! with only a single agent type.
//!
//! The point of the simulations is to add some form of random sequencing. This means there will
//! need to be multiple runs of the simulation with the same input parameters. One simulation run
//! will be fully separate of another simulation run, making a multiprocess execution model a very
//! good candidate for speeding up the program.
//!
//! The process will look something like this:
//!
//!
//! /* Environment
//! |
//! --------------------
//! | | |
//! [Agent_1, | |
//! Agent_2, |
//! Agent_3, ... ]
//! */
//!
//! The environment will give out a tick command that propagates down to all the agents contained
//! in its system.
//!
//! /* Environment.tick()
//! |
//! --------------------
//! | | |
//! [Agent_1.tick() | |
//! Agent_2.tick() |
//! Agent_3.tick() ]
//! */
//!
//! Once that round is completely finished the environment will collect all the public data and
//! write it to a file in json format.
//!
//!
//! /* Environment.collect()
//! |
//! --------------------
//! | | |
//! [Agent_1.collect() | |
//! Agent_2.collect()
//! Agent_3.collect() ]
//! */
pub trait Agent {
///
fn generate() -> Result<Box<Self>, &'static str> where Self: Sized;
///
fn collect(&self) -> Result<(), &'static str>;
///
fn tick(&mut self) -> Result<(), &'static str>;
}
pub trait Environment {
///
fn generate(pop: Vec<Box<dyn Agent>>) -> Result<Box<Self>, &'static str> where Self: Sized;
///
fn collect(&self) -> Result<(), &'static str>;
///
fn tick(&mut self) -> Result<(), &'static str>;
}