00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef WHIERARCHICALTREE_H
00026 #define WHIERARCHICALTREE_H
00027
00028 #include <utility>
00029 #include <vector>
00030 #include <queue>
00031 #include <list>
00032
00033 #include <boost/shared_ptr.hpp>
00034
00035 #include "WColor.h"
00036 #include "WExportCommon.h"
00037
00038
00039
00040
00041 class OWCOMMON_EXPORT WHierarchicalTree
00042 {
00043 public:
00044
00045
00046
00047 WHierarchicalTree();
00048
00049
00050
00051
00052 virtual ~WHierarchicalTree();
00053
00054
00055
00056
00057
00058 virtual void addLeaf() = 0;
00059
00060
00061
00062
00063
00064 size_t getLeafCount();
00065
00066
00067
00068
00069
00070 size_t getClusterCount();
00071
00072
00073
00074
00075
00076 size_t getMaxLevel();
00077
00078
00079
00080
00081
00082
00083 size_t getLevel( size_t cluster );
00084
00085
00086
00087
00088
00089
00090 size_t getParent( size_t cluster );
00091
00092
00093
00094
00095
00096
00097 float getCustomData( size_t cluster );
00098
00099
00100
00101
00102
00103
00104 void setColor( WColor color, size_t cluster );
00105
00106
00107
00108
00109
00110
00111 WColor getColor( size_t cluster );
00112
00113
00114
00115
00116
00117
00118 std::pair<size_t, size_t>getChildren( size_t cluster );
00119
00120
00121
00122
00123
00124
00125 std::vector<size_t>getLeafesForCluster( size_t cluster );
00126
00127
00128
00129
00130
00131
00132 size_t size( size_t cluster );
00133
00134
00135
00136
00137
00138
00139 bool isLeaf( size_t cluster );
00140
00141
00142
00143
00144
00145
00146
00147 std::vector< size_t >downXLevelsFromTop( size_t level, bool hideOutliers = false );
00148
00149
00150
00151
00152
00153
00154
00155
00156 std::vector< size_t >findXBiggestClusters( size_t cluster, size_t number = 10 );
00157
00158
00159
00160
00161
00162
00163 void colorCluster( size_t cluster, WColor color );
00164
00165
00166 protected:
00167
00168
00169
00170 size_t m_clusterCount;
00171
00172
00173
00174
00175 size_t m_leafCount;
00176
00177
00178
00179
00180 size_t m_maxLevel;
00181
00182
00183
00184
00185
00186 bool m_leafesLocked;
00187
00188
00189
00190
00191 std::vector<size_t>m_level;
00192
00193
00194
00195
00196 std::vector<size_t>m_parents;
00197
00198
00199
00200
00201 std::vector< std::pair< size_t, size_t> >m_children;
00202
00203
00204
00205
00206
00207 std::vector<float>m_customData;
00208
00209
00210
00211
00212 std::vector<WColor>m_colors;
00213
00214
00215
00216
00217
00218 std::vector< std::vector<size_t> >m_containsLeafes;
00219
00220 private:
00221 };
00222
00223 inline size_t WHierarchicalTree::getLeafCount()
00224 {
00225 return m_leafCount;
00226 }
00227
00228 inline size_t WHierarchicalTree::getClusterCount()
00229 {
00230 return m_clusterCount;
00231 }
00232
00233 inline size_t WHierarchicalTree::getMaxLevel()
00234 {
00235 return m_maxLevel;
00236 }
00237
00238 inline size_t WHierarchicalTree::getLevel( size_t cluster )
00239 {
00240 return m_level[cluster];
00241 }
00242
00243 inline size_t WHierarchicalTree::getParent( size_t cluster )
00244 {
00245 if( m_level[cluster] < m_maxLevel )
00246 {
00247 return m_parents[cluster];
00248 }
00249 else
00250 {
00251
00252 return cluster;
00253 }
00254 }
00255
00256 inline std::pair<size_t, size_t>WHierarchicalTree::getChildren( size_t cluster )
00257 {
00258 if( m_level[cluster] > 0 )
00259 {
00260 return m_children[cluster];
00261 }
00262 else
00263 {
00264
00265 return std::pair<size_t, size_t>( cluster, cluster );
00266 }
00267 }
00268
00269 inline float WHierarchicalTree::getCustomData( size_t cluster )
00270 {
00271 return m_customData[cluster];
00272 }
00273
00274 inline size_t WHierarchicalTree::size( size_t cluster )
00275 {
00276 return getLeafesForCluster( cluster ).size();
00277 }
00278
00279 inline void WHierarchicalTree::setColor( WColor color, size_t cluster )
00280 {
00281 m_colors[cluster] = color;
00282 }
00283
00284 inline WColor WHierarchicalTree::getColor( size_t cluster )
00285 {
00286 return m_colors[cluster];
00287 }
00288
00289 inline bool WHierarchicalTree::isLeaf( size_t cluster )
00290 {
00291 return ( cluster < m_leafCount ) ? true : false;
00292 }
00293
00294 inline std::vector<size_t>WHierarchicalTree::getLeafesForCluster( size_t cluster )
00295 {
00296 return m_containsLeafes[cluster];
00297 }
00298
00299
00300
00301 struct compSize
00302 {
00303 WHierarchicalTree* m_tree;
00304
00305
00306
00307
00308
00309 explicit compSize( WHierarchicalTree* tree ) :
00310 m_tree( tree )
00311 {
00312 }
00313
00314
00315
00316
00317
00318
00319
00320 bool operator()( const size_t lhs, const size_t rhs ) const
00321 {
00322 return m_tree->size( lhs ) > m_tree->size( rhs );
00323 }
00324 };
00325
00326
00327
00328 struct compValue
00329 {
00330 WHierarchicalTree* m_tree;
00331
00332
00333
00334
00335
00336 explicit compValue( WHierarchicalTree* tree ) :
00337 m_tree( tree )
00338 {
00339 }
00340
00341
00342
00343
00344
00345
00346 bool operator()( const size_t lhs, const size_t rhs ) const
00347 {
00348 return m_tree->getCustomData( lhs ) > m_tree->getCustomData( rhs );
00349 }
00350 };
00351
00352 #endif // WHIERARCHICALTREE_H