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); } } } }