// Main loop for an instance of the algorithm. double run() { size_t i; size_t j; size_t k; printf("Initialization.\n"); init_medoids(); if(verbose) print_medoids(medoids); for(k = 0; k < clustc; ++k) { for(j = 0; j < dmatrixc; ++j) { weights[k][j] = 1.0; } } if(verbose) print_weights(weights); update_memb(); if(verbose) print_memb(memb); double prev_adeq = 0.0; double adeq = adequacy_obj(false); printf("Adequacy: %.20lf\n", adeq); double diff = fabs(adeq - prev_adeq); for(i = 1; i <= max_iter && diff > epsilon; ++i) { printf("Iteration %d.\n", i); prev_adeq = adeq; adequacy_cluster(false); update_medoids(); adeq = adequacy_cluster(true); if(verbose) { print_medoids(medoids); printf("Adequacy1: %.20lf\n", adeq); } adequacy_cluster(false); update_weights(); adeq = adequacy_cluster(true); if(verbose) { print_weights(weights); printf("Adequacy2: %.20lf\n", adeq); } adequacy_obj(false); update_memb(); adeq = adequacy_obj(true); if(verbose) print_memb(memb); printf("Adequacy: %.20lf\n", adeq); if(dgt(adeq, prev_adeq)) { printf("Warn: current adequacy is greater than " "previous iteration (%.20lf)\n", adeq - prev_adeq); } diff = fabs(adeq - prev_adeq); } printf("Adequacy difference threshold reached (%.20lf).\n", diff); return adeq; }
double run() { printf("Initialization.\n"); init_memb(); if(verbose) print_memb(&memb); init_weights(); if(verbose) print_weights(&weights); beta = 0.0; double adeq = adequacy(); printf("Adequacy: %.15lf\n", adeq); double prev_iter_adeq; double adeq_diff; size_t iter = 1; st_matrix prev_memb; init_st_matrix(&prev_memb, objc, clustc); do { printf("Iteration %d:\n", iter); prev_iter_adeq = adeq; global_dissim(); compute_membvec(); if(compute_dists()) { do { if(verbose) { printf("Distances:\n"); print_st_matrix(&dists, 10, true); } } while(adjust_dists()); } if(verbose) { printf("Distances:\n"); print_st_matrix(&dists, 10, true); } mtxcpy(&prev_memb, &memb); update_memb(); if(verbose) print_memb(&memb); update_weights(); if(verbose) print_weights(&weights); adeq = adequacy(); printf("Adequacy: %.15lf\n", adeq); adeq_diff = prev_iter_adeq - adeq; if(adeq_diff < 0.0) { adeq_diff = fabs(adeq_diff); printf("Warn: previous iteration adequacy is greater " "than current (%.15lf).\n", adeq_diff); } if(adeq_diff < epsilon) { printf("Adequacy difference threshold reached (%.15lf)." "\n", adeq_diff); break; } if(++iter > max_iter) { printf("Maximum number of iterations reached.\n"); break; } } while(true); free_st_matrix(&prev_memb); printf("Beta: %.15lf\n", beta); return adeq; }