void print_semester_topological(std::istream & input, std::ostream& out) { auto catalog = read_modules(input); update_earliest_semester(catalog); auto modules = values(catalog); std::sort(std::begin(modules), std::end(modules), [](module_ptr lhs, module_ptr rhs) { return lhs->get_earliest_semester() < rhs->get_earliest_semester(); }); auto last_semester = (*std::rbegin(modules))->get_earliest_semester(); for (auto semester = 1u; semester <= last_semester; semester++) { auto range = std::equal_range(std::begin(modules), std::end(modules), semester, semester_comparator{}); out << semester << ": "; std::copy(range.first, range.second, std::ostream_iterator<module_ptr>{out, " "}); out << "\n"; } }
/* function to compute the jaccard accuracy of comparing a partitioned network with a defined network */ double jaccard (char answer_file[], char input_file[]) { double sim, max, sum1, sum2, acc; int overlap, num_lines, num_nodes; char *tmp_nodes; int i,j, k, l, num_edges, *pnum_edges, num_modules, *pnum_modules, num_answer_modules, *pnum_answer_modules; ModulePtr modules, module, answer_modules, answer_module; num_answer_modules = 0; pnum_answer_modules = &num_answer_modules; num_lines = process_file(answer_file); answer_modules = (ModulePtr) malloc(num_lines * sizeof(ModuleStr)) - 1; num_modules = 0; pnum_modules = &num_modules; num_lines = process_file(input_file); modules = (ModulePtr) malloc(num_lines * sizeof(ModuleStr)) - 1; read_modules(answer_file, pnum_answer_modules, answer_modules); read_modules(input_file, pnum_modules, modules); num_nodes = 0; for (i = 1; i <= num_modules; i ++) { module = modules + i; for (j = 1; j <= module->num_nodes; j ++) { if (num_nodes < module->nodes[j]) { num_nodes = module->nodes[j]; } } } sum1 = 0; sum2 = 0; for (i = 1; i <= num_modules; i ++) { module = modules + i; tmp_nodes = (char *) calloc(num_nodes, sizeof(char)) - 1; for (j = 1; j <= module->num_nodes; j ++) { tmp_nodes[module->nodes[j]] = 1; } max = 0; if (module->num_nodes == 0) { continue;} for (l = 1; l <= num_answer_modules; l ++) { answer_module = answer_modules + l; overlap = 0; for (j = 1; j <= answer_module->num_nodes; j ++) { if (tmp_nodes[answer_module->nodes[j]]) { overlap ++; } } sim = (double) overlap / (module->num_nodes + answer_module->num_nodes - overlap); if (max < sim) { max = sim; } } sum1 += max * module->num_nodes; sum2 += module->num_nodes; free(tmp_nodes + 1); } acc = (double) sum1 / sum2; for (i = 1; i <= num_modules; i ++) { module = modules + i; if (module->num_nodes == 0) { continue;} free (module->nodes + 1); } for (i = 1; i <= num_answer_modules; i ++) { module = answer_modules + i; if (module->num_nodes == 0) { continue;} free (module->nodes + 1); } free(answer_modules + 1); free(modules + 1); return acc; }