bool LeeRoutePlannerImpl::EndAddPoints( void ) { bool bSuccess=false; m_width=abs(m_maxX-m_minX)+m_border*2; m_height=abs(m_maxY-m_minY)+m_border*2; assert(m_height>0); assert(m_width>0); bSuccess=m_width>0 && m_height>0; if ( bSuccess ) { grid_vertices_size_type i, numvertices; numvertices=grid_vertices_size_type((m_width+1) * (m_height+1)); for (i=0; i<numvertices; i++) add_vertex(m_graph); assert(numvertices==num_vertices(m_graph)); bSuccess=numvertices==num_vertices(m_graph); if ( bSuccess ) { AddAllEdges(); InitWeights(); m_bgrid=true; } } return bSuccess; }
void DualTreeBoruvka<MetricType, TreeType>::ComputeMST(arma::mat& results) { Timer::Start("emst/mst_computation"); totalDist = 0; // Reset distance. typedef DTBRules<MetricType, TreeType> RuleType; RuleType rules(data, connections, neighborsDistances, neighborsInComponent, neighborsOutComponent, metric); while (edges.size() < (data.n_cols - 1)) { if (naive) { // Full O(N^2) traversal. for (size_t i = 0; i < data.n_cols; ++i) for (size_t j = 0; j < data.n_cols; ++j) rules.BaseCase(i, j); } else { typename TreeType::template DualTreeTraverser<RuleType> traverser(rules); traverser.Traverse(*tree, *tree); } AddAllEdges(); Cleanup(); Log::Info << edges.size() << " edges found so far." << std::endl; if (!naive) { Log::Info << rules.BaseCases() << " cumulative base cases." << std::endl; Log::Info << rules.Scores() << " cumulative node combinations scored." << std::endl; } } Timer::Stop("emst/mst_computation"); EmitResults(results); Log::Info << "Total spanning tree length: " << totalDist << std::endl; }