Seems to be running
This commit is contained in:
@@ -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<false>::allocator_ =
|
||||
@@ -157,9 +157,10 @@ void DuallTreeAllNearestNeighbors(Parameters &args) {
|
||||
template<typename TREE>
|
||||
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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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<typename NODETYPE>
|
||||
struct NodeInitializerTrait {
|
||||
static void Init(NodePtr_t ptr) {
|
||||
|
||||
}
|
||||
static const bool IsItGoodForRangeNN=true;
|
||||
static const bool IsItGoodForKnnInitialization= true;
|
||||
};
|
||||
|
||||
|
||||
};
|
||||
|
||||
template<int SpecialId>
|
||||
struct NodeInitializerTrait {
|
||||
static const bool IsItGoodForRangeNN=true;
|
||||
static const bool IsItGoodForKnnInitialization= true;
|
||||
};
|
||||
|
||||
template<>
|
||||
template<typename TYPELIST, bool diagnostic>
|
||||
struct BinaryTree<TYPELIST, diagnostic>::NodeInitializerTrait<KnnNode<TYPELIST, diagnostic> > {
|
||||
static void Init(BinaryTree<TYPELIST, diagnostic>::NodePtr_t ptr) {
|
||||
ptr->set_kneighbors(BinaryTree<TYPELIST, diagnostic>::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"
|
||||
|
||||
@@ -96,7 +96,7 @@ void TREE__::BuildBreadthFirst(
|
||||
fifo_pair.second->num_of_points_,
|
||||
dimension_,
|
||||
data_);
|
||||
NodeInitializerTrait<Node_t>::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<Node_t>::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<Node_t>::Init(ptr);
|
||||
ptr->set_kneighbors(knns_);
|
||||
ptr.Unlock();
|
||||
node_id_++;
|
||||
num_of_leafs_++;
|
||||
@@ -209,7 +209,7 @@ void TREE__::NearestNeighbor(POINTTYPE test_point,
|
||||
vector<pair<typename TREE__::Precision_t,
|
||||
typename TREE__::Point_t> > *nearest_point,
|
||||
NEIGHBORTYPE range) {
|
||||
LOKI_STATIC_CHECK((NodeInitializerTrait<Node_t>::IsItGoodForRangeNN &&
|
||||
LOKI_STATIC_CHECK((NodeInitializerTrait<Node_t::SpecialId>::IsItGoodForRangeNN &&
|
||||
Loki::TypeTraits<NEIGHBORTYPE>::isStdFloat==true) ||
|
||||
Loki::TypeTraits<NEIGHBORTYPE>::isStdFloat==false,
|
||||
You_are_using_the_wrong_node_probably_KnnNode_instead_of_Node);
|
||||
@@ -295,7 +295,7 @@ template<typename NEIGHBORTYPE>
|
||||
void TREE__::AllNearestNeighbors(typename TREE__::NodePtr_t query,
|
||||
NEIGHBORTYPE range) {
|
||||
|
||||
LOKI_STATIC_CHECK((NodeInitializerTrait<Node_t>::IsItGoodForRangeNN &&
|
||||
LOKI_STATIC_CHECK((NodeInitializerTrait<Node_t::kSpecialId>::IsItGoodForRangeNN &&
|
||||
Loki::TypeTraits<NEIGHBORTYPE>::isStdFloat==true) ||
|
||||
Loki::TypeTraits<NEIGHBORTYPE>::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<Node_t>::IsItGoodForKnnInitialization,
|
||||
LOKI_STATIC_CHECK(NodeInitializerTrait<Node_t::kSpecialId>::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<Node_t>::IsItGoodForRangeNN,
|
||||
LOKI_STATIC_CHECK(NodeInitializerTrait<Node_t::kSpecialId>::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<Node_t>::IsItGoodForKnnInitialization,
|
||||
LOKI_STATIC_CHECK(NodeInitializerTrait<Node_t::kSpecialId>::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<Node_t>::IsItGoodForRangeNN,
|
||||
LOKI_STATIC_CHECK(NodeInitializerTrait<Node_t::kSpecialId>::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<Node_t>::IsItGoodForKnnInitialization,
|
||||
LOKI_STATIC_CHECK(NodeInitializerTrait<Node_t::kSpecialId>::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<Node_t>::IsItGoodForKnnInitializationi,
|
||||
LOKI_STATIC_CHECK(!NodeInitializerTrait<Node_t::kSpecialId>::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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,8 @@ class KnnNode {
|
||||
typedef typename Allocator_t::template Ptr<KnnNode> NodePtr_t;
|
||||
typedef Point<Precision_t, Allocator_t> Point_t;
|
||||
typedef Point<Precision_t, Loki::NullType> NullPoint_t;
|
||||
static const int kSpecialId=1;
|
||||
|
||||
template<typename , bool> friend class KnnNodeTest;
|
||||
struct NNResult {
|
||||
NNResult() : point_id_(0),
|
||||
|
||||
@@ -12,7 +12,6 @@ KNN_NODE__::KnnNode() {
|
||||
left_.SetNULL();
|
||||
right_.SetNULL();
|
||||
points_.SetNULL();
|
||||
kneighbors_=NULL;
|
||||
node_id_ = numeric_limits<index_t>::max();
|
||||
min_dist_so_far_=numeric_limits<Precision_t>::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; j<knns; j++) {
|
||||
query_node->kneighbors_[i*knns+j]=temp[j].second;
|
||||
query_node->distances_[i*knns+j]=temp[j].first;
|
||||
}
|
||||
// Estimate the maximum nearest neighbor distance
|
||||
comp.UpdateComparisons();
|
||||
|
||||
@@ -26,6 +26,7 @@ class Node {
|
||||
typedef Point<Precision_t, Allocator_t> Point_t;
|
||||
typedef Point<Precision_t, Loki::NullType> NullPoint_t;
|
||||
template<typename , bool> friend class NodeTest;
|
||||
static const int kSpecialId=0;
|
||||
struct NNResult {
|
||||
NNResult() : point_id_(0),
|
||||
distance_(numeric_limits<Precision_t>::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();
|
||||
|
||||
@@ -62,7 +62,7 @@ struct NodeParameters1 {
|
||||
typedef SimpleDiscriminator PointIdDiscriminator_t;
|
||||
};
|
||||
struct TreeParameters1 {
|
||||
typedef Node<NodeParameters1, false>;
|
||||
typedef Node<NodeParameters1, false> Node_t;
|
||||
typedef KdPivoter1<BasicTypes1, false> Pivot_t;
|
||||
};
|
||||
struct BasicTypes2 {
|
||||
@@ -80,21 +80,21 @@ struct NodeParameters2 {
|
||||
typedef KdPivoter1<BasicTypes2, false> Pivot_t;
|
||||
};
|
||||
struct TreeParameters2 {
|
||||
typedef KnnNode<NodeParameters1, false>;
|
||||
typedef KdPivoter1<BasicTypes1, false> Pivot_t;
|
||||
typedef Node<NodeParameters2, false> Node_t;
|
||||
typedef KdPivoter1<BasicTypes2, false> Pivot_t;
|
||||
};
|
||||
truct TreeParameters3 {
|
||||
typedef KnnNode<NodeParameters1, false>;
|
||||
struct TreeParameters3 {
|
||||
typedef KnnNode<NodeParameters1, false> Node_t;
|
||||
typedef KdPivoter1<BasicTypes1, false> Pivot_t;
|
||||
};
|
||||
struct TreeParameters4 {
|
||||
typedef KnnNode<NodeParameters2, false>;
|
||||
typedef KdPivoter1<BasicTypes1, false> Pivot_t;
|
||||
typedef KnnNode<NodeParameters2, false> Node_t;
|
||||
typedef KdPivoter1<BasicTypes2, false> Pivot_t;
|
||||
};
|
||||
|
||||
typedef BinaryTree<TreeParameters1, false> BinaryKdTreeTPIEMM_t;
|
||||
typedef BinaryTree<TreeParameters2, false> BinaryKdTreeMMAPMM_t;
|
||||
typedef BinaryTree<TreeParameters3, false> BinaryKdTreeTPIEMM_KnnNode_t;
|
||||
typedef BinaryTree<TreeParameters4, false> BinaryKdTreeMMAPMM_KnnNode_t;
|
||||
typedef BinaryTree<TreeParameters3, false> BinaryKdTreeTPIEMMKnnNode_t;
|
||||
typedef BinaryTree<TreeParameters4, false> BinaryKdTreeMMAPMMKnnNode_t;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user