CYCLUS
Loading...
Searching...
No Matches
xml_file_loader.cc
Go to the documentation of this file.
1// Implements file reader for an XML format
2#include "xml_file_loader.h"
3
4#include <algorithm>
5#include <fstream>
6#include <set>
7#include <streambuf>
8
9#include <boost/filesystem.hpp>
10#include <libxml++/libxml++.h>
11
12#include "agent.h"
13#include "blob.h"
14#include "context.h"
15#include "cyc_std.h"
16#include "discovery.h"
17#include "env.h"
18#include "error.h"
19#include "exchange_solver.h"
21#include "greedy_solver.h"
22#include "infile_tree.h"
23#include "logger.h"
24#include "sim_init.h"
26
27namespace cyclus {
28
29namespace fs = boost::filesystem;
30
31void LoadRawStringstreamFromFile(std::stringstream& stream, std::string file) {
32 std::ifstream file_stream(file.c_str());
33 if (!file_stream) {
34 throw IOError("The file '" + file + "' could not be loaded.");
35 }
36
37 stream << file_stream.rdbuf();
38 file_stream.close();
39}
40
41void LoadStringstreamFromFile(std::stringstream& stream, std::string file,
42 std::string format) {
43 std::string inext;
44 if (format == "none") {
45 LoadRawStringstreamFromFile(stream, file);
46 inext = fs::path(file).extension().string();
47 } else {
48 stream << file;
49 }
50 if (inext == ".json" || format == "json") {
51 std::string inxml = cyclus::toolkit::JsonToXml(stream.str());
52 stream.str(inxml);
53 } else if (inext == ".py" || format == "py") {
54 std::string inxml = cyclus::toolkit::PyToXml(stream.str());
55 stream.str(inxml);
56 }
57}
58
59std::string LoadStringFromFile(std::string file, std::string format) {
60 std::stringstream input;
61 LoadStringstreamFromFile(input, file, format);
62 return input.str();
63}
64
65std::vector<AgentSpec> ParseSpecs(std::set<std::string> agent_set) {
66 std::vector<AgentSpec> specs;
67
68 for (const std::string& spec_str : agent_set) {
69 specs.push_back(AgentSpec(spec_str));
70 }
71
72 return specs;
73}
74
75std::vector<AgentSpec> ParseSpecs(std::string infile, std::string format) {
76 std::stringstream input;
77 LoadStringstreamFromFile(input, infile, format);
78 XMLParser parser_;
79 parser_.Init(input);
80 InfileTree xqe(parser_);
81
82 std::set<std::string> unique;
83
84 std::string p = "/simulation/archetypes/spec";
85 int n = xqe.NMatches(p);
86 for (int i = 0; i < n; ++i) {
87 AgentSpec spec(xqe.SubTree(p, i));
88 unique.insert(spec.str());
89 }
90
91 if (unique.size() == 0) {
92 throw ValidationError("failed to parse archetype specs from input file");
93 }
94
95 std::vector<AgentSpec> specs = ParseSpecs(unique);
96
97 return specs;
98}
99
101 std::string schema_path, std::vector<AgentSpec> specs) {
102 Timer ti;
103 Recorder rec;
104 Context ctx(&ti, &rec);
105
106 std::stringstream schema("");
107 LoadStringstreamFromFile(schema, schema_path);
108 std::string master = schema.str();
109
110 std::map<std::string, std::string> subschemas;
111
112 // force element types to exist so we always replace the config string
113 subschemas["region"] = "";
114 subschemas["inst"] = "";
115 subschemas["facility"] = "";
116
117 for (int i = 0; i < specs.size(); ++i) {
118 Agent* m = DynamicModule::Make(&ctx, specs[i]);
119 subschemas[m->kind()] += "<element name=\"" + specs[i].alias() + "\">\n";
120 subschemas[m->kind()] += m->schema() + "\n";
121 subschemas[m->kind()] += "</element>\n";
122 ctx.DelAgent(m);
123 }
124
125 // replace refs in master rng template file
126 std::map<std::string, std::string>::iterator it;
127 for (it = subschemas.begin(); it != subschemas.end(); ++it) {
128 std::string search_str =
129 std::string("@") + it->first + std::string("_REFS@");
130 size_t pos = master.find(search_str);
131 if (pos != std::string::npos) {
132 master.replace(pos, search_str.size(), it->second);
133 }
134 }
135
136 return master;
137}
138
139std::string BuildMasterSchema(std::string schema_path) {
140 std::vector<AgentSpec> specs =
142
143 return BuildMasterSchema(schema_path, specs);
144}
145
146std::string BuildMasterSchema(std::string schema_path, std::string infile,
147 std::string format) {
148 std::vector<AgentSpec> specs = ParseSpecs(infile, format);
149
150 return BuildMasterSchema(schema_path, specs);
151}
152
154 bool atom_basis;
155 std::string basis_str = qe->GetString("basis");
156 if (basis_str == "atom") {
157 atom_basis = true;
158 } else if (basis_str == "mass") {
159 atom_basis = false;
160 } else {
161 throw IOError(basis_str + " basis is not 'mass' or 'atom'.");
162 }
163
164 double value;
165 int key;
166 std::string query = "nuclide";
167 int nnucs = qe->NMatches(query);
168 CompMap v;
169 for (int i = 0; i < nnucs; i++) {
170 InfileTree* nuclide = qe->SubTree(query, i);
171 key = pyne::nucname::id(nuclide->GetString("id"));
172 value = strtod(nuclide->GetString("comp").c_str(), NULL);
173 v[key] = value;
174 CLOG(LEV_DEBUG3) << " Nuclide: " << key << " Value: " << v[key];
175 }
176
177 if (atom_basis) {
179 } else {
181 }
182}
183
185 std::string schema_file,
186 const std::string input_file,
187 const std::string format, bool ms_print)
188 : b_(b), rec_(r) {
189 ctx_ = new Context(&ti_, rec_);
190
191 schema_path_ = schema_file;
192 file_ = input_file;
193 format_ = format;
194 std::stringstream input;
195 LoadStringstreamFromFile(input, file_, format);
196 parser_ = boost::shared_ptr<XMLParser>(new XMLParser());
197 parser_->Init(input);
198 ms_print_ = ms_print;
199 std::stringstream ss;
200 parser_->Document()->write_to_stream_formatted(ss);
201 ctx_->NewDatum("InputFiles")->AddVal("Data", Blob(ss.str()))->Record();
202}
203
207
211
213 std::stringstream ss(master_schema());
214 if (ms_print_) {
215 std::cout << master_schema() << std::endl;
216 }
217 parser_->Validate(ss);
218 LoadControlParams(); // must be first
219 LoadSolver();
220 LoadRecipes();
221 LoadPackages();
223 LoadSpecs();
224 LoadInitialAgents(); // must be last
226 rec_->Flush();
227}
228
230 using std::string;
231 InfileTree xqe(*parser_);
232 InfileTree* qe;
233 std::string query = "/*/commodity";
234
235 std::map<std::string, double> commod_priority;
236 std::string name;
237 double priority;
238 int num_commods = xqe.NMatches(query);
239 for (int i = 0; i < num_commods; i++) {
240 qe = xqe.SubTree(query, i);
241 name = qe->GetString("name");
242 priority = OptionalQuery<double>(qe, "solution_priority", -1);
243 commod_priority[name] = priority;
244 }
245
246 ProcessCommodities(&commod_priority);
247 std::map<std::string, double>::iterator it;
248 for (it = commod_priority.begin(); it != commod_priority.end(); ++it) {
249 ctx_->NewDatum("CommodPriority")
250 ->AddVal("Commodity", it->first)
251 ->AddVal("SolutionPriority", it->second)
252 ->Record();
253 }
254
255 // now load the solver info
256 string config = "config";
257 string greedy = "greedy";
258 string coinor = "coin-or";
259 string solver_name = greedy;
260 bool exclusive = ExchangeSolver::kDefaultExclusive;
261 if (xqe.NMatches("/*/control/solver") == 1) {
262 qe = xqe.SubTree("/*/control/solver");
263 if (qe->NMatches(config) == 1) {
264 solver_name = qe->SubTree(config)->GetElementName(0);
265 }
266 exclusive =
267 cyclus::OptionalQuery<bool>(qe, "allow_exclusive_orders", exclusive);
268 }
269
270 if (!exclusive) {
271 std::stringstream ss;
272 ss << "You have set allow_exclusive_orders to False."
273 << " Many archetypes (e.g., :cycamore:Reactor) will not work"
274 << " as intended with this feature turned off.";
275 Warn<VALUE_WARNING>(ss.str());
276 }
277
278 ctx_->NewDatum("SolverInfo")
279 ->AddVal("Solver", solver_name)
280 ->AddVal("ExclusiveOrders", exclusive)
281 ->Record();
282
283 // now load the actual solver
284 if (solver_name == greedy) {
285 query = string("/*/control/solver/config/greedy/preconditioner");
286 string precon_name = cyclus::OptionalQuery<string>(&xqe, query, greedy);
287 ctx_->NewDatum("GreedySolverInfo")
288 ->AddVal("Preconditioner", precon_name)
289 ->Record();
290 } else if (solver_name == coinor) {
291 query = string("/*/control/solver/config/coin-or/timeout");
292 double timeout = cyclus::OptionalQuery<double>(&xqe, query, -1);
293 query = string("/*/control/solver/config/coin-or/verbose");
294 bool verbose = cyclus::OptionalQuery<bool>(&xqe, query, false);
295 query = string("/*/control/solver/config/coin-or/mps");
296 bool mps = cyclus::OptionalQuery<bool>(&xqe, query, false);
297 ctx_->NewDatum("CoinSolverInfo")
298 ->AddVal("Timeout", timeout)
299 ->AddVal("Verbose", verbose)
300 ->AddVal("Mps", mps)
301 ->Record();
302 } else {
303 throw ValueError("unknown solver name: " + solver_name);
304 }
305}
306
308 std::map<std::string, double>* commod_priority) {
309 double max = std::max_element(commod_priority->begin(),
310 commod_priority->end(),
311 SecondLT<std::pair<std::string, double>>())
312 ->second;
313 if (max < 1) {
314 max = 0; // in case no priorities are specified
315 }
316
317 std::map<std::string, double>::iterator it;
318 for (it = commod_priority->begin(); it != commod_priority->end(); ++it) {
319 if (it->second < 1) {
320 it->second = max + 1;
321 }
322 CLOG(LEV_INFO1) << "Commodity priority for " << it->first << " is "
323 << it->second;
324 }
325}
326
328 InfileTree xqe(*parser_);
329
330 std::string query = "/*/recipe";
331 int num_recipes = xqe.NMatches(query);
332 for (int i = 0; i < num_recipes; i++) {
333 InfileTree* qe = xqe.SubTree(query, i);
334 std::string name = qe->GetString("name");
335 CLOG(LEV_DEBUG3) << "loading recipe: " << name;
336 Composition::Ptr comp = ReadRecipe(qe);
337 comp->Record(ctx_);
338 ctx_->AddRecipe(name, comp);
339 }
340}
341
343 InfileTree xqe(*parser_);
344
345 ctx_->RecordPackage(Package::unpackaged());
346
347 std::string query = "/*/package";
348 int num_packages = xqe.NMatches(query);
349 for (int i = 0; i < num_packages; i++) {
350 InfileTree* qe = xqe.SubTree(query, i);
351 std::string name =
352 cyclus::OptionalQuery<std::string>(qe, "name", "default");
353 CLOG(LEV_DEBUG3) << "loading package: " << name;
354
355 double fill_min = cyclus::OptionalQuery<double>(qe, "fill_min", eps());
356 double fill_max = cyclus::OptionalQuery<double>(
357 qe, "fill_max", std::numeric_limits<double>::max());
358
359 std::string strategy =
360 cyclus::OptionalQuery<std::string>(qe, "strategy", "first");
361
362 ctx_->AddPackage(name, fill_min, fill_max, strategy);
363 }
364}
365
367 InfileTree xqe(*parser_);
368
369 std::string query = "/*/transportunit";
370 int num_transport_units = xqe.NMatches(query);
371 for (int i = 0; i < num_transport_units; i++) {
372 InfileTree* qe = xqe.SubTree(query, i);
373 std::string name =
374 cyclus::OptionalQuery<std::string>(qe, "name", "default");
375 CLOG(LEV_DEBUG3) << "loading transport unit: " << name;
376
377 double fill_min = cyclus::OptionalQuery<double>(qe, "fill_min", eps());
378 double fill_max = cyclus::OptionalQuery<double>(
379 qe, "fill_max", std::numeric_limits<double>::max());
380
381 std::string strategy =
382 cyclus::OptionalQuery<std::string>(qe, "strategy", "first");
383
384 ctx_->AddTransportUnit(name, fill_min, fill_max, strategy);
385 }
386}
387
389 std::vector<AgentSpec> specs = ParseSpecs(file_, format_);
390 for (int i = 0; i < specs.size(); ++i) {
391 specs_[specs[i].alias()] = specs[i];
392 }
393}
394
396 std::map<std::string, std::string> schema_paths;
397 schema_paths["Region"] = "/*/region";
398 schema_paths["Inst"] = "/*/region/institution";
399 schema_paths["Facility"] = "/*/facility";
400
401 InfileTree xqe(*parser_);
402
403 // create prototypes
404 std::string prototype; // defined here for force-create AgentExit tbl
405 std::map<std::string, std::string>::iterator it;
406 for (it = schema_paths.begin(); it != schema_paths.end(); it++) {
407 int num_agents = xqe.NMatches(it->second);
408 for (int i = 0; i < num_agents; i++) {
409 InfileTree* qe = xqe.SubTree(it->second, i);
410 prototype = qe->GetString("name");
411 std::string alias = qe->SubTree("config")->GetElementName(0);
412 AgentSpec spec = specs_[alias];
413
414 Agent* agent = DynamicModule::Make(ctx_, spec);
415
416 // call manually without agent impl injected to keep all Agent state in a
417 // single, consolidated db table
418 agent->Agent::InfileToDb(qe, DbInit(agent, true));
419
420 agent->InfileToDb(qe, DbInit(agent));
421 rec_->Flush();
422
423 std::vector<Cond> conds;
424 conds.push_back(Cond("SimId", "==", rec_->sim_id()));
425 conds.push_back(Cond("SimTime", "==", static_cast<int>(0)));
426 conds.push_back(Cond("AgentId", "==", agent->id()));
427 CondInjector ci(b_, conds);
428 PrefixInjector pi(&ci, "AgentState");
429
430 // call manually without agent impl injected
431 agent->Agent::InitFrom(&pi);
432
433 pi = PrefixInjector(&ci, "AgentState" + spec.Sanitize());
434 agent->InitFrom(&pi);
435 ctx_->AddPrototype(prototype, agent);
436 }
437 }
438
439 // build initial agent instances
440 int nregions = xqe.NMatches(schema_paths["Region"]);
441 for (int i = 0; i < nregions; ++i) {
442 InfileTree* qe = xqe.SubTree(schema_paths["Region"], i);
443 std::string region_proto = qe->GetString("name");
444 Agent* reg = BuildAgent(region_proto, NULL);
445
446 int ninsts = qe->NMatches("institution");
447 for (int j = 0; j < ninsts; ++j) {
448 InfileTree* qe2 = qe->SubTree("institution", j);
449 std::string inst_proto = qe2->GetString("name");
450 Agent* inst = BuildAgent(inst_proto, reg);
451
452 int nfac = qe2->NMatches("initialfacilitylist/entry");
453 for (int k = 0; k < nfac; ++k) {
454 InfileTree* qe3 = qe2->SubTree("initialfacilitylist/entry", k);
455 std::string fac_proto = qe3->GetString("prototype");
456
457 int number = atoi(qe3->GetString("number").c_str());
458 for (int z = 0; z < number; ++z) {
459 Agent* fac = BuildAgent(fac_proto, inst);
460 }
461 }
462 }
463 }
464}
465
466Agent* XMLFileLoader::BuildAgent(std::string proto, Agent* parent) {
467 Agent* m = ctx_->CreateAgent<Agent>(proto);
468 m->Build(parent);
469 if (parent != NULL) {
470 parent->BuildNotify(m);
471 }
472 return m;
473}
474
476 InfileTree xqe(*parser_);
477 std::string query = "/*/control";
478 InfileTree* qe = xqe.SubTree(query);
479
480 std::string handle;
481 if (qe->NMatches("simhandle") > 0) {
482 handle = qe->GetString("simhandle");
483 }
484
485 // get duration
486 std::string dur_str = qe->GetString("duration");
487 int dur = strtol(dur_str.c_str(), NULL, 10);
488 // get start month
489 std::string m0_str = qe->GetString("startmonth");
490 int m0 = strtol(m0_str.c_str(), NULL, 10);
491 // get start year
492 std::string y0_str = qe->GetString("startyear");
493 int y0 = strtol(y0_str.c_str(), NULL, 10);
494 // get decay mode
495 std::string d = OptionalQuery<std::string>(qe, "decay", "manual");
496
497 SimInfo si(dur, y0, m0, handle, d);
498
499 si.explicit_inventory = OptionalQuery<bool>(qe, "explicit_inventory", false);
501 OptionalQuery<bool>(qe, "explicit_inventory_compact", false);
502
503 // get time step duration
505
506 // get epsilon
507 double eps_ = OptionalQuery<double>(qe, "tolerance_generic", 1e-6);
508 cy_eps = si.eps = eps_;
509
510 // get epsilon resources
511 double eps_rsrc_ = OptionalQuery<double>(qe, "tolerance_resource", 1e-6);
512 cy_eps_rsrc = si.eps_rsrc = eps_rsrc_;
513
514 // get seed
515 si.seed = OptionalQuery<int>(qe, "seed", kDefaultSeed);
516
517 // get stride
518 si.stride = OptionalQuery<int>(qe, "stride", kDefaultStride);
519
520 ctx_->InitSim(si);
521}
522
523} // namespace cyclus
std::string Sanitize()
std::string str()
The abstract base class used by all types of agents that live and interact in a simulation.
Definition agent.h:50
virtual void InitFrom(QueryableBackend *b)
Intializes an agent's internal state from the database.
Definition agent.cc:44
virtual void Build(Agent *parent)
Called when the agent enters the smiulation as an active participant and is only ever called once.
Definition agent.cc:144
virtual std::string schema()
Returns an agent's xml rng schema for initializing from input files.
Definition agent.h:334
virtual void InfileToDb(InfileTree *qe, DbInit di)
Translates info for the agent from an input file to the database by reading parameters from the passe...
Definition agent.cc:35
const std::string kind() const
Returns a string that describes the agent subclass (e.g.
Definition agent.h:361
virtual const int id() const
The agent instance's unique ID within a simulation.
Definition agent.h:349
A type to represent variable-length array of bytes for dumping to a cyclus output database.
Definition blob.h:9
static Ptr CreateFromMass(CompMap v)
Creates a new composition from v with its components having appropriate mass-based ratios.
boost::shared_ptr< Composition > Ptr
Definition composition.h:43
static Ptr CreateFromAtom(CompMap v)
Creates a new composition from v with its components having appropriate atom-based ratios.
Wrapper class for QueryableBackends that injects a set of Cond's into every query before being execut...
Represents a condition used to filter rows returned by a query.
A simulation context provides access to necessary simulation-global functions and state.
Definition context.h:146
void DelAgent(Agent *m)
Destructs and cleans up m (and it's children recursively).
Definition context.cc:110
DbInit provides an interface for agents to record data to the output db that automatically injects th...
Definition db_init.h:14
static Agent * Make(Context *ctx, AgentSpec spec)
Returns a newly constructed agent for the given module spec.
static const bool kDefaultExclusive
default value to allow exclusive orders or not
for failed reading/writing to files, network connections, etc..
Definition error.h:55
A class for extracting information from a given XML parser.
Definition infile_tree.h:22
virtual int NMatches(std::string query)
investigates the current status and returns the number of elements matching a query
virtual std::string GetElementName(int index=0)
investigates the current status and returns a string representing the name of a given index
InfileTree * SubTree(std::string query, int index=0)
populates a child infile based on a query and index
virtual std::string GetString(std::string query, int index=0)
investigates the current status and returns a string representing the content of a query at a given i...
static Ptr & unpackaged()
Definition package.cc:23
Wrapper class for QueryableBackends that injects prefix in front of the title/table for every query b...
Interface implemented by backends that support rudimentary querying.
Collects and manages output data generation for the cyclus core and agents during a simulation.
Definition recorder.h:45
Container for a static simulation-global parameters that both describe the simulation and affect its ...
Definition context.h:49
double eps_rsrc
Epsilon for resources in the simulation.
Definition context.h:114
bool explicit_inventory_compact
True if per-agent inventories should be explicitly queried/recorded every time step in a table (i....
Definition context.h:123
double eps
Epsilon in the simulation.
Definition context.h:111
uint64_t stride
Stride length.
Definition context.h:132
uint64_t dt
Duration in seconds of a single time step in the simulation.
Definition context.h:108
uint64_t seed
Seed for random number generator.
Definition context.h:126
bool explicit_inventory
True if per-agent inventories should be explicitly queried/recorded every time step in a table (i....
Definition context.h:118
static void Snapshot(Context *ctx)
Records a snapshot of the current state of the simulation being managed by ctx into the simulation's ...
Definition sim_init.cc:78
Controls simulation timestepping and inter-timestep phases.
Definition timer.h:22
For validating files received via IO.
Definition error.h:67
For values that are too big, too small, etc.
Definition error.h:37
XMLFileLoader(Recorder *r, QueryableBackend *b, std::string schema_file, const std::string input_file="", const std::string format="none", bool ms_print=false)
Create a new loader reading from the xml simulation input file and writing to and initializing the ba...
void LoadPackages()
Loads packages.
void LoadRecipes()
Method to load recipes from either the primary input file or a recipeBook catalog.
std::string format_
the input file format
void LoadControlParams()
Method to load the simulation control parameters.
boost::shared_ptr< XMLParser > parser_
the parser
void LoadSolver()
Method to load the simulation exchange solver.
void LoadSpecs()
Load agent specs from the input file to a map by alias.
bool ms_print_
flag to indicate printing master schema
virtual std::string master_schema()
QueryableBackend * b_
std::string schema_path_
filepath to the schema
void LoadTransportUnits()
Loads Transport Units.
std::map< std::string, AgentSpec > specs_
virtual void LoadInitialAgents()
Creates all initial agent instances from the input file.
Agent * BuildAgent(std::string proto, Agent *parent)
Creates and builds an agent, notifying its parent.
void ProcessCommodities(std::map< std::string, double > *commodity_priority)
Processes commodity priorities, such that any without a defined priority (i.e., are nonpositive),...
std::string file_
the input file name
virtual void LoadSim()
Load an entire simulation from the inputfile.
A helper class to hold xml file data and provide automatic validation.
Definition xml_parser.h:15
void Init(const std::stringstream &input)
initializes a parser with an xml snippet
Definition xml_parser.cc:49
const uint64_t kDefaultSeed
Definition context.h:29
const uint64_t kDefaultStride
Definition context.h:31
const uint64_t kDefaultTimeStepDur
Definition context.h:27
Code providing rudimentary logging capability for the Cyclus core.
#define CLOG(level)
Definition logger.h:40
std::string JsonToXml(std::string s)
Converts a JSON string into an equivalent XML string.
std::string PyToXml(std::string s)
Converts a Python string into an equivalent XML string.
taken directly from OsiSolverInterface.cpp on 2/17/14 from https://projects.coin-or....
Definition agent.cc:14
void LoadRawStringstreamFromFile(std::stringstream &stream, std::string file)
Reads the given file path into the passed stream without modification.
std::set< std::string > DiscoverSpecsInCyclusPath()
Discover archetype specifications that live recursively in CYCLUS_PATH directories.
Definition discovery.cc:134
Composition::Ptr ReadRecipe(InfileTree *qe)
Creates a composition from the recipe in the query engine.
double cy_eps_rsrc
epsilon values to be used by resources
Definition context.cc:22
double cy_eps
generic epsilon values
Definition context.cc:21
void LoadStringstreamFromFile(std::stringstream &stream, std::string file, std::string format)
Reads the given file path as XML into the passed stream.
std::vector< AgentSpec > ParseSpecs(std::set< std::string > agent_set)
Returns a list of the full module+agent spec for all agents in the given set of agent names.
@ LEV_DEBUG3
debugging information
Definition logger.h:72
@ LEV_INFO1
Information helpful for simulation users and developers alike.
Definition logger.h:60
std::map< Nuc, double > CompMap
a raw definition of nuclides and corresponding (dimensionless quantities).
Definition composition.h:17
std::string LoadStringFromFile(std::string file, std::string format)
Reads the given file path and returns an XML string.
double eps()
a generic epsilon value
Definition cyc_limits.h:12
std::string BuildMasterSchema(std::string schema_path, std::vector< AgentSpec > specs)
Builds and returns a master cyclus input xml schema that includes the sub-schemas defined by the prov...
T OptionalQuery(InfileTree *tree, std::string query, T default_val)
a query method for optional parameters
void Warn(const std::string &msg)
Issue a warning with the approriate message, accoring to the current warning settings.
Definition error.h:108
int id(int nuc)
Definition pyne.cc:1019
a less-than comparison for pairs
Definition cyc_std.h:11