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