XMLSerializer* ResultSet::toHtmlTable (XMLSerializer* xml, const char* tableClass) { if (xml == NULL) xml = new XMLSerializer(" "); xml->open("table"); if (tableClass != NULL) xml->attribute("class", "results"); { const VariableVector cols = getOrderedVars(); xml->open("tr"); { for (VariableVector::const_iterator col = cols.begin(); col != cols.end(); ++col) xml->leaf("th", (*col)->toString()); } xml->close(); for (ResultSetConstIterator row = begin(); row != end(); ++row) { xml->open("tr"); { for (VariableVector::const_iterator col = cols.begin(); col != cols.end(); ++col) { const POS* val = (*row)->get(*col); if (val != NULL) xml->leaf("td", val->toString()); else xml->leaf("td", ""); } } xml->close(); } } xml->close(); return xml; }
VariableVector add_variable_vectors(const VariableVector& vec1, const VariableVector& vec2) { VariableVector empty; VariableVector sum; string var_name; double component_sum; // if the vectors are of different sizes, return empty if (vec1.size() != vec2.size()) return empty; for (VariableVector::const_iterator it1 = vec1.begin(); it1 != vec1.end(); ++it1) { var_name = it1->first; // if this variable is in both vectors, add the values if (vec2.count(var_name) != 0) { component_sum = it1->second + vec2.at(var_name); sum.insert(make_pair(var_name, component_sum)); } // if this variable is only in vec1, return empty else { return empty; } } // if we reach this point, every variable in vec1 is also in vec2 // since both vectors are of the same size, it is safe to return return sum; }
VariableVector increment_weight_vector(const VariableVector& weights, const VariableVector& scaled_gradient) { VariableVector empty; if (weights.size() != scaled_gradient.size()) { return empty; } VariableVector incremented; string partial_name, weight_name; double scaled_partial, weight_val; for (VariableVector::const_iterator it = scaled_gradient.begin(); it != scaled_gradient.end(); ++it) { partial_name = it->first; scaled_partial = it->second; weight_name = partial_name_to_weight_name(partial_name); if (weights.count(weight_name) == 0) { return empty; } weight_val = weights.at(weight_name); incremented.insert(make_pair(weight_name, weight_val + scaled_partial)); } return incremented; }
double distance_between_variable_vectors(const VariableVector& vec1, const VariableVector& vec2) { // Both vectors must have the same dimension if (vec1.size() != vec2.size()) { return -1; } double square_distance = 0; string var_name; double val1, val2; for (VariableVector::const_iterator it = vec1.begin(); it != vec1.end(); ++it) { var_name = it->first; // Both vectors must have exactly the same variables if (vec2.count(var_name) == 0) { return -1; } val1 = vec1.at(var_name); val2 = vec2.at(var_name); square_distance += pow((val1 - val2), 2); } return pow(square_distance, 0.5); }
VariableVector scale_variable_vector(const VariableVector& vec, double scaling_factor) { VariableVector scaled; for (VariableVector::const_iterator it = vec.begin(); it != vec.end(); ++it) { scaled.insert(make_pair(it->first, it->second * scaling_factor)); } return scaled; }
const VariableVector variable_vector_union(const VariableVector& vec1, const VariableVector& vec2) { VariableVector empty; VariableVector v; // add all the variables in Vec 1 first // if any of these variables are seen in Vec 2, this is an error. Return the empty Variable Vector. // if there is no overlap, then it is safe to add all the variables in Vec 2 for (VariableVector::const_iterator it1 = vec1.begin(); it1 != vec1.end(); ++it1) { if (vec2.count(it1->first) != 0) { return empty; } v.insert(make_pair(it1->first, it1->second)); } for (VariableVector::const_iterator it2 = vec2.begin(); it2 != vec2.end(); ++it2) { v.insert(make_pair(it2->first, it2->second)); } return v; }
VariableVector component_wise_div(const VariableVector& vec, double divisor) { VariableVector quotient; if (divisor == 0) { cerr << "Cannot divide by 0." << endl; return quotient; } for (VariableVector::const_iterator it = vec.begin(); it != vec.end(); ++it) { quotient.insert(make_pair(it->first, it->second / divisor)); } return quotient; }
XMLSerializer* ResultSet::toXml (XMLSerializer* xml) { if (xml == NULL) xml = new XMLSerializer(" "); xml->open("sparql"); xml->attribute("xmlns", "http://www.w3.org/2005/sparql-results#"); xml->open("head"); const VariableVector cols = getOrderedVars(); for (VariableVectorConstIterator varIt = cols.begin() ; varIt != cols.end(); ++varIt) { xml->empty("variable"); xml->attribute("name", (*varIt)->getLexicalValue()); } xml->close(); xml->open("results"); for (ResultSetIterator it = begin() ; it != end(); it++) (*it)->toXml(xml); xml->close(); xml->close(); return xml; }
bool operator() (const Result* lhs, const Result* rhs) { for (VariableVectorConstIterator it = vars.begin(); it != vars.end(); ++it) { // SPARQLSerializer s; // pair.expression->express(&s); const POS* l = lhs->get(*it); const POS* r = rhs->get(*it); if (r == NULL) { if (l == NULL) continue; else return false; } if (l == NULL) return true; if (dynamic_cast<const Bindable*>(l) && dynamic_cast<const Bindable*>(r)) continue; if (l != r) return posFactory->lessThan(l, r); } return false; }
std::string ResultSet::toString (NamespaceMap* namespaces) const { std::stringstream s; if (resultType == RESULT_Boolean) return size() > 0 ? "true\n" : "false\n" ; else if (resultType == RESULT_Graphs) return std::string("<RdfDB result>\n") + db->toString() + "\n</RdfDB result>"; /* Get column widths and fill namespace declarations. */ std::vector< const POS* > vars; std::vector< size_t > widths; unsigned count = 0; unsigned lastInKnownVars = 0; { std::map< const POS*, unsigned > pos2col; const VariableVector cols = getOrderedVars(); // vars = getOrderedVars(); for (VariableVectorConstIterator varIt = cols.begin() ; varIt != cols.end(); ++varIt) { const POS* var = *varIt; pos2col[var] = count++; widths.push_back(var->toString().size()); vars.push_back(var); } VariableList intruders; lastInKnownVars = count; for (ResultSetConstIterator row = results.begin() ; row != results.end(); ++row) for (BindingSetIterator b = (*row)->begin(); b != (*row)->end(); ++b) { const POS* var = b->first; if (pos2col.find(var) == pos2col.end()) { /* Error: a variable not listed in knownVars. */ pos2col[var] = count++; std::string rendered(render(var, namespaces)); widths.push_back(rendered.size()); vars.push_back(var); intruders.insert(var); } std::string rendered(render(b->second.pos, namespaces)); size_t width = rendered.size(); if (width > widths[pos2col[var]]) widths[pos2col[var]] = width; } } /* Generate ResultSet string. */ /* Top Border */ unsigned i; for (i = 0; i < count; i++) { s << (i == 0 ? (ordered == true ? BoxChars::GBoxChars->ordered : BoxChars::GBoxChars->ul) : BoxChars::GBoxChars->us); s << STRING(widths[i]+2, BoxChars::GBoxChars->ub); } s << BoxChars::GBoxChars->ur << std::endl; /* Column Headings */ for (i = 0; i < count; i++) { const POS* var = vars[i]; s << (i == 0 ? BoxChars::GBoxChars->rl : i < lastInKnownVars ? BoxChars::GBoxChars->rs : BoxChars::GBoxChars->unlistedVar) << ' '; size_t width = var->toString().length(); s << var->toString() << STRING(widths[i] - width, BoxChars::GBoxChars->rb) << ' '; // left justified. } s << BoxChars::GBoxChars->rr << std::endl; /* Rows */ for (ResultSetConstIterator row = results.begin() ; row != results.end(); row++) { #if (INTRA_ROW_SEPARATORS) /* Intra-row Border */ for (i = 0; i < count; i++) { s << (i == 0 ? BoxChars::GBoxChars->sl : BoxChars::GBoxChars->ss); s << std::string(widths[i]+2, BoxChars::GBoxChars->sb); } s << BoxChars::GBoxChars->sr << std::endl; #endif /* Values */ for (i = 0; i < count; ++i) { const POS* var = vars[i]; const POS* val = (*row)->get(var); const std::string str = render(val, namespaces); s << (i == 0 ? BoxChars::GBoxChars->rl : BoxChars::GBoxChars->rs) << ' '; size_t width = str.length(); s << STRING(widths[i] - width, BoxChars::GBoxChars->rb) << str << ' '; // right justified. } s << BoxChars::GBoxChars->rr << std::endl; } /* Bottom Border */ for (i = 0; i < count; i++) { s << (i == 0 ? BoxChars::GBoxChars->ll : BoxChars::GBoxChars->ls); s << STRING(widths[i]+2, BoxChars::GBoxChars->lb); } s << BoxChars::GBoxChars->lr << std::endl; return s.str(); }
void print_variable_vector(VariableVector v) { for (VariableVector::iterator it = v.begin(); it != v.end(); ++it) { cout << "name: " << it->first << ", val: " << it->second << endl; } }