double fscore(vector<vector<vector<bool> > > sample, Corpus &corpus) { int tp = 0, fp = 0, tn = 0, fn = 0; for (int a = 0; a < sample.size(); a++) { for (int d = 0; d < sample[a].size(); d++) { if (corpus.isObscured(a, d)) { for (int r = 0; r < sample[a][d].size(); r++) { if (a != r) { int trueEdge = corpus.getEdge(a, d, r); if (sample[a][d][r]) { if (trueEdge) { tp++; } else { fp++; } } else { if (trueEdge) { fn++; } else { tn++; } } } } } } } double precision = (1.0 * tp) / (tp + fp); double recall = (1.0 * tp) / (tp + fn); cout << "tp: " << tp << ", fp: " << fp << ", tn: " << tn << ", fn: " << fn << "\n"; cout << "Precision: " << precision << "; Recall: " << recall << "\n"; return 2 * precision * recall / (precision + recall); }