// $(VARIANT) -nogui -dhrg embedded-graphs/facebook_combined_result -contll -iterate 99 -contll -esave > $@ namespace rogueviz { namespace embeddings { struct pairdata { ld success, route_length; }; #define NOYET 127 vector > actual; vector pairs; vector last_goal; vector next_stop; void prepare_pairs() { int N = isize(rogueviz::vdata); pairs.resize(N); actual.resize(N); for(int i=0; i bfsqueue; auto& p = actual[i]; auto visit = [&] (int j, int d) { if(p[j] == NOYET) { p[j] = d; bfsqueue.push_back(j); } }; visit(i, 0); for(int k=0; k& distances_from_goal) { if(last_goal[src] == goal) return; if(src == goal) { pairs[src].success = 1; pairs[src].route_length = 0; next_stop[src] = -1; } else { ld bestd = distances_from_goal[src] - 1e-5; /* iprintf("route_from goal=%d a=%d, bestd = %f\n", goal, src, bestd + 1e-5); indent += 2; */ vector candidates; for(auto& ed: rogueviz::vdata[src].edges) { int e = ed.first; ld d = e == goal ? -1 : distances_from_goal[e]; if(d < bestd) bestd = d, candidates.clear(); if(d == bestd) candidates.push_back(e); } pairs[src].success = pairs[src].route_length = 0; for(int c: candidates) { route_from(c, goal, distances_from_goal); // iprintf("candidate = %d\n", c); pairs[src].success += pairs[c].success / isize(candidates); pairs[src].route_length += (1 + pairs[c].route_length) / isize(candidates); } if(isize(candidates) > 0) next_stop[src] = candidates[0]; else next_stop[src] = -1; // iprintf("success = %f, route = %f\n", pairs[src].success, pairs[src].route_length); // indent -= 2; } last_goal[src] = goal; } void greedy_routing_to(iddata& d, int goal) { int N = isize(rogueviz::vdata); vector distances_from_goal(N); for(int src=0; srcdistance(goal, src); for(int src=0; src reps; vector values; auto report = [&] (string s, ld val) { values.push_back(val); reps.push_back(s); println(hlog, "REPORT ", s, " = ", val); }; if(1) { FILE *f = fopen(("embout/" + s).c_str(), "rb"); char buf[999999]; int siz = fread(buf, 1, 999999, f); for(int i=0; iget_growth()); } #endif int current_goal; iddata prepared; void prepare_goal(int goal) { greedy_routing_to(prepared, current_goal = goal); } vector path(int src) { vector res; while(src != -1) { res.push_back(src); src = next_stop[src]; } return res; } int get_actual(int src) { return actual[src][current_goal]; } int routing_args() { using namespace arg; if(argis("-routing")) { // shift(); routing_test(args()); } else if(argis("-gr")) { iddata result; prepare_pairs(); greedy_routing(result); println(hlog, "success = ", result.suc / result.tot, " stretch = ", result.routedist / result.bestdist); } else return 1; return 0; } auto arou = addHook(hooks_args, 50, routing_args); } }