1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2026-05-15 02:32:07 +00:00
Files
hyperrogue/rogueviz/embeddings/maprank.cpp
T
2026-04-29 21:50:18 +02:00

74 lines
2.1 KiB
C++

// compute mAP/MeanRank rankings, for general continuous distances
namespace rogueviz {
namespace embeddings {
rankinfo continuous_ranks() {
rankinfo ri;
int N = get_n();
if(1) {
progressbar pb(N/threads, "continuous ranks");
std::mutex lock;
parallelize(N, [&] (int a, int b) {
ld ltot_ranks = 0, ltot_rby = 0, ltot_map = 0, ltot_n = 0;
for(int i=a; i<b; i++) {
int qty = isize(directed_edges[i]);
if(!qty) continue;
vector<pair<ld, int>> dists(N);
// println(hlog, i, ": ", dists);
for(int j=0; j<N; j++) dists[j] = { current->distance(i, j), 0};
for(auto e: directed_edges[i]) dists[e].second = 1;
/* for(auto& d: dists) if(d.second == 0) d.first += 0.5;
vector<int> ba(MAXDIST, 0), bb(MAXDIST, 0);
for(auto& d: dists) { if(d.second == 1) ba[d.first]++; bb[d.first]++; } */
/* bb[0]--; print(hlog, i, ": "); for(int d=0; d<MAXDIST; d++) if(bb[d]) print(hlog, d, " : ", ba[d],"/",bb[d], " ");
println(hlog); */
// dists[i].first -= 2;
sort(dists.begin(), dists.end());
vector<int> ranks;
int seen = 0;
int bad = 0;
ld for_map = 0;
// note: i itself is in first position
for(int j=0; seen<qty; j++)
if(dists[j].second) {
ltot_ranks += bad;
ranks.push_back(bad+seen);
// if(bad+seen+1 <= qty) for_map++; //
for_map += (seen+1.) / (bad+seen);
// printf("%d/%d ", seen+1, bad+seen);
seen++;
}
else
bad++;
if(a == 0) pb++;
ltot_rby += qty;
ltot_map += for_map / qty;
// println(hlog, "contribution: ", for_map / qty);
ltot_n++;
}
std::unique_lock<std::mutex> lk(lock);
ri.rby += ltot_rby;
ri.map += ltot_map;
ri.ranks += ltot_ranks;
ri.n += ltot_n;
return 0;
});
}
println(hlog, "MeanRank = ", ri.ranks / ri.rby, " MAP = ", ri.map / ri.n);
println(hlog, "data: ", tie(ri.rby, ri.map, ri.ranks, ri.n, N));
return ri;
}
}}