Exemple #1
0
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;
	}
}
Exemple #2
0
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);
}
Exemple #3
0
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;
}
Exemple #4
0
void Clustering::verify_invariants() const {
	verify_partition();
	verify_clus_stats();
}