56 return accumulate_centroid_masses_;
61 accumulate_centroid_masses_ = value;
68 void MassTreeKmeans::pre_loop_hook(
69 std::vector<Point>
const& data,
70 std::vector<size_t>& assignments,
71 std::vector<Point>& centroids
76 if( accumulate_centroid_masses_ == 1 ) {
80 }
else if( accumulate_centroid_masses_ > 1 ) {
87 bool MassTreeKmeans::data_validation( std::vector<Point>
const& data )
const
90 for(
auto const& tree : data ) {
91 if( ! tree_data_is< MassTreeNodeData, MassTreeEdgeData >( tree ) ) {
92 throw std::invalid_argument(
"Trees for Kmeans do not have MassTree data types." );
98 for (
size_t i = 1; i < data.size(); i++) {
100 throw std::invalid_argument(
"Trees for Kmeans do not have identical topologies." );
107 void MassTreeKmeans::update_centroids(
108 std::vector<Point>
const& data,
109 std::vector<size_t>
const& assignments,
110 std::vector<Point>& centroids
116 #pragma omp parallel for
117 for(
size_t c = 0; c < k; ++c ) {
125 #ifdef GENESIS_OPENMP
128 #pragma omp parallel for
129 for(
size_t c = 0; c < k; ++c ) {
136 for(
size_t d = 0; d < data.size(); ++d ) {
159 if( accumulate_centroid_masses_ == 1 ) {
161 }
else if( accumulate_centroid_masses_ > 1 ) {
172 auto counts = std::vector<size_t>( k, 0 );
175 for(
size_t d = 0; d < data.size(); ++d ) {
186 for(
size_t c = 0; c < k; ++c ) {
195 if( accumulate_centroid_masses_ == 1 ) {
197 }
else if( accumulate_centroid_masses_ > 1 ) {
206 double MassTreeKmeans::distance( Point
const& lhs, Point
const& rhs )
const