// $(VARIANT) -nogui -dhrg embedded-graphs/facebook_combined_result -contll -iterate 99 -contll -esave > $@ namespace dhrg { struct pairdata { ld success, route_length; }; #define NOYET 127 vector > actual; vector pairs; vector last_goal; vector next_stop; int gr_N; using neighborhoodfun = std::function (int)>; void prepare_pairs(int N, const neighborhoodfun& nei) { gr_N = N; 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 res; for(auto ed: rogueviz::vdata[a].edges) { int b = ed.second->i ^ ed.second->j ^ a; res.push_back(b); } return res; }); } void route_from(int src, int goal, const vector& 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.second->i ^ ed.second->j ^ src; 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, const distfun& distance_function) { vector distances_from_goal(gr_N); 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()); } int current_goal; iddata prepared; void prepare_goal(int goal) { greedy_routing_to(prepared, current_goal = goal, [] (int i, int j) { return hdist(vertexcoords[i], vertexcoords[j]); }); } 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]; } }