inline long long test(Object* (*make)(int), int (*match)(Object*)) { size_t a = 0; // Accumulator to make sure compiler doesn't take some loop invariants out size_t j = 0; // Incremental number for the current path/object combination. Ensures all path get tested. std::vector<long long> medians(K); // Final verdict of medians for each of the K experiments std::vector<Object*> objects(N); std::vector<long long> timings(M); for (size_t k = 0; k < K; ++k) { for (size_t n = 0; n < N; ++n) objects[n] = make(j++); for (size_t m = 0; m < M; ++m) { time_stamp liStart = get_time_stamp(); for (size_t i = 0; i < N; ++i) a += match(objects[i]); time_stamp liFinish = get_time_stamp(); timings[m] = liFinish-liStart; } for (size_t n = 0; n < N; ++n) delete objects[n]; medians[k] = display("test", timings); // We are looking for a median per N iterations } std::sort(medians.begin(), medians.end()); return cycles(medians[K/2])/N; }
static void mincross_sweep(Agraph_t* g, int dir, boolean reverse) { int r,other,low,high,first,last; int hasfixed; low = GD_minrank(g); high = GD_maxrank(g); if (dir == 0) return; if (dir > 0) { first = low + 1; last = high; dir = 1;} /* down */ else { first = high - 1; last = low; dir = -1;} /* up */ for (r = first; r != last + dir; r += dir) { other = r - dir; hasfixed = medians(g,r,other); reorder(g,r,reverse,hasfixed); } transpose_sweep(g,NOT(reverse)); savebest(g); }
int ChrRegionCluster::mad(std::vector<int>& v) { int m = median(v); std::vector<int> medians(v.size()); std::transform(v.begin(), v.end(), medians.begin(), [m](int i) { return abs(i - m); }); return median(medians); }