#include #include #include #include #include "index.hpp" #include "index_spike.hpp" #include "pla_get.hpp" #include "property_composition.hpp" #include "pla_init_default.hpp" #include "pla_set.hpp" #include "sim_loop.hpp" #include "model.hpp" using namespace boost; const Time startTime(0.1); struct FakeSim { FakeSim() : indices(), queues() { using boost::make_tuple; } Ptr addGlobalMsg(RNG::seed_t seed) { const Time gmStartTime(ModelConsts::TrainerInitialDelay); // create an discrete quant instance Ptr res(indices.get>().add (Time(0), gmStartTime, Ptr())); // and a corresponding event occuring at time 0.1, stored in start // interval (t=0) queues.insert(Time(0), gmStartTime, Event(res)); pc.cast(PLA_Set(res, TrainerT(seed))); return res; } Ptr addSpike(Ptr src) { Time eventTime = startTime + TopologicalTimeOffset()(topo, src); Ptr res(indices.get>().add(startTime, eventTime, src)); queues.insert(Time(0), eventTime, Event(startTime, src, res)); return res; } Ptr addRandomSpike(Ptr src, RNG::seed_t seed) { Time eventTime = startTime + RNG::expo(seed, 1 / ModelConsts::RandomFreq); Ptr res(indices.get>().add (startTime, eventTime, src)); queues.insert(Time(0), eventTime, Event(eventTime, src, res)); return res; } // data structs typedef SimLoop sim_t; sim_t::indices_t indices; sim_t::queues_t queues; sim_t::pc_t pc; Topology topo; }; using namespace std; int main(int argc, char **argv) { using boost::mpl::pair; using boost::mpl::list; FakeSim data; // read cmd line arg if (argc > 2) { cout << "Usage: " << argv[0] << " [random-seed=0]"; } char *tail; RNG::seed_t rng(0); if (argc == 2) { rng = RNG::seed_t(strtoll(argv[1], &tail, 10)); assert(*tail == 0); } // init values (except weight) data.pc.cast(PLA_Init_Default()); // init random seed (different one for every neuron) for (Ptr i : Ptr().childs()) { data.pc.cast(PLA_Set(Time(0), i, RNG::split(rng))); rng = RNG::next(rng, 40); } // TODO: add a global event to start trainer PLA_Get get(Ptr(0)); data.addGlobalMsg(RNG::split(rng)); rng = RNG::next(rng, 40); // add a random noise source for every neuron for (Ptr i : Ptr().childs()) if (i() < ModelConsts::NumExcitatory) { // exclude special neurons data.addRandomSpike(i, RNG::split(rng)); rng = RNG::next(rng, 40); } // TODO: add discrete properties to the created events return 0; }