rustsim-core 0.0.1

Core ABM engine: agents, models, stores, schedulers, stepping, data collection
Documentation
use rand::rngs::StdRng;
use rand::SeedableRng;
use rustsim_core::{
    prelude::{Agent, AgentStore, Fastest, HashMapStore, Randomly, StandardModel},
    scheduler::Scheduler,
    standard::HasAgentIds,
    types::AgentId,
};
mod support;
use support::NothingSpace;

#[derive(Debug, Clone)]
struct SimpleAgent {
    id: AgentId,
}

impl Agent for SimpleAgent {
    fn id(&self) -> AgentId {
        self.id
    }
}

type TestModel =
    StandardModel<NothingSpace, SimpleAgent, HashMapStore<SimpleAgent>, (), StdRng, Fastest>;

type RandomModel =
    StandardModel<NothingSpace, SimpleAgent, HashMapStore<SimpleAgent>, (), StdRng, Randomly>;

fn make_store(n: u64) -> HashMapStore<SimpleAgent> {
    let mut store = HashMapStore::new();
    for i in 1..=n {
        store.insert(SimpleAgent { id: i });
    }
    store
}

#[test]
fn fastest_returns_all_ids() {
    let model = TestModel::new(
        make_store(5),
        NothingSpace,
        Fastest::new(),
        (),
        StdRng::seed_from_u64(0),
        None,
        None,
        true,
    );

    let ids = model.agent_ids();
    assert_eq!(ids.len(), 5);
    for i in 1..=5u64 {
        assert!(ids.contains(&i));
    }
}

#[test]
fn randomly_scheduler_shuffles() {
    let model = RandomModel::new(
        make_store(20),
        NothingSpace,
        Randomly::new(),
        (),
        StdRng::seed_from_u64(42),
        None,
        None,
        true,
    );

    let mut scheduler = Randomly::new();
    let mut buf = Vec::new();

    buf.clear();
    scheduler.schedule_into(&model, &mut buf);
    let order1 = buf.clone();

    buf.clear();
    scheduler.schedule_into(&model, &mut buf);
    let order2 = buf.clone();

    assert_eq!(order1.len(), 20);
    assert_eq!(order2.len(), 20);

    assert_ne!(
        order1, order2,
        "random scheduler should produce different orderings"
    );
}

#[test]
fn randomly_scheduler_contains_all() {
    let model = RandomModel::new(
        make_store(10),
        NothingSpace,
        Randomly::new(),
        (),
        StdRng::seed_from_u64(99),
        None,
        None,
        true,
    );

    let mut scheduler = Randomly::new();
    let mut buf = Vec::new();
    scheduler.schedule_into(&model, &mut buf);

    assert_eq!(buf.len(), 10);
    for i in 1..=10u64 {
        assert!(buf.contains(&i));
    }
}