void pcnn_dynamic::allocate_time_signal(pcnn_time_signal & time_signal) const { time_signal.resize(size()); for (size_t t = 0; t < size(); t++) { const pcnn_network_state & state_network = (*this)[t]; for (unsigned int i = 0; i < number_oscillators(); i++) { if (state_network.m_output[i] == OUTPUT_ACTIVE_STATE) { time_signal[t]++; } } } }
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); } } }
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); } } } }
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); } } }