Exemplo n.º 1
0
 def allocate_sync_ensembles(self, tolerance = 0.01, indexes = None):
     """!
     @brief Allocate clusters in line with ensembles of synchronous oscillators where each
            synchronous ensemble corresponds to only one cluster.
            
     @param[in] tolerance (double): Maximum error for allocation of synchronous ensemble oscillators.
     @param[in] indexes (list): List of real object indexes and it should be equal to amount of oscillators (in case of 'None' - indexes are in range [0; amount_oscillators]).
     
     @return (list) Grours (lists) of indexes of synchronous oscillators.
             For example [ [index_osc1, index_osc3], [index_osc2], [index_osc4, index_osc5] ].
     
     """
     
     if (self._ccore_sync_dynamic_pointer is not None):
         ensembles = wrapper.sync_dynamic_allocate_sync_ensembles(self._ccore_sync_dynamic_pointer, tolerance);
         
         if (indexes is not None):
             for ensemble in ensembles:
                 for index in range(len(ensemble)):
                     ensemble[index] = indexes[ ensemble[index] ];
             
         return ensembles;
     
     if ( (self._dynamic is None) or (len(self._dynamic) == 0) ):
         return [];
     
     number_oscillators = len(self._dynamic[0]);
     last_state = self._dynamic[len(self._dynamic) - 1];
     
     clusters = [];
     if (number_oscillators > 0):
         clusters.append([0]);
     
     for i in range(1, number_oscillators, 1):
         cluster_allocated = False;
         for cluster in clusters:
             for neuron_index in cluster:
                 last_state_shifted = abs(last_state[i] - 2 * pi);
                 
                 if ( ( (last_state[i] < (last_state[neuron_index] + tolerance)) and (last_state[i] > (last_state[neuron_index] - tolerance)) ) or
                      ( (last_state_shifted < (last_state[neuron_index] + tolerance)) and (last_state_shifted > (last_state[neuron_index] - tolerance)) ) ):
                     cluster_allocated = True;
                     
                     real_index = i;
                     if (indexes is not None):
                         real_index = indexes[i];
                     
                     cluster.append(real_index);
                     break;
             
             if (cluster_allocated == True):
                 break;
         
         if (cluster_allocated == False):
             clusters.append([i]);
     
     return clusters;
Exemplo n.º 2
0
 def allocate_sync_ensembles(self, tolerance = 0.01):
     """!
     @brief Allocate clusters in line with ensembles of synchronous oscillators where each
            synchronous ensemble corresponds to only one cluster.
            
     @param[in] tolerance (double): Maximum error for allocation of synchronous ensemble oscillators.
     
     @return (list) Grours (lists) of indexes of synchronous oscillators.
             For example [ [index_osc1, index_osc3], [index_osc2], [index_osc4, index_osc5] ].
     
     """
     
     if (self._ccore_sync_dynamic_pointer is not None):
         return wrapper.sync_dynamic_allocate_sync_ensembles(self._ccore_sync_dynamic_pointer, tolerance);
     
     number_oscillators = len(self._dynamic[0]);
     last_state = self._dynamic[len(self._dynamic) - 1];
     
     clusters = [];
     if (number_oscillators > 0):
         clusters.append([0]);
     
     for i in range(1, number_oscillators, 1):
         cluster_allocated = False;
         for cluster in clusters:
             for neuron_index in cluster:
                 last_state_shifted = abs(last_state[i] - 2 * pi);
                 
                 if ( ( (last_state[i] < (last_state[neuron_index] + tolerance)) and (last_state[i] > (last_state[neuron_index] - tolerance)) ) or
                      ( (last_state_shifted < (last_state[neuron_index] + tolerance)) and (last_state_shifted > (last_state[neuron_index] - tolerance)) ) ):
                     cluster_allocated = True;
                     cluster.append(i);
                     break;
             
             if (cluster_allocated == True):
                 break;
         
         if (cluster_allocated == False):
             clusters.append([i]);
     
     return clusters;
Exemplo n.º 3
0
    def allocate_sync_ensembles(self,
                                tolerance=0.01,
                                indexes=None,
                                iteration=None):
        """!
        @brief Allocate clusters in line with ensembles of synchronous oscillators where each synchronous ensemble corresponds to only one cluster.
               
        @param[in] tolerance (double): Maximum error for allocation of synchronous ensemble oscillators.
        @param[in] indexes (list): List of real object indexes and it should be equal to amount of oscillators (in case of 'None' - indexes are in range [0; amount_oscillators]).
        @param[in] iteration (uint): Iteration of simulation that should be used for allocation.
        
        @return (list) Grours (lists) of indexes of synchronous oscillators.
                For example [ [index_osc1, index_osc3], [index_osc2], [index_osc4, index_osc5] ].
        
        """

        if (self._ccore_sync_dynamic_pointer is not None):
            ensembles = wrapper.sync_dynamic_allocate_sync_ensembles(
                self._ccore_sync_dynamic_pointer, tolerance, iteration)

            if (indexes is not None):
                for ensemble in ensembles:
                    for index in range(len(ensemble)):
                        ensemble[index] = indexes[ensemble[index]]

            return ensembles

        if ((self._dynamic is None) or (len(self._dynamic) == 0)):
            return []

        number_oscillators = len(self._dynamic[0])
        last_state = None

        if (iteration is None):
            last_state = self._dynamic[len(self._dynamic) - 1]
        else:
            last_state = self._dynamic[iteration]

        clusters = []
        if (number_oscillators > 0):
            clusters.append([0])

        for i in range(1, number_oscillators, 1):
            cluster_allocated = False
            for cluster in clusters:
                for neuron_index in cluster:
                    last_state_shifted = abs(last_state[i] - 2 * pi)

                    if (((last_state[i] <
                          (last_state[neuron_index] + tolerance)) and
                         (last_state[i] >
                          (last_state[neuron_index] - tolerance)))
                            or ((last_state_shifted <
                                 (last_state[neuron_index] + tolerance)) and
                                (last_state_shifted >
                                 (last_state[neuron_index] - tolerance)))):
                        cluster_allocated = True

                        real_index = i
                        if (indexes is not None):
                            real_index = indexes[i]

                        cluster.append(real_index)
                        break

                if (cluster_allocated == True):
                    break

            if (cluster_allocated == False):
                clusters.append([i])

        return clusters