Seems to be running

This commit is contained in:
vasiloglou
2007-05-28 01:39:08 +00:00
parent 3a80bd5eb8
commit 75e16d2ca9
7 changed files with 59 additions and 48 deletions
@@ -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());
}
+9 -18
View File
@@ -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"
+23 -15
View File
@@ -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();
}
}
+2
View File
@@ -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),
+3 -4
View File
@@ -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();
+7
View File
@@ -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();
+9 -9
View File
@@ -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;