From 402dca52fa24f5470de12ed7809f5eb899e98c93 Mon Sep 17 00:00:00 2001 From: vasiloglou Date: Fri, 4 May 2007 22:42:58 +0000 Subject: [PATCH] close to compiling --- fastlib/u/nvasil/tree/.binary_tree.h.swp | Bin 16384 -> 16384 bytes fastlib/u/nvasil/tree/binary_tree.h | 3 +- fastlib/u/nvasil/tree/binary_tree.h~ | 3 +- fastlib/u/nvasil/tree/binary_tree_impl.h | 125 +++++++++++---------- fastlib/u/nvasil/tree/binary_tree_impl.h~ | 125 +++++++++++---------- fastlib/u/nvasil/tree/binary_tree_unit.cc | 96 +++++++++------- fastlib/u/nvasil/tree/binary_tree_unit.cc~ | 96 +++++++++------- fastlib/u/nvasil/tree/kd_pivoter1.h | 7 +- fastlib/u/nvasil/tree/kd_pivoter1.h~ | 7 +- fastlib/u/nvasil/tree/node.h | 2 +- fastlib/u/nvasil/tree/node.h~ | 2 +- fastlib/u/nvasil/tree/node_impl.h | 25 +++-- fastlib/u/nvasil/tree/node_impl.h~ | 41 ++++--- fastlib/u/nvasil/tree/node_unit.cc | 2 +- fastlib/u/nvasil/tree/node_unit.cc~ | 2 +- fastlib/u/nvasil/tree/null_statistics.h | 4 + 16 files changed, 297 insertions(+), 243 deletions(-) diff --git a/fastlib/u/nvasil/tree/.binary_tree.h.swp b/fastlib/u/nvasil/tree/.binary_tree.h.swp index b13bb1f7a5d2f6a489ea0b4a7dd1e87da32c6bc2..2f8a077d0c2bc6485014cc1d1912961222d37f49 100644 GIT binary patch delta 846 zcmXxiT}V@L7{~GF%;}tKZ7XOY(atnurKDC$VI-OgL4m>u>BX_FBS~|U?O3R}P3WSK zk~m!z^gt%%8I*Zy7ae8Ica#@K6^0#kSk{HcE5Bv%PGGp+*r>7^?K&1 zLu3qx;m7+Dkx_KPi?4Q(adcxRY?vz+xr#Gr!9Hw-4|c5BME>9-Ug0^Wa1B=wK{G0B zk`WJu6Bhg^63O8cUSkFqF^D!);b)=9JIvr5YT?C#RpbE%5keO{m@8mY=;(wGMfhc5 zKg)VfN0G)+R3qP?Mdi}XO@_a0gAr(4V=Oj$&0}SEET*+$TyeH&DLvUA)dO49p<(mx z=7&mysH(2@_Qk@wwnrc6)8gS?txAm~5;1jecd|!|A6KKXa4MxX_r$}=fnZY8f_x?a zo{_8EXodoj0&}IZ$eOY9$NiipKcN4!n|Fy!V+0-WVPQ2b#Sji)9p;@P6UZWs5ZVzy zZWUv|BranZ5!Atpzl?s_!8krp%;GU_-~!I01KUxJC35is&u|N8F@n=*M-6;%V41wU z#RLqba0K-z$1-{Oj9J_(K0){>PN5U6Sc@gHaT^ArXo4SK$io{vLOv%6bfOhre5aF7 Wa37NxL%zFup{ZCMRg2*d9#!ULZ_5Bwhvhu_b#lx3;H)~bCC ziO`0MYT@`rDvw3$H*K}#{Ia)>;@Wn4lWb9RwY+(kDMScfozcux$E zZ61*xhD;_u)z$vZdN5w5pT)v@B(@lN+Qbv4t9ZXnA20El>C!%BuCI8i%&kb9U4?W@ zB%oZnD-tyS%CjBmSKPaX_hjPzpZrUo$W5F?3|>qw66wPUY=jeUz3d^0Er?<{Jec8` zw{adR>_QEK_)cLH7_ipd07Vf?C8-4G+H3@+4lv;0lsx zLM00DgO;aY(2GuIyU0<7?O2O^D2&tW0FIyuMVO<>kGO{(oW>56BOeMAB>4zwv?GN^ dWD+jRGRiS*cb6<2)3N?yuHGGAt(O)T%mZ48fYJZ} diff --git a/fastlib/u/nvasil/tree/binary_tree.h b/fastlib/u/nvasil/tree/binary_tree.h index 4b6e0cecd6..8c8a177700 100644 --- a/fastlib/u/nvasil/tree/binary_tree.h +++ b/fastlib/u/nvasil/tree/binary_tree.h @@ -77,6 +77,7 @@ class BinaryTree { BinaryTree(); ~BinaryTree(); void Init(BinaryDataset &data); + void Destruct() {} // Call this function to build Depth first a tree void BuildDepthFirst(); void BuildDepthFirst(NodePtr_t &ptr, PivotInfo_t *pivot); @@ -86,7 +87,7 @@ class BinaryTree { // Builds tree k depth first. It builds all the subtrees depth first up to k level void BuildKDepthFirst(); template - void NearestNeighbor(POINTTYPE &test_point, + void NearestNeighbor(POINTTYPE test_point, vector > *nearest_point, NEIGHBORTYPE range); diff --git a/fastlib/u/nvasil/tree/binary_tree.h~ b/fastlib/u/nvasil/tree/binary_tree.h~ index 99ab12d30a..474f76a341 100644 --- a/fastlib/u/nvasil/tree/binary_tree.h~ +++ b/fastlib/u/nvasil/tree/binary_tree.h~ @@ -52,7 +52,7 @@ class BinaryTree { typedef BinaryTree BinaryTree_t; typedef typename Pivot_t::PivotInfo PivotInfo_t; // For testing purposes only - templatefriend class BinaryTreeTest; + templatefriend class BinaryTreeTest; class OutPutAllocator { public: @@ -77,6 +77,7 @@ class BinaryTree { BinaryTree(); ~BinaryTree(); void Init(BinaryDataset &data); + void Destruct() {} // Call this function to build Depth first a tree void BuildDepthFirst(); void BuildDepthFirst(NodePtr_t &ptr, PivotInfo_t *pivot); diff --git a/fastlib/u/nvasil/tree/binary_tree_impl.h b/fastlib/u/nvasil/tree/binary_tree_impl.h index 5eb323571a..6d877d2ed6 100644 --- a/fastlib/u/nvasil/tree/binary_tree_impl.h +++ b/fastlib/u/nvasil/tree/binary_tree_impl.h @@ -47,7 +47,7 @@ void TREE__::BuildBreadthFirst() { fifo.push_front(make_pair(parent_->get_left().Reference(), pivot_pair.first)); fifo.push_front(make_pair(parent_->get_right().Reference(), pivot_pair.second)); current_level_ =1; - BreadthFirst(fifo); + BuildBreadthFirst(fifo); if (log_progress_==true) { printf("\n"); } @@ -82,14 +82,14 @@ void TREE__::BuildBreadthFirst( total_points_visited_ += fifo_pair.second->num_of_points_; progress_.Show(total_points_visited_, get_num_of_points()); } - (*fifo_pair.first).Reset(new Node_t(fifo_pair.second, node_id_, data_)); - (*fifo_pair.first)->Init(fifo_pair.second.box_, - fifo_pair.second.statistics_, + (*fifo_pair.first).Reset(new Node_t()); + (*fifo_pair.first)->Init(fifo_pair.second->box_, + fifo_pair.second->statistics_, node_id_, - fifo_pair.second.num_of_points_, - &data_, - fifo_pair.second.start_, - dimension_); + fifo_pair.second->start_, + fifo_pair.second->num_of_points_, + dimension_, + &data_); num_of_leafs_++; node_id_++; @@ -116,13 +116,13 @@ void TREE__::BuildDepthFirst(typename TREE__::NodePtr_t &ptr, pair pivot_pair; if (pivot_info->num_of_points_ > max_points_on_leaf_) { - ptr.Reset(new Node_t(pivot_info, node_id_)); + ptr.Reset(new Node_t()); ptr->Init(pivot_info->box_, pivot_info->statistics_, node_id_, pivot_info->num_of_points_); node_id_++; - pivot_pair = pivoter(pivot_info); + pivot_pair = pivoter_(pivot_info); // There is a case where on all the points are the same // so pivoting returns 0 points on the left side // In that case we create a gigantic leaf @@ -138,13 +138,13 @@ void TREE__::BuildDepthFirst(typename TREE__::NodePtr_t &ptr, min_depth_=current_level_; } ptr.Reset(new Node_t()); - ptr->Init(pivot_pair.second.box_, - pivot_pair.second.statistics_, + ptr->Init(pivot_pair.second->box_, + pivot_pair.second->statistics_, node_id_, - pivot_pair.second.num_of_points_, - &data_, - pivot_pair.second.start_, - dimension_); + pivot_pair.second->start_, + pivot_pair.second->num_of_points_, + dimension_, + &data_); node_id_++; num_of_leafs_++; @@ -155,8 +155,8 @@ void TREE__::BuildDepthFirst(typename TREE__::NodePtr_t &ptr, } delete pivot_info; current_level_++; - SerialBuildDepthFirst(ptr->get_left(), pivot_pair.first); - SerialBuildDepthFirst(ptr->get_right(), pivot_pair.second); + BuildDepthFirst(ptr->get_left(), pivot_pair.first); + BuildDepthFirst(ptr->get_right(), pivot_pair.second); current_level_--; } else { if (log_progress_==true) { @@ -169,14 +169,14 @@ void TREE__::BuildDepthFirst(typename TREE__::NodePtr_t &ptr, if (current_level_ < min_depth_) { min_depth_=current_level_; } - ptr.Reset(new Node_t(pivot_info, node_id_, data_)); - ptr->Init(pivot_info.second.box_, - pivot_info.second.statistics_, + ptr.Reset(new Node_t()); + ptr->Init(pivot_info->box_, + pivot_info->statistics_, node_id_, - pivot_info.second.num_of_points_, - &data_, - pivot_info.second.start_, - dimension_); + pivot_info->start_, + pivot_info->num_of_points_, + dimension_, + &data_); node_id_++; num_of_leafs_++; @@ -188,19 +188,24 @@ void TREE__::BuildDepthFirst(typename TREE__::NodePtr_t &ptr, // k nearest, range nearest or just nearest TEMPLATE__ template -void TREE__::NearestNeighbor(POINTTYPE &test_point, - vector > *nearest_point, +void TREE__::NearestNeighbor(POINTTYPE test_point, + vector > *nearest_point, NEIGHBORTYPE range) { bool found = false; - *distance = numeric_limits::max(); - NearestNeighbor(parent_, test_point, nearest_point, distance, range, found); + NearestNeighbor(parent_, + test_point, + nearest_point, + range, + found); } TEMPLATE__ template void TREE__::NearestNeighbor(NodePtr_t ptr, POINTTYPE &test_point, - vector > *nearest_point, + vector > *nearest_point, NEIGHBORTYPE range, bool &found) { computations_.UpdateComparisons(); @@ -209,16 +214,15 @@ void TREE__::NearestNeighbor(NodePtr_t ptr, pair child_pair = ptr->ClosestChild(test_point, dimension_, computations_); - NearestNeighbor(child_pair.first, test_point, nearest_point, distance, + NearestNeighbor(child_pair.first, test_point, nearest_point, range, found); if (child_pair.second->get_box().CrossesBoundaries(test_point, dimension_, - *distance, + nearest_point->end()->first, computations_)) { NearestNeighbor(child_pair.second, test_point, nearest_point, - distance, range, found); } @@ -226,7 +230,7 @@ void TREE__::NearestNeighbor(NodePtr_t ptr, return; } else { found = ptr->get_box().IsWithin(test_point, - dimension_, *distance, + dimension_, nearest_point->end()->first, computations_)==0; if (found == true) { return; @@ -234,11 +238,12 @@ void TREE__::NearestNeighbor(NodePtr_t ptr, } } else { ptr->FindNearest(test_point, *nearest_point, - *distance, range, dimension_, - *discriminator_, + range, dimension_, + discriminator_, computations_); - found = ptr->get_box().IsWithin(test_point, dimension_, *distance, - computations_); + found = ptr->get_box().IsWithin(test_point, dimension_, + nearest_point->end()->first, + computations_); } } @@ -255,10 +260,10 @@ void TREE__::AllNearestNeighbors(typename TREE__::NodePtr_t query, TEMPLATE__ template -void TREE__::AllNearestNeighbors(NodePtr_t query, - NodePtr_t reference, +void TREE__::AllNearestNeighbors(typename TREE__::NodePtr_t query, + typename TREE__::NodePtr_t reference, NEIGHBORTYPE range, - Precision_t distance) { + typename TREE__::Precision_t distance) { if (distance > query->get_min_dist_so_far()) { return ; @@ -269,7 +274,7 @@ void TREE__::AllNearestNeighbors(NodePtr_t query, max_distance, range, dimension_, - *discriminator_, + discriminator_, computations_); query->set_min_dist_so_far(max_distance); } else { @@ -307,8 +312,8 @@ void TREE__::AllNearestNeighbors(NodePtr_t query, range, closest_child.second.second); query->set_min_dist_so_far( - min(query->get_min_dist_so_far(), - max(query->get_left()->get_min_dist_so_far(), + std::min(query->get_min_dist_so_far(), + std::max(query->get_left()->get_min_dist_so_far(), query->get_right()->get_min_dist_so_far()))); } else { if (!query->IsLeaf() && !reference->IsLeaf()) { @@ -342,8 +347,8 @@ void TREE__::AllNearestNeighbors(NodePtr_t query, range, closest_child.second.second); query->set_min_dist_so_far( - min(query->get_min_dist_so_far(), - max(query->get_left()->get_min_dist_so_far(), + std::min(query->get_min_dist_so_far(), + std::max(query->get_left()->get_min_dist_so_far(), query->get_right()->get_min_dist_so_far()))); } @@ -359,18 +364,18 @@ void TREE__::InitAllKNearestNeighborOutput(string file, int32 knns) { FILE *fp=fopen(file.c_str(), "w"); const int32 kChunk=8192; - typename Node_t::Result buffer; - buffer=new typename Node_t::Result[kChunk*knns]; + typename Node_t::NNResult *buffer; + buffer=new typename Node_t::NNResult[kChunk*knns]; for(index_t i=0; iIsLeaf()) { - ptr->set_kneighbors(all_nn_out_.Allocate(ptr->get_num_of_points(), - knns)); + ptr->set_kneighbors(all_nn_out_.Allocate(ptr->get_num_of_points(), knns), + knns); ptr->InitKNeighbors(knns); } else { InitAllKNearestNeighborOutput(ptr->get_left(), knns); @@ -399,9 +404,11 @@ void TREE__::InitAllKNearestNeighborOutput(NodePtr_t ptr, TEMPLATE__ void TREE__::InitAllRangeNearestNeighborOutput(string file) { FILE *fp=fopen(file.c_str(), "w"); - FATAL(fp==NULL, "Cannot open %s, error: %s\n", - file.c_str(), - strerror(errno)); + if (fp==NULL) { + FATAL("Cannot open %s, error: %s\n", + file.c_str(), + strerror(errno)); + } parent_->set_range_neighbors(fp); InitAllRangeNearestNeighborOutput(parent_, fp); } @@ -422,7 +429,7 @@ void TREE__::InitAllRangeNearestNeighborOutput( TEMPLATE__ void TREE__::CloseAllKNearestNeighborOutput(int32 knns) { if (munmap(all_nn_out_.get_ptr(), - sizeof(typename Node_t::Result)*knns*num_of_points_)<0) { + sizeof(typename Node_t::NNResult)*knns*num_of_points_)<0) { fprintf(stderr, "Failed to umap file: %s", strerror(errno)); assert(false); } diff --git a/fastlib/u/nvasil/tree/binary_tree_impl.h~ b/fastlib/u/nvasil/tree/binary_tree_impl.h~ index c48b1fac3d..c485858411 100644 --- a/fastlib/u/nvasil/tree/binary_tree_impl.h~ +++ b/fastlib/u/nvasil/tree/binary_tree_impl.h~ @@ -47,7 +47,7 @@ void TREE__::BuildBreadthFirst() { fifo.push_front(make_pair(parent_->get_left().Reference(), pivot_pair.first)); fifo.push_front(make_pair(parent_->get_right().Reference(), pivot_pair.second)); current_level_ =1; - BreadthFirst(fifo); + BuildBreadthFirst(fifo); if (log_progress_==true) { printf("\n"); } @@ -82,14 +82,14 @@ void TREE__::BuildBreadthFirst( total_points_visited_ += fifo_pair.second->num_of_points_; progress_.Show(total_points_visited_, get_num_of_points()); } - (*fifo_pair.first).Reset(new Node_t(fifo_pair.second, node_id_, data_)); - (*fifo_pair.first)->Init(fifo_pair.second.box_, - fifo_pair.second.statistics_, + (*fifo_pair.first).Reset(new Node_t()); + (*fifo_pair.first)->Init(fifo_pair.second->box_, + fifo_pair.second->statistics_, node_id_, - fifo_pair.second.num_of_points_, - &data_, - fifo_pair.second.start_, - dimension_); + fifo_pair.second->start_, + fifo_pair.second->num_of_points_, + dimension_, + &data_); num_of_leafs_++; node_id_++; @@ -116,13 +116,13 @@ void TREE__::BuildDepthFirst(typename TREE__::NodePtr_t &ptr, pair pivot_pair; if (pivot_info->num_of_points_ > max_points_on_leaf_) { - ptr.Reset(new Node_t(pivot_info, node_id_)); + ptr.Reset(new Node_t()); ptr->Init(pivot_info->box_, pivot_info->statistics_, node_id_, pivot_info->num_of_points_); node_id_++; - pivot_pair = pivoter(pivot_info); + pivot_pair = pivoter_(pivot_info); // There is a case where on all the points are the same // so pivoting returns 0 points on the left side // In that case we create a gigantic leaf @@ -138,13 +138,13 @@ void TREE__::BuildDepthFirst(typename TREE__::NodePtr_t &ptr, min_depth_=current_level_; } ptr.Reset(new Node_t()); - ptr->Init(pivot_pair.second.box_, - pivot_pair.second.statistics_, + ptr->Init(pivot_pair.second->box_, + pivot_pair.second->statistics_, node_id_, - pivot_pair.second.num_of_points_, - &data_, - pivot_pair.second.start_, - dimension_); + pivot_pair.second->start_, + pivot_pair.second->num_of_points_, + dimension_, + &data_); node_id_++; num_of_leafs_++; @@ -155,8 +155,8 @@ void TREE__::BuildDepthFirst(typename TREE__::NodePtr_t &ptr, } delete pivot_info; current_level_++; - SerialBuildDepthFirst(ptr->get_left(), pivot_pair.first); - SerialBuildDepthFirst(ptr->get_right(), pivot_pair.second); + BuildDepthFirst(ptr->get_left(), pivot_pair.first); + BuildDepthFirst(ptr->get_right(), pivot_pair.second); current_level_--; } else { if (log_progress_==true) { @@ -169,14 +169,14 @@ void TREE__::BuildDepthFirst(typename TREE__::NodePtr_t &ptr, if (current_level_ < min_depth_) { min_depth_=current_level_; } - ptr.Reset(new Node_t(pivot_info, node_id_, data_)); - ptr->Init(pivot_info.second.box_, - pivot_info.second.statistics_, + ptr.Reset(new Node_t()); + ptr->Init(pivot_info->box_, + pivot_info->statistics_, node_id_, - pivot_info.second.num_of_points_, - &data_, - pivot_info.second.start_, - dimension_); + pivot_info->start_, + pivot_info->num_of_points_, + dimension_, + &data_); node_id_++; num_of_leafs_++; @@ -188,19 +188,24 @@ void TREE__::BuildDepthFirst(typename TREE__::NodePtr_t &ptr, // k nearest, range nearest or just nearest TEMPLATE__ template -void TREE__::NearestNeighbor(POINTTYPE &test_point, - vector > *nearest_point, +void TREE__::NearestNeighbor(POINTTYPE test_point, + vector > *nearest_point, NEIGHBORTYPE range) { bool found = false; - *distance = std::numeric_limits::max(); - NearestNeighbor(parent_, test_point, nearest_point, distance, range, found); + NearestNeighbor(parent_, + test_point, + nearest_point, + range, + found); } TEMPLATE__ template void TREE__::NearestNeighbor(NodePtr_t ptr, POINTTYPE &test_point, - vector > *nearest_point, + vector > *nearest_point, NEIGHBORTYPE range, bool &found) { computations_.UpdateComparisons(); @@ -209,16 +214,15 @@ void TREE__::NearestNeighbor(NodePtr_t ptr, pair child_pair = ptr->ClosestChild(test_point, dimension_, computations_); - NearestNeighbor(child_pair.first, test_point, nearest_point, distance, + NearestNeighbor(child_pair.first, test_point, nearest_point, range, found); if (child_pair.second->get_box().CrossesBoundaries(test_point, dimension_, - *distance, + nearest_point->end()->first, computations_)) { NearestNeighbor(child_pair.second, test_point, nearest_point, - distance, range, found); } @@ -226,7 +230,7 @@ void TREE__::NearestNeighbor(NodePtr_t ptr, return; } else { found = ptr->get_box().IsWithin(test_point, - dimension_, *distance, + dimension_, nearest_point->end()->first, computations_)==0; if (found == true) { return; @@ -234,11 +238,12 @@ void TREE__::NearestNeighbor(NodePtr_t ptr, } } else { ptr->FindNearest(test_point, *nearest_point, - *distance, range, dimension_, - *discriminator_, + range, dimension_, + discriminator_, computations_); - found = ptr->get_box().IsWithin(test_point, dimension_, *distance, - computations_); + found = ptr->get_box().IsWithin(test_point, dimension_, + nearest_point->end()->first, + computations_); } } @@ -255,10 +260,10 @@ void TREE__::AllNearestNeighbors(typename TREE__::NodePtr_t query, TEMPLATE__ template -void TREE__::AllNearestNeighbors(NodePtr_t query, - NodePtr_t reference, +void TREE__::AllNearestNeighbors(typename TREE__::NodePtr_t query, + typename TREE__::NodePtr_t reference, NEIGHBORTYPE range, - Precision_t distance) { + typename TREE__::Precision_t distance) { if (distance > query->get_min_dist_so_far()) { return ; @@ -269,7 +274,7 @@ void TREE__::AllNearestNeighbors(NodePtr_t query, max_distance, range, dimension_, - *discriminator_, + discriminator_, computations_); query->set_min_dist_so_far(max_distance); } else { @@ -307,8 +312,8 @@ void TREE__::AllNearestNeighbors(NodePtr_t query, range, closest_child.second.second); query->set_min_dist_so_far( - min(query->get_min_dist_so_far(), - max(query->get_left()->get_min_dist_so_far(), + std::min(query->get_min_dist_so_far(), + std::max(query->get_left()->get_min_dist_so_far(), query->get_right()->get_min_dist_so_far()))); } else { if (!query->IsLeaf() && !reference->IsLeaf()) { @@ -342,8 +347,8 @@ void TREE__::AllNearestNeighbors(NodePtr_t query, range, closest_child.second.second); query->set_min_dist_so_far( - min(query->get_min_dist_so_far(), - max(query->get_left()->get_min_dist_so_far(), + min(query->get_min_dist_so_far(), + max(query->get_left()->get_min_dist_so_far(), query->get_right()->get_min_dist_so_far()))); } @@ -359,18 +364,18 @@ void TREE__::InitAllKNearestNeighborOutput(string file, int32 knns) { FILE *fp=fopen(file.c_str(), "w"); const int32 kChunk=8192; - typename Node_t::Result buffer; - buffer=new typename Node_t::Result[kChunk*knns]; + typename Node_t::NNResult *buffer; + buffer=new typename Node_t::NNResult[kChunk*knns]; for(index_t i=0; iIsLeaf()) { - ptr->set_kneighbors(all_nn_out_.Allocate(ptr->get_num_of_points(), - knns)); + ptr->set_kneighbors(all_nn_out_.Allocate(ptr->get_num_of_points(), knns), + knns); ptr->InitKNeighbors(knns); } else { InitAllKNearestNeighborOutput(ptr->get_left(), knns); @@ -399,9 +404,11 @@ void TREE__::InitAllKNearestNeighborOutput(NodePtr_t ptr, TEMPLATE__ void TREE__::InitAllRangeNearestNeighborOutput(string file) { FILE *fp=fopen(file.c_str(), "w"); - FATAL(fp==NULL, "Cannot open %s, error: %s\n", - file.c_str(), - strerror(errno)); + if (fp==NULL) { + FATAL("Cannot open %s, error: %s\n", + file.c_str(), + strerror(errno)); + } parent_->set_range_neighbors(fp); InitAllRangeNearestNeighborOutput(parent_, fp); } @@ -422,7 +429,7 @@ void TREE__::InitAllRangeNearestNeighborOutput( TEMPLATE__ void TREE__::CloseAllKNearestNeighborOutput(int32 knns) { if (munmap(all_nn_out_.get_ptr(), - sizeof(typename Node_t::Result)*knns*num_of_points_)<0) { + sizeof(typename Node_t::NNResult)*knns*num_of_points_)<0) { fprintf(stderr, "Failed to umap file: %s", strerror(errno)); assert(false); } diff --git a/fastlib/u/nvasil/tree/binary_tree_unit.cc b/fastlib/u/nvasil/tree/binary_tree_unit.cc index 2fe6a87062..34d39771f8 100644 --- a/fastlib/u/nvasil/tree/binary_tree_unit.cc +++ b/fastlib/u/nvasil/tree/binary_tree_unit.cc @@ -46,7 +46,8 @@ class BinaryTreeTest { typedef Point Point_t; typedef BinaryTree BinaryTree_t; typedef typename BinaryTree_t::Node_t Node_t; - + BinaryTreeTest() { + } void Init() { dimension_=2; num_of_points_=1000; @@ -71,40 +72,40 @@ class BinaryTreeTest { unlink(result_file_.c_str()); } void BuildDepthFirst(){ - tree_.BuildDepstFirst(); + tree_.BuildDepthFirst(); } void BuildBreadthFirst() { tree_.BuildBreadthFirst(); } void kNearestNeighbor() { - tree_->BuildDepthFirst(); - vector nearest_tree; + tree_.BuildDepthFirst(); + vector > nearest_tree; pair nearest_naive[num_of_points_]; for(index_t i=0; i::epsilon()); + TEST_DOUBLE_APPROX(nearest_naive[j+1].first, + nearest_tree[j].first, + numeric_limits::epsilon()); TEST_ASSERT(nearest_tree[j].second.get_id()== - naive_tree[j+1].second) ; + nearest_naive[j+1].second) ; } } } void RangeNearestNeighbor() { tree_.BuildBreadthFirst(); - vector nearest_tree; - pair nearest_naive[num_of_points_]; + vector > nearest_tree; + pair nearest_naive[num_of_points_]; for(index_t i=0; i::epsilon()); TEST_ASSERT(nearest_tree[j].second.get_id()== @@ -116,7 +117,7 @@ class BinaryTreeTest { tree_.BuildBreadthFirst(); tree_.InitAllKNearestNeighborOutput(result_file_, knns_); - tree_.AllKNearestNeighbor(tree_.parent_, knns_); + tree_.AllNearestNeighbors(tree_.parent_, knns_); tree_.CloseAllKNearestNeighborOutput(knns_); struct stat info; if (stat(data_file_.c_str(), &info)!=0) { @@ -126,7 +127,8 @@ class BinaryTreeTest { uint64 map_size = info.st_size-sizeof(int32); int fp=open(result_file_.c_str(), O_RDWR); - typename Node_t::NNResult *res=mmap(NULL, + typename Node_t::NNResult *res; + res=(typename Node_t::NNResult *) mmap(NULL, map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fp, @@ -135,12 +137,12 @@ class BinaryTreeTest { std::sort(res, res+num_of_points_*knns_); pair nearest_naive[num_of_points_]; for(index_t i=0; i::epsilon()); - TEST_ASSERT(res[j].second.get_id()== + TEST_ASSERT(res[j].nearest_.get_id()== nearest_naive[j+1].second); } } @@ -149,10 +151,9 @@ class BinaryTreeTest { void AllRangeNearestNeighbors() { tree_.BuildBreadthFirst(); - tree_.InitAllKNearestNeighborOutput(result_file_, - range_); - tree_.AllKNearestNeighbor(tree_.parent_, range_); - tree_.CloseAllKNearestNeighborOutput(); + tree_.InitAllRangeNearestNeighborOutput(result_file_); + tree_.AllNearestNeighbors(tree_.parent_, range_); + tree_.CloseAllRangeNearestNeighborOutput(); struct stat info; if (stat(data_file_.c_str(), &info)!=0) { FATAL( "Error %s file %s\n", @@ -161,7 +162,8 @@ class BinaryTreeTest { uint64 map_size = info.st_size-sizeof(int32); int fp=open(result_file_.c_str(), O_RDWR); - typename Node_t::NNResult *res=mmap(NULL, + typename Node_t::NNResult *res; + res=(typename Node_t::NNResult *)mmap(NULL, map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fp, @@ -171,13 +173,13 @@ class BinaryTreeTest { pair nearest_naive[num_of_points_]; index_t i=0; while (i::epsilon()); - TEST_ASSERT(res[i].second.get_id()== + TEST_ASSERT(res[i].nearest_.get_id()== nearest_naive[j+1].second); i++; j++; @@ -186,13 +188,26 @@ class BinaryTreeTest { munmap(res, map_size); } - - TEST_SUITE(BuildDepthFirst, - BuildBreadthFirst, - kNearestNeighbor, - RangeNearestNeighbor, - AllKNearestNeighbors, - AllRangeNearestNeighbors) + void TestAll() { + Init(); + BuildDepthFirst(); + Destruct(); + Init(); + BuildBreadthFirst(); + Destruct(); + Init(); + kNearestNeighbor(); + Destruct(); + Init(); + RangeNearestNeighbor(); + Destruct(); + Init(); + AllKNearestNeighbors(); + Destruct(); + Init(); + AllRangeNearestNeighbors(); + Destruct(); + } private: BinaryTree_t tree_; BinaryDataset data_; @@ -213,8 +228,8 @@ class BinaryTreeTest { Precision_t dist=Metric_t::Distance(data_.At(i), data_.At(query), dimension_); - result[i].first=i; - result[i].second=dist; + result[i].first=dist; + result[i].second=i; } sort(result, result+num_of_points_); } @@ -244,4 +259,7 @@ struct Parameters { typedef KdPivoter1 Pivot_t; }; typedef BinaryTreeTest BinaryTreeTest_t; -RUN_ALL_TESTS(BinaryTreeTest_t) +int main(int argc, char *argv[]) { + BinaryTreeTest_t test; + test.TestAll(); +} diff --git a/fastlib/u/nvasil/tree/binary_tree_unit.cc~ b/fastlib/u/nvasil/tree/binary_tree_unit.cc~ index 18758be29f..f48ab44a29 100644 --- a/fastlib/u/nvasil/tree/binary_tree_unit.cc~ +++ b/fastlib/u/nvasil/tree/binary_tree_unit.cc~ @@ -46,7 +46,8 @@ class BinaryTreeTest { typedef Point Point_t; typedef BinaryTree BinaryTree_t; typedef typename BinaryTree_t::Node_t Node_t; - + BinaryTreeTest() { + } void Init() { dimension_=2; num_of_points_=1000; @@ -71,40 +72,40 @@ class BinaryTreeTest { unlink(result_file_.c_str()); } void BuildDepthFirst(){ - tree_.BuildDepstFirst(); + tree_.BuildDepthFirst(); } void BuildBreadthFirst() { tree_.BuildBreadthFirst(); } void kNearestNeighbor() { - tree_->BuildDepthFirst(); - vector nearest_tree; + tree_.BuildDepthFirst(); + vector > nearest_tree; pair nearest_naive[num_of_points_]; for(index_t i=0; i::epsilon()); + TEST_DOUBLE_APPROX(nearest_naive[j+1].first, + nearest_tree[j].first, + numeric_limits::epsilon()); TEST_ASSERT(nearest_tree[j].second.get_id()== - naive_tree[j+1].second) ; + nearest_naive[j+1].second) ; } } } void RangeNearestNeighbor() { tree_.BuildBreadthFirst(); - vector nearest_tree; - pair nearest_naive[num_of_points_]; + vector > nearest_tree; + pair nearest_naive[num_of_points_]; for(index_t i=0; i::epsilon()); TEST_ASSERT(nearest_tree[j].second.get_id()== @@ -116,7 +117,7 @@ class BinaryTreeTest { tree_.BuildBreadthFirst(); tree_.InitAllKNearestNeighborOutput(result_file_, knns_); - tree_.AllKNearestNeighbor(tree_.parent_, knns_); + tree_.AllNearestNeighbors(tree_.parent_, knns_); tree_.CloseAllKNearestNeighborOutput(knns_); struct stat info; if (stat(data_file_.c_str(), &info)!=0) { @@ -126,7 +127,8 @@ class BinaryTreeTest { uint64 map_size = info.st_size-sizeof(int32); int fp=open(result_file_.c_str(), O_RDWR); - typename Node_t::NNResult *res=mmap(NULL, + typename Node_t::NNResult *res; + res=(typename Node_t::NNResult *) mmap(NULL, map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fp, @@ -135,12 +137,12 @@ class BinaryTreeTest { std::sort(res, res+num_of_points_*knns_); pair nearest_naive[num_of_points_]; for(index_t i=0; i::epsilon()); - TEST_ASSERT(res[j].second.get_id()== + TEST_ASSERT(res[j].nearest_.get_id()== nearest_naive[j+1].second); } } @@ -149,10 +151,9 @@ class BinaryTreeTest { void AllRangeNearestNeighbors() { tree_.BuildBreadthFirst(); - tree_.InitAllKNearestNeighborOutput(result_file_, - range_); - tree_.AllKNearestNeighbor(tree_.parent_, range_); - tree_.CloseAllKNearestNeighborOutput(); + tree_.InitAllRangeNearestNeighborOutput(result_file_); + tree_.AllNearestNeighbors(tree_.parent_, range_); + tree_.CloseAllRangeNearestNeighborOutput(); struct stat info; if (stat(data_file_.c_str(), &info)!=0) { FATAL( "Error %s file %s\n", @@ -161,7 +162,8 @@ class BinaryTreeTest { uint64 map_size = info.st_size-sizeof(int32); int fp=open(result_file_.c_str(), O_RDWR); - typename Node_t::NNResult *res=mmap(NULL, + typename Node_t::NNResult *res; + res=(typename Node_t::NNResult *)mmap(NULL, map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fp, @@ -171,13 +173,13 @@ class BinaryTreeTest { pair nearest_naive[num_of_points_]; index_t i=0; while (i::epsilon()); - TEST_ASSERT(res[i].second.get_id()== + TEST_ASSERT(res[i].nearest_.get_id()== nearest_naive[j+1].second); i++; j++; @@ -186,13 +188,26 @@ class BinaryTreeTest { munmap(res, map_size); } - - TEST_SUITE(BuildDepthFirst, - BuildBreadthFirst, - kNearestNeighbor, - RangeNearestNeighbor, - AllKNearestNeighbors, - AllRangeNearestNeighbors) + void TestAll() { + Init(); + BuildDepthFirst(); + Destruct(); + Init(); + BuildBreadthFirst(); + Destruct(); + Init(); + kNearestNeighbor(); + Destruct(); + Init(); + RangeNearestNeighbor(); + Destruct(); + Init(); + AllKNearestNeighbors(); + Destruct(); + Init(); + AllRangeNearestNeighbors(); + Destruct(); + } private: BinaryTree_t tree_; BinaryDataset data_; @@ -213,8 +228,8 @@ class BinaryTreeTest { Precision_t dist=Metric_t::Distance(data_.At(i), data_.At(query), dimension_); - result[i].first=i; - result[i].second=dist; + result[i].first=dist; + result[i].second=i; } sort(result, result+num_of_points_); } @@ -234,8 +249,6 @@ struct BasicTypes { typedef MemoryManager Allocator_t; typedef EuclideanMetric Metric_t; }; -template class KdPivoter1 { -}; struct Parameters { typedef float32 Precision_t; typedef MemoryManager Allocator_t; @@ -246,4 +259,7 @@ struct Parameters { typedef KdPivoter1 Pivot_t; }; typedef BinaryTreeTest BinaryTreeTest_t; -RUN_ALL_TESTS(BinaryTreeTest_t) +int main(int argc, char *argv[]) { + BinaryTreeTest_t test; + test.TestAll(); +} diff --git a/fastlib/u/nvasil/tree/kd_pivoter1.h b/fastlib/u/nvasil/tree/kd_pivoter1.h index cf8f2a04a0..c123a993a5 100644 --- a/fastlib/u/nvasil/tree/kd_pivoter1.h +++ b/fastlib/u/nvasil/tree/kd_pivoter1.h @@ -33,7 +33,7 @@ class KdPivoter1 { struct PivotInfo { public: void Init(index_t start, index_t num_of_points, HyperRectangle_t &box) { - box_.Copy(box_); + box_.Alias(box); start_=start; num_of_points_=num_of_points; } @@ -102,7 +102,8 @@ class KdPivoter1 { UpdateHyperRectangle(point, hr); } FindPivotDimensionValue(hr); - PivotInfo *pv = new PivotInfo(0, num_of_points, hr); + PivotInfo *pv = new PivotInfo(); + pv->Init(0, num_of_points, hr); return pv; } @@ -126,7 +127,7 @@ class KdPivoter1 { void UpdateHyperRectangle(Precision_t *point, HyperRectangle_t &hr) { - for(int32 j=0; jget_dimension(); j++) { if (point[j] > hr.get_max()[j]) { hr.get_max()[j] = point[j]; } diff --git a/fastlib/u/nvasil/tree/kd_pivoter1.h~ b/fastlib/u/nvasil/tree/kd_pivoter1.h~ index 06488dfb89..7a07d60e6c 100644 --- a/fastlib/u/nvasil/tree/kd_pivoter1.h~ +++ b/fastlib/u/nvasil/tree/kd_pivoter1.h~ @@ -33,7 +33,7 @@ class KdPivoter1 { struct PivotInfo { public: void Init(index_t start, index_t num_of_points, HyperRectangle_t &box) { - box_.Copy(box_); + box_.Alias(box); start_=start; num_of_points_=num_of_points; } @@ -98,11 +98,12 @@ class KdPivoter1 { HyperRectangle_t hr; hr.Init(data_->get_dimension()); for(index_t i=0; iAt(i); + Precision_t *point = data_->At(i); UpdateHyperRectangle(point, hr); } FindPivotDimensionValue(hr); - PivotInfo *pv = new PivotInfo(0, num_of_points, hr); + PivotInfo *pv = new PivotInfo(); + pv->Init(0, num_of_points, hr); return pv; } diff --git a/fastlib/u/nvasil/tree/node.h b/fastlib/u/nvasil/tree/node.h index bc426c796b..c3089d6902 100644 --- a/fastlib/u/nvasil/tree/node.h +++ b/fastlib/u/nvasil/tree/node.h @@ -19,7 +19,7 @@ class Node { typedef typename TYPELIST::Metric_t Metric_t; typedef typename TYPELIST::BoundingBox_t BoundingBox_t; typedef typename TYPELIST::NodeCachedStatistics_t NodeCachedStatistics_t; - typedef typename TYPELIST::PointIdDescriminator_t PointIdDiscriminator_t; + typedef typename TYPELIST::PointIdDiscriminator_t PointIdDiscriminator_t; typedef typename Allocator_t::template ArrayPtr Array_t; typedef Node Node_t; typedef typename Allocator_t::template Ptr NodePtr_t; diff --git a/fastlib/u/nvasil/tree/node.h~ b/fastlib/u/nvasil/tree/node.h~ index cff8c5ecf7..bc426c796b 100644 --- a/fastlib/u/nvasil/tree/node.h~ +++ b/fastlib/u/nvasil/tree/node.h~ @@ -19,7 +19,7 @@ class Node { typedef typename TYPELIST::Metric_t Metric_t; typedef typename TYPELIST::BoundingBox_t BoundingBox_t; typedef typename TYPELIST::NodeCachedStatistics_t NodeCachedStatistics_t; - typedef typename TYPELIST::PointIdDescriminator_t PointIdDescriminator_t; + typedef typename TYPELIST::PointIdDescriminator_t PointIdDiscriminator_t; typedef typename Allocator_t::template ArrayPtr Array_t; typedef Node Node_t; typedef typename Allocator_t::template Ptr NodePtr_t; diff --git a/fastlib/u/nvasil/tree/node_impl.h b/fastlib/u/nvasil/tree/node_impl.h index aae11d5868..d1366a9526 100644 --- a/fastlib/u/nvasil/tree/node_impl.h +++ b/fastlib/u/nvasil/tree/node_impl.h @@ -136,10 +136,11 @@ inline void NODE__::FindNearest(POINTTYPE query_point, nearest.push_back(make_pair(dist, point)); } } - // for k-nearest neighbors - typename std::vector >::iterator it; - it=nearest.begin()+range; - if (Loki::TypeTraits::isStdFloat==false) { + + // for k-nearest neighbors + if (Loki::TypeTraits::isStdFloat==false) { + typename std::vector >::iterator it; + it=nearest.begin()+(index_t)range; std::partial_sort(nearest.begin(), it, nearest.end(), @@ -166,7 +167,7 @@ inline void NODE__::FindAllNearest( // for k nearest neighbors if (Loki::TypeTraits::isStdFloat==false) { // get the current maximum distance for the specific point - distance = query_node->kneighbors_[i*range+range-1].distance_; + distance = query_node->kneighbors_[i*(int32)range+(int32)range-1].distance_; } else { distance=range; } @@ -179,23 +180,23 @@ inline void NODE__::FindAllNearest( comp)) { // for k nearest neighbors if (Loki::TypeTraits::isStdFloat==false) { - vector > temp(range); + vector > temp((index_t)range); for(int32 j=0; jkneighbors_[i*range+j].distance_; - temp[j].second=query_node->kneighbors_[i*range+j].nearest_; + temp[j].first=query_node->kneighbors_[i*(index_t)range+j].distance_; + temp[j].second=query_node->kneighbors_[i*(index_t)range+j].nearest_; } Point_t point; point.Alias(query_node->points_.get()+i*dimension, index_[i]); FindNearest(point, temp, range, dimension, discriminator, comp); - for(int32 j=range-1; j>=0; j--) { - if (query_node->kneighbors_[i*range+j].nearest_.get_id() + for(int32 j=(index_t)range-1; j>=0; j--) { + if (query_node->kneighbors_[i*(index_t)range+j].nearest_.get_id() ==temp[j].second.get_id()) { break; } - query_node->kneighbors_[i*range+j].distance_=temp[j].first; - query_node->kneighbors_[i*range+j].nearest_=temp[j].second; + query_node->kneighbors_[i*(index_t)range+j].distance_=temp[j].first; + query_node->kneighbors_[i*(index_t)range+j].nearest_=temp[j].second; } // Estimate the maximum nearest neighbor distance comp.UpdateComparisons(); diff --git a/fastlib/u/nvasil/tree/node_impl.h~ b/fastlib/u/nvasil/tree/node_impl.h~ index d403bdff79..336df455ca 100644 --- a/fastlib/u/nvasil/tree/node_impl.h~ +++ b/fastlib/u/nvasil/tree/node_impl.h~ @@ -135,22 +135,19 @@ inline void NODE__::FindNearest(POINTTYPE query_point, point.Alias(points_.get()+i*dimension, index_[i]); nearest.push_back(make_pair(dist, point)); } - - // for k-nearest neighbors - typename std::vector >::iterator it; - it=nearest.begin()+range; - //for(index_t k=0; k::isStdFloat==false) { - std::partial_sort(nearest.begin(), - it, - nearest.end(), - PairComparator()); - if (nearest.size()>(uint32)range) { - nearest.erase(it, nearest.end()); - } - } + } + + // for k-nearest neighbors + if (Loki::TypeTraits::isStdFloat==false) { + typename std::vector >::iterator it; + it=nearest.begin()+(index_t)range; + std::partial_sort(nearest.begin(), + it, + nearest.end(), + PairComparator()); + if (nearest.size()>(uint32)range) { + nearest.erase(it, nearest.end()); + } } } @@ -170,7 +167,7 @@ inline void NODE__::FindAllNearest( // for k nearest neighbors if (Loki::TypeTraits::isStdFloat==false) { // get the current maximum distance for the specific point - distance = query_node->kneighbors_[i*range+range-1].distance_; + distance = query_node->kneighbors_[i*(int32)range+(int32)range-1].distance_; } else { distance=range; } @@ -183,18 +180,18 @@ inline void NODE__::FindAllNearest( comp)) { // for k nearest neighbors if (Loki::TypeTraits::isStdFloat==false) { - vector > temp(range); + vector > temp((index_t)range); for(int32 j=0; jkneighbors_[i*range+j].distance_; - temp[j].second=query_node->kneighbors_[i*range+j].nearest_; + temp[j].first=query_node->kneighbors_[i*(index_t)range+j].distance_; + temp[j].second=query_node->kneighbors_[i*(index_t)range+j].nearest_; } Point_t point; point.Alias(query_node->points_.get()+i*dimension, index_[i]); FindNearest(point, temp, range, dimension, discriminator, comp); - for(int32 j=range-1; j>=0; j--) { - if (query_node->kneighbors_[i*range+j].nearest_.get_id() + for(int32 j=(index_t)range-1; j>=0; j--) { + if (query_node->kneighbors_[i*(index_t)range+j].nearest_.get_id() ==temp[j].second.get_id()) { break; } diff --git a/fastlib/u/nvasil/tree/node_unit.cc b/fastlib/u/nvasil/tree/node_unit.cc index 5ff701f4ca..2b745d90ce 100644 --- a/fastlib/u/nvasil/tree/node_unit.cc +++ b/fastlib/u/nvasil/tree/node_unit.cc @@ -37,7 +37,7 @@ class NodeTest { struct NodeParameters : public TYPELIST { typedef HyperRectangle_t BoundingBox_t; typedef NullStatistics NodeCachedStatistics_t; - typedef SimpleDiscriminator PointIdDescriminator_t; + typedef SimpleDiscriminator PointIdDiscriminator_t; }; typedef Node Node_t; typedef typename Allocator_t:: template ArrayPtr Array_t; diff --git a/fastlib/u/nvasil/tree/node_unit.cc~ b/fastlib/u/nvasil/tree/node_unit.cc~ index ff4255c94a..5ff701f4ca 100644 --- a/fastlib/u/nvasil/tree/node_unit.cc~ +++ b/fastlib/u/nvasil/tree/node_unit.cc~ @@ -180,6 +180,6 @@ struct BasicParameters{ }; int main(int argc, char *argv[]) { - NodeTest node_test; + NodeTest node_test; node_test.TestAll(); } diff --git a/fastlib/u/nvasil/tree/null_statistics.h b/fastlib/u/nvasil/tree/null_statistics.h index 915922a082..8ef44657cb 100644 --- a/fastlib/u/nvasil/tree/null_statistics.h +++ b/fastlib/u/nvasil/tree/null_statistics.h @@ -19,5 +19,9 @@ class NullStatistics { public: void Alias(const NullStatistics &other) { + + } + NullStatistics &operator=(const NullStatistics &other) { + return *this; } };