void parse_schema(pugi::xml_node node, config::config & conf) { for (pugi::xml_node source_node : node.children("source")) { size_t source_type = source_node.attribute("type").as_uint(); for (pugi::xml_node target_node : source_node.children("target")) { char multiplicity = '*'; size_t target_type = target_node.attribute("type").as_uint(); size_t symbol = target_node.attribute("symbol").as_uint(); string mult_string = target_node.attribute("multiplicity").value(); if (mult_string.size() > 0 && (mult_string[0] == '?' || mult_string[0] == '+' || mult_string[0] == '1')) { multiplicity = mult_string[0]; } pugi::xml_node outdistribution_node = target_node.child("outdistribution"); distribution outdistribution = parse_distribution(outdistribution_node); pugi::xml_node indistribution_node = target_node.child("indistribution"); distribution indistribution = parse_distribution(indistribution_node); if (multiplicity == '1') { // && outdistribution.type == DISTRIBUTION::UNDEFINED) { outdistribution = distribution(DISTRIBUTION::UNIFORM, 1, 1); } else if (multiplicity == '?') {// && outdistribution.type == DISTRIBUTION::UNDEFINED) { outdistribution = distribution(DISTRIBUTION::UNIFORM, 0, 1); } if(outdistribution.type == DISTRIBUTION::UNDEFINED) { outdistribution = distribution(DISTRIBUTION::ZIPFIAN, 0, 2.5); } conf.schema.add_edge(source_type, symbol, target_type, multiplicity, outdistribution, indistribution); //cout << "conf.add_edge " << source_type << " " << symbol << " " << target_type << " " << multiplicity << " " << outdistribution << " " << indistribution <<endl; } } }
void parse_predicates(pugi::xml_node node, config::config & conf) { size_t size = node.child("size").text().as_uint(); //cout << "predicates size: " << size << endl; conf.predicates.resize(size); conf.predicate_distribution = parse_distribution(node.child("distribution")); for (pugi::xml_node alias_node : node.children("alias")) { size_t id = alias_node.attribute("symbol").as_uint();// string name = alias_node.text().get(); //cout << "alias " << id << ", " << name << endl; if (id < 0 || id >= size) { cerr << "id " << id << " is out of range" << endl; continue; } conf.predicates[id].alias = name; } for (pugi::xml_node proportion_node : node.children("proportion")) { size_t id = proportion_node.attribute("symbol").as_uint(); double proportion = proportion_node.text().as_double(); if (id < 0 || id >= size) { cerr << "id " << id << " is out of range" << endl; continue; } conf.predicates[id].proportion = proportion; conf.predicates[id].size = (size_t) (proportion * conf.nb_edges); } }
static Manifest *parse_manifest(xmlNodePtr element, const unsigned int flags, const gchar *container_filter, const gchar *component_filter) { Manifest *manifest = (Manifest*)g_malloc0(sizeof(Manifest)); xmlNodePtr element_children = element->children; while(element_children != NULL) { if((flags & MANIFEST_DISTRIBUTION_FLAG) && xmlStrcmp(element_children->name, (xmlChar*) "distribution") == 0) manifest->distribution_array = parse_distribution(element_children); else if((flags & MANIFEST_ACTIVATION_FLAG) && xmlStrcmp(element_children->name, (xmlChar*) "activation") == 0) manifest->activation_array = parse_activation(element_children); else if((flags & MANIFEST_SNAPSHOT_FLAG) && xmlStrcmp(element_children->name, (xmlChar*) "snapshots") == 0) manifest->snapshots_array = parse_snapshots(element_children, container_filter, component_filter); else if((flags & MANIFEST_TARGETS_FLAG) && xmlStrcmp(element_children->name, (xmlChar*) "targets") == 0) manifest->target_array = parse_targets(element_children); element_children = element_children->next; } return manifest; }
std::piecewise_linear_distribution<double> parse_distribution(const std::string &func, const double range_min, const double range_max){ double x; exprtk::symbol_table<double> symbol_table; symbol_table.add_variable("x", x); symbol_table.add_function("ProtonBetaSpectrum", ProtonBetaSpectrum); symbol_table.add_function("ElectronBetaSpectrum", ElectronBetaSpectrum); symbol_table.add_function("MaxwellBoltzSpectrum", MaxwellBoltzSpectrum); symbol_table.add_constants(); exprtk::expression<double> expression; expression.register_symbol_table(symbol_table); exprtk::parser<double> parser; parser.compile(func, expression); return parse_distribution( [&x, &expression](const double px){ x = px; return expression.value(); }, range_min, range_max ); }
std::piecewise_linear_distribution<double> parse_distribution(const std::string &func, const double range_min, const double range_max){ double x; exprtk::symbol_table<double> symbol_table; symbol_table.add_variable("x", x); symbol_table.add_function("ProtonBetaSpectrum", ProtonBetaSpectrum); symbol_table.add_function("ElectronBetaSpectrum", ElectronBetaSpectrum); symbol_table.add_function("MaxwellBoltzSpectrum", MaxwellBoltzSpectrum); symbol_table.add_constants(); exprtk::expression<double> expression; expression.register_symbol_table(symbol_table); exprtk::parser<double> parser; parser.compile(func, expression); return parse_distribution( [&x, &expression](const double px){ x = px; return expression.value(); }, range_min, range_max ); } std::piecewise_linear_distribution<double> proton_beta_distribution = parse_distribution(ProtonBetaSpectrum, 0., 750.); std::piecewise_linear_distribution<double> electron_beta_distribution = parse_distribution(ElectronBetaSpectrum, 0., 782000.);