diff --git a/fastlib/u/nvasil/mmengines_comparisons/main.cc b/fastlib/u/nvasil/mmengines_comparisons/main.cc index 7b027199a4..b33c3cc550 100644 --- a/fastlib/u/nvasil/mmengines_comparisons/main.cc +++ b/fastlib/u/nvasil/mmengines_comparisons/main.cc @@ -75,7 +75,7 @@ int main(int argc, char *argv[]) { args.page_size_ = fx_param_int(NULL, "page_size", 4096); args.memory_file_ = fx_param_str(NULL, "memory_file", "temp_mem"); args.memory_engine_ = fx_param_str(NULL, "memory_engine", "mmapmm"); - args.specialized_for_knns_ = fx_param_int(NULL, "specialized_for_knns", false); + args.specialized_for_knns_ = fx_param_bool(NULL, "specialized_for_knns", false); printf("Creating swap file...\n"); if (args.memory_engine_ == "mmapmm") { mmapmm::MemoryManager::allocator_ = @@ -157,9 +157,10 @@ void DuallTreeAllNearestNeighbors(Parameters &args) { template void DuallTreeAllNearestNeighborsSpecializedForKnn(Parameters &args) { TREE tree; + printf("Procceding with the specialized method for knn node..\n"); printf("Building the tree..."); tree.Init(&args.data_); - + tree.set_knns(args.knns_); fx_timer_start(NULL, "build"); tree.BuildDepthFirst(); fx_timer_stop(NULL, "build"); @@ -172,7 +173,10 @@ void DuallTreeAllNearestNeighborsSpecializedForKnn(Parameters &args) { fx_timer_start(NULL, "dualltree"); tree.AllNearestNeighbors(tree.get_parent(), args.knns_); fx_timer_stop(NULL, "dualltree"); + printf("Collecting results....\n"); + fx_timer_start(NULL, "collecting_results"); tree.CollectKNearestNeighborWithMMAP(args.out_file_.c_str()); + fx_timer_stop(NULL, "collecting_results"); unlink(args.out_file_.c_str()); } diff --git a/fastlib/u/nvasil/tree/binary_tree.h b/fastlib/u/nvasil/tree/binary_tree.h index 7858053e8c..bd3c6c0441 100644 --- a/fastlib/u/nvasil/tree/binary_tree.h +++ b/fastlib/u/nvasil/tree/binary_tree.h @@ -200,27 +200,18 @@ class BinaryTree { // This is a value for the knns set ahead when we want to build the tre // specifically for knns index_t knns_; - - template - struct NodeInitializerTrait { - static void Init(NodePtr_t ptr) { - - } - static const bool IsItGoodForRangeNN=true; - static const bool IsItGoodForKnnInitialization= true; - }; - - +}; + +template +struct NodeInitializerTrait { + static const bool IsItGoodForRangeNN=true; + static const bool IsItGoodForKnnInitialization= true; }; template<> -template -struct BinaryTree::NodeInitializerTrait > { - static void Init(BinaryTree::NodePtr_t ptr) { - ptr->set_kneighbors(BinaryTree::knns_); - } - static const bool IsItGoodForRangeNN=false; - static const bool IsItGoodForKnnInitialization=false; +struct NodeInitializerTrait<1> { + static const bool IsItGoodForRangeNN=true; + static const bool IsItGoodForKnnInitialization= true; }; #include "binary_tree_impl.h" diff --git a/fastlib/u/nvasil/tree/binary_tree_impl.h b/fastlib/u/nvasil/tree/binary_tree_impl.h index 68a7fcc7a1..e5c282b3b3 100644 --- a/fastlib/u/nvasil/tree/binary_tree_impl.h +++ b/fastlib/u/nvasil/tree/binary_tree_impl.h @@ -96,7 +96,7 @@ void TREE__::BuildBreadthFirst( fifo_pair.second->num_of_points_, dimension_, data_); - NodeInitializerTrait::Init((*fifo_pair.first)); + (*fifo_pair.first)->set_kneighbors(knns_); (*fifo_pair.first).Unlock(); num_of_leafs_++; node_id_++; @@ -155,7 +155,7 @@ void TREE__::BuildDepthFirst(typename TREE__::NodePtr_t ptr, pivot_pair.second->num_of_points_, dimension_, data_); - NodeInitializerTrait::Init(ptr); + ptr->set_kneighbors(knns_); ptr.Unlock(); node_id_++; num_of_leafs_++; @@ -193,7 +193,7 @@ void TREE__::BuildDepthFirst(typename TREE__::NodePtr_t ptr, pivot_info->num_of_points_, dimension_, data_); - NodeInitializerTrait::Init(ptr); + ptr->set_kneighbors(knns_); ptr.Unlock(); node_id_++; num_of_leafs_++; @@ -209,7 +209,7 @@ void TREE__::NearestNeighbor(POINTTYPE test_point, vector > *nearest_point, NEIGHBORTYPE range) { - LOKI_STATIC_CHECK((NodeInitializerTrait::IsItGoodForRangeNN && + LOKI_STATIC_CHECK((NodeInitializerTrait::IsItGoodForRangeNN && Loki::TypeTraits::isStdFloat==true) || Loki::TypeTraits::isStdFloat==false, You_are_using_the_wrong_node_probably_KnnNode_instead_of_Node); @@ -295,7 +295,7 @@ template void TREE__::AllNearestNeighbors(typename TREE__::NodePtr_t query, NEIGHBORTYPE range) { - LOKI_STATIC_CHECK((NodeInitializerTrait::IsItGoodForRangeNN && + LOKI_STATIC_CHECK((NodeInitializerTrait::IsItGoodForRangeNN && Loki::TypeTraits::isStdFloat==true) || Loki::TypeTraits::isStdFloat==false, You_are_using_the_wrong_node_probably_KnnNode_instead_of_Node); @@ -438,7 +438,7 @@ void TREE__::AllNearestNeighbors(typename TREE__::NodePtr_t query, TEMPLATE__ void TREE__::InitAllKNearestNeighborOutput(string file, int32 knns) { - LOKI_STATIC_CHECK(NodeInitializerTrait::IsItGoodForKnnInitialization, + LOKI_STATIC_CHECK(NodeInitializerTrait::IsItGoodForKnnInitialization, You_are_using_the_wrong_node_probably_KnnNode_instead_of_Node); @@ -501,7 +501,7 @@ void TREE__::InitAllKNearestNeighborOutput(typename TREE__::NodePtr_t ptr, TEMPLATE__ void TREE__::InitAllRangeNearestNeighborOutput(string file) { - LOKI_STATIC_CHECK(NodeInitializerTrait::IsItGoodForRangeNN, + LOKI_STATIC_CHECK(NodeInitializerTrait::IsItGoodForRangeNN, You_are_using_the_wrong_node_probably_KnnNode_instead_of_Node); FILE *fp=fopen(file.c_str(), "w"); @@ -538,7 +538,7 @@ void TREE__::InitAllRangeNearestNeighborOutput( TEMPLATE__ void TREE__::CloseAllKNearestNeighborOutput(int32 knns) { - LOKI_STATIC_CHECK(NodeInitializerTrait::IsItGoodForKnnInitialization, + LOKI_STATIC_CHECK(NodeInitializerTrait::IsItGoodForKnnInitialization, You_are_using_the_wrong_node_probably_KnnNode_instead_of_Node); if (munmap(all_nn_out_.get_ptr(), @@ -550,7 +550,7 @@ void TREE__::CloseAllKNearestNeighborOutput(int32 knns) { TEMPLATE__ void TREE__::CloseAllRangeNearestNeighborOutput() { - LOKI_STATIC_CHECK(NodeInitializerTrait::IsItGoodForRangeNN, + LOKI_STATIC_CHECK(NodeInitializerTrait::IsItGoodForRangeNN, You_are_using_the_wrong_node_probably_KnnNode_instead_of_Node); parent_.Lock(); @@ -560,7 +560,7 @@ void TREE__::CloseAllRangeNearestNeighborOutput() { TEMPLATE__ void TREE__::CollectKNearestNeighborWithMMAP(string file) { - LOKI_STATIC_CHECK(!NodeInitializerTrait::IsItGoodForKnnInitialization, + LOKI_STATIC_CHECK(NodeInitializerTrait::IsItGoodForKnnInitialization, You_are_using_the_wrong_node_probably_KnnNode_instead_of_Node); FILE *fp=fopen(file.c_str(), "w"); @@ -579,6 +579,7 @@ void TREE__::CollectKNearestNeighborWithMMAP(string file) { typename Node_t::NNResult *ptr =(typename Node_t::NNResult *)mmap(NULL, sizeof(typename Node_t::NNResult)*knns_*num_of_points_, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + close(fd); if (ptr==MAP_FAILED) { fprintf(stderr, "Unable to map file: %s", strerror(errno)); assert(false); @@ -588,9 +589,8 @@ void TREE__::CollectKNearestNeighborWithMMAP(string file) { NONFATAL("It wasn't possible to advise output, error: %s", strerror(errno)); } - close(fd); CollectKNearestNeighbor(parent_, buffer); - if (munmap(buffer, sizeof(typename Node_t::NNResult)*knns_*num_of_points_) + if (munmap(ptr, sizeof(typename Node_t::NNResult)*knns_*num_of_points_) ==-1) { FATAL("Failed to unmap memory, error: %s\n", strerror(errno)); } @@ -598,7 +598,7 @@ void TREE__::CollectKNearestNeighborWithMMAP(string file) { TEMPLATE__ void TREE__::CollectKNearestNeighborWithFwrite(string file) { - LOKI_STATIC_CHECK(!NodeInitializerTrait::IsItGoodForKnnInitializationi, + LOKI_STATIC_CHECK(!NodeInitializerTrait::IsItGoodForKnnInitializationi, You_are_using_the_wrong_node_probably_KnnNode_instead_of_Node); FILE *fp=fopen(file.c_str(), "w"); @@ -613,11 +613,19 @@ void TREE__::CollectKNearestNeighborWithFwrite(string file) { TEMPLATE__ void TREE__::CollectKNearestNeighbor(NodePtr_t ptr, typename Node_t::NNResult *out) { + ptr.Lock(); if (ptr->IsLeaf()) { ptr->OutputNeighbors(out, knns_); + ptr.Unlock(); } else { - CollectKNearestNeighbor(ptr->get_left(), out); - CollectKNearestNeighbor(ptr->get_right(), out); + NodePtr_t left = ptr->get_left(); + left.Lock(); + CollectKNearestNeighbor(left, out); + left.Unlock(); + NodePtr_t right = ptr->get_right(); + right.Lock(); + CollectKNearestNeighbor(right, out); + right.Unlock(); } } diff --git a/fastlib/u/nvasil/tree/knn_node.h b/fastlib/u/nvasil/tree/knn_node.h index 5b597c5f80..9c59cf2a70 100644 --- a/fastlib/u/nvasil/tree/knn_node.h +++ b/fastlib/u/nvasil/tree/knn_node.h @@ -25,6 +25,8 @@ class KnnNode { typedef typename Allocator_t::template Ptr NodePtr_t; typedef Point Point_t; typedef Point NullPoint_t; + static const int kSpecialId=1; + template friend class KnnNodeTest; struct NNResult { NNResult() : point_id_(0), diff --git a/fastlib/u/nvasil/tree/knn_node_impl.h b/fastlib/u/nvasil/tree/knn_node_impl.h index 651c540ac4..86baae7df4 100644 --- a/fastlib/u/nvasil/tree/knn_node_impl.h +++ b/fastlib/u/nvasil/tree/knn_node_impl.h @@ -12,7 +12,6 @@ KNN_NODE__::KnnNode() { left_.SetNULL(); right_.SetNULL(); points_.SetNULL(); - kneighbors_=NULL; node_id_ = numeric_limits::max(); min_dist_so_far_=numeric_limits::max(); } @@ -198,9 +197,9 @@ inline void KNN_NODE__::FindAllNearest( (unsigned int)temp.size()); - for(int32 j=0; j<(index_t)knns; j++) { - query_node->kneighbors_[i*knns+j]=temp[j].first; - query_node->distances_[i*knns+j]=temp[j].second; + for(int32 j=0; jkneighbors_[i*knns+j]=temp[j].second; + query_node->distances_[i*knns+j]=temp[j].first; } // Estimate the maximum nearest neighbor distance comp.UpdateComparisons(); diff --git a/fastlib/u/nvasil/tree/node.h b/fastlib/u/nvasil/tree/node.h index 97a6c93bbd..f1f4716baf 100644 --- a/fastlib/u/nvasil/tree/node.h +++ b/fastlib/u/nvasil/tree/node.h @@ -26,6 +26,7 @@ class Node { typedef Point Point_t; typedef Point NullPoint_t; template friend class NodeTest; + static const int kSpecialId=0; struct NNResult { NNResult() : point_id_(0), distance_(numeric_limits::max()) { @@ -129,6 +130,12 @@ class Node { NNResult *get_kneighbors() { return kneighbors_; } + void set_kneighbors(index_t knns) { + //This is empty it is supposed to be used during the initialization + //of the node. It has meaning only for the KnnNode + } + + // This is used on an all knn query void set_kneighbors(NNResult *chunk, uint32 knns) { kneighbors_=chunk; index_.Lock(); diff --git a/fastlib/u/nvasil/tree/tree_definitions.h b/fastlib/u/nvasil/tree/tree_definitions.h index 8bf5f0bff1..0550a01e30 100644 --- a/fastlib/u/nvasil/tree/tree_definitions.h +++ b/fastlib/u/nvasil/tree/tree_definitions.h @@ -62,7 +62,7 @@ struct NodeParameters1 { typedef SimpleDiscriminator PointIdDiscriminator_t; }; struct TreeParameters1 { - typedef Node; + typedef Node Node_t; typedef KdPivoter1 Pivot_t; }; struct BasicTypes2 { @@ -80,21 +80,21 @@ struct NodeParameters2 { typedef KdPivoter1 Pivot_t; }; struct TreeParameters2 { - typedef KnnNode; - typedef KdPivoter1 Pivot_t; + typedef Node Node_t; + typedef KdPivoter1 Pivot_t; }; -truct TreeParameters3 { - typedef KnnNode; +struct TreeParameters3 { + typedef KnnNode Node_t; typedef KdPivoter1 Pivot_t; }; struct TreeParameters4 { - typedef KnnNode; - typedef KdPivoter1 Pivot_t; + typedef KnnNode Node_t; + typedef KdPivoter1 Pivot_t; }; typedef BinaryTree BinaryKdTreeTPIEMM_t; typedef BinaryTree BinaryKdTreeMMAPMM_t; -typedef BinaryTree BinaryKdTreeTPIEMM_KnnNode_t; -typedef BinaryTree BinaryKdTreeMMAPMM_KnnNode_t; +typedef BinaryTree BinaryKdTreeTPIEMMKnnNode_t; +typedef BinaryTree BinaryKdTreeMMAPMMKnnNode_t;