ForceAllNeurons.h

00001 #ifndef ForceAllNeurons_H
00002 #define ForceAllNeurons_H
00003 
00004 
00005 #include "Som.h"
00006 
00007 
00008 class ForceAllNeurons {
00009 public:
00010         ForceAllNeurons( SOM * som, TIntVector clusters, int num ) : _som(som), _clusters(clusters), num_clusters(num) 
00011         {
00012                 codebook = _som->getMapcode()->getCodebook();
00013                 m = _som->getMapcode()->getMapSize();
00014                 d = _som->getData()->getDimension();
00015                 codebook_label = _som->getMapcode()->getLabel();                                
00016                 flag = create_intvector( 1, m );
00017                 for (int i=1; i<=m; i++) flag[i] = 0;
00018         };
00019         TIntVector Segment();
00020         int getNumClusters() { return num_clusters; };
00021 
00022 private:
00023         SOM * _som;
00024         TIntVector _clusters;
00025 
00026         
00027         int m;
00028         int d;
00029         int num_clusters;
00030 
00031         TLabel codebook_label;
00032         TMatrix codebook;
00033         
00034         void LabelNeuron(int i, int source);
00035         void CreateCluster(int i );
00036 
00037         vector<int> realocateSource( vector<int> neighbors, int source );
00038 
00039         TIntVector flag;
00040 };
00041 
00042 vector<int> 
00043 ForceAllNeurons::realocateSource( vector<int> neighbors, int source )
00044 {
00045         vector<int> vec;
00046         for (int i=0; i < neighbors.size(); i++ )
00047                 if ( neighbors[i] != source )
00048                         vec.push_back( neighbors[i] );
00049         vec.push_back( source );
00050         return vec;
00051 };
00052 
00053 void 
00054 ForceAllNeurons::CreateCluster(int i )
00055 {
00056         vector<int> neighbors;
00057         if ( ( _clusters[i] == 0 ) && (!codebook_label[i-1].empty() ) ) {                                       
00058                 _clusters[ i ] = num_clusters;
00059                 flag[ i ] = 0;
00060                 neighbors = _som->getNeighbors( i );
00061                 for (int j=0; j< neighbors.size(); j++) 
00062                         if ((neighbors[j] > 0 ) && (!codebook_label[neighbors[j]-1].empty()) && (flag[ neighbors[j] ] == 1) )
00063                                 if ( _clusters[ neighbors[j] ] == 0 ) 
00064                                         CreateCluster( neighbors[j] );                                  
00065         }
00066 
00067 };
00068 
00069 void 
00070 ForceAllNeurons::LabelNeuron(int i, int source) 
00071 {
00072         vector<int> neighbors;
00073         Value_Type min_dist, dist_tmp;
00074         
00075         if ( ( _clusters[i] == 0 ) && (!codebook_label[i-1].empty() ) ) {                       
00076                     flag[ i ] = 1;
00077                         neighbors = _som->getNeighbors( i );
00078                         neighbors = realocateSource( neighbors, source );
00079                         min_dist = 9999; dist_tmp = 99999;                      
00080                         for (int j=0; j< neighbors.size() ; j++) {
00081                                 if ((neighbors[j] > 0 ) && (!codebook_label[neighbors[j] - 1].empty()) && (flag[ neighbors[j] ] == 0)) {
00082                                         if ( _clusters[ neighbors[j] ] > 0 )   {
00083                                                 dist_tmp = dist( codebook[i], codebook[ neighbors[j] ], d );                            
00084                                                 if ( dist_tmp < min_dist ) {
00085                                                         _clusters[i] = _clusters[ neighbors[j] ];
00086                                                         min_dist = dist_tmp;
00087                                                         flag[ i ] = 0;
00088                                                 }
00089                                         }
00090                                         else {
00091                                                 LabelNeuron( neighbors[j], i );                                         
00092                                                 if ( _clusters[ neighbors[j] ] > 0 )   {
00093                                                         dist_tmp = dist( codebook[i], codebook[ neighbors[j] ], d );                            
00094                                                         if ( dist_tmp < min_dist ) {
00095                                                                 _clusters[i] = _clusters[ neighbors[j] ];
00096                                                                 min_dist = dist_tmp;
00097                                                                 flag[ i ] = 0;
00098                                                         }
00099                                                 }
00100                                         }
00101                                         
00102                                 }
00103                         }
00104                 }       
00105 };
00106 
00107 TIntVector 
00108 ForceAllNeurons::Segment()
00109 {       
00110         int i;
00111         for (i=1; i <= m; i++) LabelNeuron( i, i );             
00112         for (i=1; i <= m; i++) 
00113                 if (flag[i] == 1 ) {
00114                         ++num_clusters;
00115                         CreateCluster( i );
00116                 }
00117         return _clusters;               
00118 };
00119 
00120 #endif

Generated on Tue Aug 7 16:03:33 2007 for SOMCode by  doxygen 1.5.3