33 #include "../exceptions/WOutOfBounds.h"
34 #include "../WAssert.h"
35 #include "../WLogger.h"
36 #include "../WStringUtils.h"
37 #include "WDendrogram.h"
66 WAssert( n > 0,
"A Dendrogram for an empty set of objects was created which makes no sence, if your really need it implement it!" );
76 throw WOutOfBounds(
"Accessed an empty WDendrogam via a call to a memeber function: " + caller +
" which needs access to elements." );
85 std::stringstream errMsg;
86 errMsg <<
"Bug: n=" <<
m_heights.size() <<
" many leafs can lead maximal to 2n-1 many nodes in a tree but this was violated now!" << std::endl;
103 std::stringstream result;
104 std::map< size_t, std::vector< size_t > > childsOfInnerNodes;
105 std::map< size_t, std::vector< size_t > > preds;
106 std::vector< size_t > level( 2 *
m_heights.size() + 1, 0 );
116 for(
size_t i = 0; i <
m_heights.size() + 1; ++i )
118 result <<
"(0, (" << i <<
",))" << std::endl;
119 childsOfInnerNodes[
m_parents[i] ].push_back( i );
130 size_t left = *( preds[ i ].begin() );
131 size_t right = *( preds[ i ].rbegin() );
132 level[i] = std::max( level[left], level[right] ) + 1;
136 childsOfInnerNodes[
m_parents[i] ].reserve( childsOfInnerNodes[
m_parents[i] ].size() + childsOfInnerNodes[i].size() );
137 childsOfInnerNodes[
m_parents[i] ].insert( childsOfInnerNodes[
m_parents[i] ].end(), childsOfInnerNodes[i].begin(),
138 childsOfInnerNodes[i].end() );
140 result <<
"(" << level[i] <<
", (";
141 size_t numElements = childsOfInnerNodes[i].size();
142 for( std::vector< size_t >::const_iterator cit = childsOfInnerNodes[i].begin(); cit != childsOfInnerNodes[i].end(); ++cit )
144 if( numElements == 1 )
146 result << *cit <<
"), ";
150 result << *cit <<
", ";
158 result <<
"(" << left <<
", " << right <<
"), " <<
m_heights[ i -
m_heights.size() - 1 ] <<
")" << std::endl;