bool Clustering::optimize_partition(bool always_accept) { if (params.verbosity >= 2) params.debug_out << " Optimize partitions" << endl; double loss_before = loss; vector<clus_t> node_clus_before = node_clus; // optimize inside each partition this->node_partition = this->node_clus; reset_to_singletons(); verify_partition(); // sub-trace vector<shared_ptr<TraceStep> > sub_trace, *original_trace_out = trace_out; if (trace_out) { trace_out = &sub_trace; trace("init partition"); } // optimize bool changes = optimize_all_levels(); // done this->node_partition.clear(); trace_out = original_trace_out; // is it an improvement? if (changes && (always_accept || loss < loss_before - epsilon)) { if (params.verbosity >= 2) params.debug_out << " Accepting optimized partitions" << endl; trace("partition",&sub_trace); return true; } else { if (params.verbosity >= 2) params.debug_out << " Rejecting optimized partitions" << endl; this->node_clus = node_clus_before; recalc_internal_data(); return false; } }
int wiiso_verify(wiiso_t disc, unsigned int partition_number, int verify_all_data) { fail_if_closed(); if(partition_number >= disc->num_partitions) { log_error(disc->log_level, "wiiso_verify: bad partition number\n"); return 1; } return verify_partition(disc, partition_number, verify_all_data); }
void Clustering::recalc_internal_data() { if (params.check_invariants) verify_partition(); // recalculate accumulated degrees init_stats(clus_stats, a, &node_clus[0], &node_stats); // find empty clusters fill(clus_size.begin(),clus_size.end(), 0); empty_cluss.clear(); for (size_t i = 0 ; i < node_clus.size() ; ++i) { clus_size[node_clus[i]]++; } for (size_t i = 0 ; i < clus_stats.size() ; ++i) { if (clus_size[i] == 0) { clus_size[i] = -static_cast<int>(empty_cluss.size()); empty_cluss.push_back(i); } } // calculate loss loss = params.lossfun->loss(clus_stats, num_clusters(), &sum_local_loss) + extra_loss_self * clus_stats.total.self / clus_stats.total.degree; }
void Clustering::verify_invariants() const { verify_partition(); verify_clus_stats(); }