30 want_snapshot_ =
false;
39 DoResEx(&matl_manager, &genrsrc_manager);
46#ifdef CYCLUS_WITH_PYTHON
58 ->
AddVal(
"EarlyTerm", want_kill_)
59 ->
AddVal(
"EndTime", time_-1)
65void Timer::DoBuild() {
67 std::vector<std::pair<std::string, Agent*> > build_list = build_queue_[time_];
68 for (
int i = 0; i < build_list.size(); ++i) {
70 Agent* parent = build_list[i].second;
72 <<
" from parent " << build_list[i].second;
75 parent->BuildNotify(m);
77 CLOG(
LEV_DEBUG1) <<
"Hey! Listen! Built an Agent without a Parent.";
85 for (TimeListener* agent : py_tickers_) {
89 #pragma omp parallel for
90 for (
size_t i = 0; i < cpp_tickers_.size(); ++i) {
91 cpp_tickers_[i]->Tick();
95void Timer::DoResEx(ExchangeManager<Material>* matmgr,
96 ExchangeManager<Product>* genmgr) {
101void Timer::DoTock() {
102 for (TimeListener* agent : py_tickers_) {
106 #pragma omp parallel for
107 for (
size_t i = 0; i < cpp_tickers_.size(); ++i) {
108 cpp_tickers_[i]->Tock();
112 std::set<Agent*> ags = ctx_->agent_list_;
113 std::vector<Agent*> agent_vec(ags.begin(), ags.end());
114 #pragma omp parallel for
115 for (
int i = 0; i < agent_vec.size(); i++) {
116 Agent* a = agent_vec[i];
117 if (a->enter_time() != -1) {
118 RecordInventories(a);
124void Timer::DoDecision() {
125 for (std::map<int, TimeListener*>::iterator agent = tickers_.begin();
126 agent != tickers_.end();
128 agent->second->Decision();
132void Timer::RecordInventories(Agent* a) {
134 Inventories::iterator it2;
135 for (it2 = invs.begin(); it2 != invs.end(); ++it2) {
136 std::string
name = it2->first;
137 std::vector<Resource::Ptr> mats = it2->second;
143 for (
int i = 1; i < mats.size(); i++) {
146 RecordInventory(a, name, m);
150void Timer::RecordInventory(Agent* a, std::string name,
Material::Ptr m) {
154 CompMap::iterator it;
155 for (it = c.begin(); it != c.end(); ++it) {
157 ->
AddVal(
"AgentId", a->id())
158 ->AddVal(
"Time", time_)
159 ->
AddVal(
"InventoryName", name)
160 ->
AddVal(
"NucId", it->first)
161 ->
AddVal(
"Quantity", it->second)
162 ->
AddVal(
"Units", m->units())
170 ctx_->
NewDatum(
"ExplicitInventoryCompact")
171 ->
AddVal(
"AgentId", a->id())
173 ->
AddVal(
"InventoryName", name)
174 ->
AddVal(
"Quantity", m->quantity())
175 ->
AddVal(
"Units", m->units())
176 ->
AddVal(
"Composition", c)
181void Timer::DoDecom() {
183 std::vector<Agent*> decom_list = decom_queue_[time_];
184 for (
int i = 0; i < decom_list.size(); ++i) {
185 Agent* m = decom_list[i];
186 if (m->parent() != NULL) {
187 m->parent()->DecomNotify(m);
194 tickers_[agent->
id()] = agent;
196 py_tickers_.push_back(agent);
198 cpp_tickers_.push_back(agent);
203 tickers_.erase(tl->
id());
206 std::remove(py_tickers_.begin(), py_tickers_.end(), tl),
211 std::remove(cpp_tickers_.begin(), cpp_tickers_.end(), tl),
219 throw ValueError(
"Cannot schedule build for t < [current-time]");
221 build_queue_[t].push_back(std::make_pair(proto_name, parent));
226 throw ValueError(
"Cannot schedule decommission for t < [current-time]");
234 std::map<int, std::vector<Agent*> >::iterator it;
236 for (it = decom_queue_.begin(); it != decom_queue_.end(); ++it) {
238 std::vector<Agent*> ags = it->second;
239 for (
int i = 0; i < ags.size(); i++) {
241 CLOG(
LEV_WARN) <<
"scheduled over previous decommissioning of " << m->
id();
242 decom_queue_[t].erase(decom_queue_[t].begin()+i);
252 decom_queue_[t].push_back(m);
261 cpp_tickers_.clear();
263 build_queue_.clear();
264 decom_queue_.clear();
269 if (si.
m0 < 1 || si.
m0 > 12) {
270 throw ValueError(
"Invalid month0; must be between 1 and 12 (inclusive).");
287Timer::Timer() : time_(0), si_(0), want_snapshot_(false), want_kill_(false) {}
The abstract base class used by all types of agents that live and interact in a simulation.
virtual void Build(Agent *parent)
Called when the agent enters the smiulation as an active participant and is only ever called once.
virtual const int id() const
The agent instance's unique ID within a simulation.
A simulation context provides access to necessary simulation-global functions and state.
T * CreateAgent(std::string proto_name)
Create a new agent by cloning the named prototype.
Datum * NewDatum(std::string title)
See Recorder::NewDatum documentation.
Datum * AddVal(const char *field, boost::spirit::hold_any val, std::vector< int > *shape=NULL)
Add an arbitrary field-value pair to the datum.
void Record()
Record this datum to its Recorder.
The ExchangeManager is designed to house all of the internals involved in executing a resource exchan...
virtual const int id() const =0
boost::shared_ptr< Material > Ptr
Container for a static simulation-global parameters that both describe the simulation and affect its ...
int m0
start month for the simulation: Jan = 1, ..., Dec = 12
bool explicit_inventory_compact
True if per-agent inventories should be explicitly queried/recorded every time step in a table (i....
int duration
length of the simulation in timesteps (months)
int branch_time
timestep at which simulation branching occurs if any
bool explicit_inventory
True if per-agent inventories should be explicitly queried/recorded every time step in a table (i....
static void Snapshot(Context *ctx)
Records a snapshot of the current state of the simulation being managed by ctx into the simulation's ...
The TimeListener class is an inheritable class for any Agent that requires knowlege of ticks and tock...
int time()
Returns the current time, in months since the simulation started.
void UnregisterTimeListener(TimeListener *tl)
Removes an agent from receiving tick/tock notifications.
int dur()
Returns the duration of the simulation this Timer's timing.
void SchedBuild(Agent *parent, std::string proto_name, int t)
Schedules the named prototype to be built for the specified parent at timestep t.
void Reset()
resets all data (registered listeners, etc.) to empty or initial state
void RunSim()
Runs the simulation.
void RegisterTimeListener(TimeListener *agent)
Registers an agent to receive tick/tock notifications every timestep.
void Initialize(Context *ctx, SimInfo si)
Sets intial time-related parameters for the simulation.
void SchedDecom(Agent *m, int time)
Schedules the given Agent to be decommissioned at the specified timestep t.
For values that are too big, too small, etc.
Code providing rudimentary logging capability for the Cyclus core.
void Normalize(CompMap *v, double val)
The sum of quantities of all nuclides of v is normalized to val.
taken directly from OsiSolverInterface.cpp on 2/17/14 from https://projects.coin-or....
@ LEV_INFO3
Information helpful for simulation users and developers alike.
@ LEV_DEBUG1
debugging information - least verbose
@ LEV_WARN
Use to report questionable simulation state (use extremely sparingly)
@ LEV_INFO2
Information helpful for simulation users and developers alike.
@ LEV_INFO1
Information helpful for simulation users and developers alike - least verbose.
std::map< Nuc, double > CompMap
a raw definition of nuclides and corresponding (dimensionless quantities).
std::vector< typename T::Ptr > ResCast(std::vector< Resource::Ptr > rs)
Casts a vector of Resources into a vector of a specific resource type T.
std::map< std::string, std::vector< Resource::Ptr > > Inventories
map<inventory_name, vector<resources_in_inventory> >.
std::string name(int nuc)