示例#1
0
void sync_dynamic::allocate_sync_ensembles(const double tolerance, ensemble_data<sync_ensemble> & ensembles) const {
	ensembles.clear();

	if (size() > 0) {
		/* push back the first object to the first cluster */
		ensembles.push_back(sync_ensemble());
		ensembles[0].push_back(0);

		sync_dynamic::const_iterator last_state_dynamic = cend() - 1;

		for (unsigned int i = 1; i < number_oscillators(); i++) {
			bool cluster_allocated = false;
			ensemble_data<sync_ensemble>::iterator last_sync_ensemble_element = ensembles.end();

			for (ensemble_data<sync_ensemble>::iterator cluster = ensembles.begin(); cluster != last_sync_ensemble_element; cluster++) {
				sync_ensemble::const_iterator last_cluster_element = (*cluster).cend();

				for (sync_ensemble::const_iterator iter_neuron_index = (*cluster).cbegin(); iter_neuron_index != last_cluster_element; iter_neuron_index++) {
					unsigned int index = (*iter_neuron_index);

                    double phase_first = (*last_state_dynamic).m_phase[i];
                    double phase_second = (*last_state_dynamic).m_phase[index];

                    double phase_shifted = std::abs((*last_state_dynamic).m_phase[i] - 2 * pi());

					if ( ( (phase_first < (phase_second + tolerance)) && (phase_first > (phase_second - tolerance)) ) || 
                         ( (phase_shifted < (phase_second + tolerance)) && (phase_shifted > (phase_second - tolerance)) ) ) {

						cluster_allocated = true;
						(*cluster).push_back(i);

						break;
					}
				}

				if (cluster_allocated == true) {
					break;
				}
			}

			if (cluster_allocated == false) {
				sync_ensemble allocated_cluster;
				allocated_cluster.push_back(i);
				ensembles.push_back(allocated_cluster);
			}
		}
	}
}
示例#2
0
void pcnn_dynamic::allocate_spike_ensembles(ensemble_data<pcnn_ensemble> & ensembles) const {
	for (const_iterator iter_state = cbegin(); iter_state != cend(); iter_state++) {
		pcnn_ensemble ensemble;
		const pcnn_network_state & state_network = (*iter_state);

		for (unsigned int i = 0; i < number_oscillators(); i++) {
			if (state_network.m_output[i] == OUTPUT_ACTIVE_STATE) {
				ensemble.push_back(i);
			}
		}

		if (!ensemble.empty()) {
			ensembles.push_back(ensemble);
		}
	}
}
示例#3
0
void pcnn_dynamic::allocate_sync_ensembles(ensemble_data<pcnn_ensemble> & ensembles) const {
	std::unordered_set<unsigned int> traverse_oscillators;
	traverse_oscillators.reserve(number_oscillators());

	for (const_reverse_iterator iter_state = crbegin(); iter_state != crend(); iter_state++) {
		pcnn_ensemble ensemble;
		const pcnn_network_state & state_network = (*iter_state);

		for (unsigned int i = 0; i < number_oscillators(); i++) {
			if (state_network.m_output[i] == OUTPUT_ACTIVE_STATE) {
				if (traverse_oscillators.find(i) == traverse_oscillators.end()) {
					ensemble.push_back(i);
					traverse_oscillators.insert(i);
				}
			}
		}

		if (!ensemble.empty()) {
			ensembles.push_back(ensemble);
		}
	}
}