djinn 0.0.1

A framework for distributed agent-based modeling
Documentation
extern crate rand;
extern crate djinn;
extern crate redis;
extern crate rustc_serialize;

mod opdyn;

use redis::Client;
use djinn::{Manager, Agent, run};
use djinn::ext::yaml::load_from_yaml;
use opdyn::{OpinionDynamicsSim, State, World, Person, Media, Opinion};


fn main() {
    let conf = load_from_yaml("examples/conf/opdyn.yaml");
    let sim = OpinionDynamicsSim {
        opinion_shift_proportion: conf["opinion_shift_proportion"].as_f64().unwrap(),
    };
    let world = World {};

    // Setup the manager
    let addr = "redis://127.0.0.1/";
    let pop_client = Client::open(addr).unwrap();
    let mut manager = Manager::new(addr, pop_client, sim.clone());

    let mut medias = vec![Media {
                              opinions: vec![Opinion {
                                                 polarity: -1,
                                                 priority: 5,
                                             },
                                             Opinion {
                                                 polarity: -5,
                                                 priority: 1,
                                             }],
                          },
                          Media {
                              opinions: vec![Opinion {
                                                 polarity: 1,
                                                 priority: 8,
                                             },
                                             Opinion {
                                                 polarity: 2,
                                                 priority: 4,
                                             }],
                          }];
    let media_ids = manager.spawns(medias.drain(..).map(|m| State::Media(m)).collect());

    let mut people = vec![Person::new(vec![Opinion {
                                               polarity: 100,
                                               priority: 1,
                                           },
                                           Opinion {
                                               polarity: 0,
                                               priority: 0,
                                           }]),
                          Person::new(vec![Opinion {
                                               polarity: -50,
                                               priority: 1,
                                           },
                                           Opinion {
                                               polarity: 100,
                                               priority: 0,
                                           }])];
    let people_ids = manager.spawns(people.drain(..).map(|m| State::Person(m)).collect());

    manager.register_reporter(1, |step, pop, _| {
        // Mean polarity of first issue
        let people: Vec<Agent<State>> = pop.lookup("people");
        let polarity = people.iter().fold(0, |acc, a| {
            match a.state {
                State::Person(ref p) => acc + p.opinions[0].polarity,
                _ => acc,
            }
        });
        println!("[{:02}] mean polarity: {}",
                 step,
                 (polarity as f64) / (people.len() as f64));
    });

    println!("running");
    run(sim, world, manager, 4, 10);
}