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