diff --git a/fastlib/trunk/contrib/dongryel/thesis_research/CMakeLists.txt b/fastlib/trunk/contrib/dongryel/thesis_research/CMakeLists.txt index 919035c50c..d5e181c345 100644 --- a/fastlib/trunk/contrib/dongryel/thesis_research/CMakeLists.txt +++ b/fastlib/trunk/contrib/dongryel/thesis_research/CMakeLists.txt @@ -51,6 +51,7 @@ include(CMake/TargetDistclean.cmake OPTIONAL) #include_directories( ${FASTLIB_INCLUDE_DIRS} ) include_directories(${CMAKE_BINARY_DIR}/include/) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/) diff --git a/fastlib/trunk/contrib/dongryel/thesis_research/core/table/dense_matrix.h b/fastlib/trunk/contrib/dongryel/thesis_research/core/table/dense_matrix.h index 8b8e94b7f5..ba46b1e2c3 100644 --- a/fastlib/trunk/contrib/dongryel/thesis_research/core/table/dense_matrix.h +++ b/fastlib/trunk/contrib/dongryel/thesis_research/core/table/dense_matrix.h @@ -6,13 +6,17 @@ #ifndef CORE_TABLE_DENSE_MATRIX_H #define CORE_TABLE_DENSE_MATRIX_H -#include "core/table/dense_point.h" -#include "core/table/memory_mapped_file.h" +#include "dense_point.h" +#include "memory_mapped_file.h" namespace core { namespace table { class DenseMatrix { + public: + + static core::table::MemoryMappedFile *global_m_file_; + private: double *ptr_; @@ -34,7 +38,7 @@ class DenseMatrix { double *first_ptr = ptr_ + first_col * n_rows_; double *second_ptr = ptr_ + second_col * n_rows_; for(int i = 0; i < n_rows_; first_ptr++, second_ptr++, i++) { - std::swap(first_ptr[i], second_ptr[i]); + std::swap(*first_ptr, *second_ptr); } } @@ -56,7 +60,12 @@ class DenseMatrix { } ~DenseMatrix() { - delete ptr_; + if(global_m_file_) { + global_m_file_->Deallocate(ptr_); + } + else { + delete ptr_; + } Reset(); } @@ -65,7 +74,8 @@ class DenseMatrix { core::table::MemoryMappedFile *m_file_in = NULL) { ptr_ = (m_file_in) ? - (double *)m_file_in->Allocate(n_rows_in * n_cols_in * sizeof(double)) : + (double *)m_file_in->Allocate( + n_rows_in * n_cols_in * sizeof(double)) : new double[n_rows_in * n_cols_in]; n_rows_ = n_rows_in; n_cols_ = n_cols_in; diff --git a/fastlib/trunk/contrib/dongryel/thesis_research/core/table/dense_point.h b/fastlib/trunk/contrib/dongryel/thesis_research/core/table/dense_point.h index ec92e5c3df..d0f9329984 100644 --- a/fastlib/trunk/contrib/dongryel/thesis_research/core/table/dense_point.h +++ b/fastlib/trunk/contrib/dongryel/thesis_research/core/table/dense_point.h @@ -10,8 +10,8 @@ #include #include -#include "core/table/abstract_point.h" -#include "core/table/memory_mapped_file.h" +#include "abstract_point.h" +#include "memory_mapped_file.h" namespace core { namespace table { @@ -29,7 +29,6 @@ class DenseConstPoint: public core::table::AbstractPoint { } virtual ~DenseConstPoint() { - // A const point is always defined as an alias to a part of an // already-existing memory block, so you do not free it. Reset(); @@ -104,6 +103,7 @@ class DensePoint: public DenseConstPoint { BOOST_SERIALIZATION_SPLIT_MEMBER() void Reset() { + DenseConstPoint::Reset(); is_alias_ = false; } @@ -113,9 +113,13 @@ class DensePoint: public DenseConstPoint { virtual ~DensePoint() { if(DenseConstPoint::ptr_ != NULL && is_alias_ == false) { - delete DenseConstPoint::ptr_; + if(global_m_file_) { + global_m_file_->Deallocate(ptr_); + } + else { + delete DenseConstPoint::ptr_; + } } - DenseConstPoint::Reset(); Reset(); } @@ -129,6 +133,7 @@ class DensePoint: public DenseConstPoint { (double *) global_m_file_->Allocate(sizeof(double) * length_in) : new double[length_in]; DenseConstPoint::n_rows_ = length_in; + is_alias_ = false; } void Init(const std::vector &vector_in) { @@ -140,17 +145,20 @@ class DensePoint: public DenseConstPoint { for(unsigned int i = 0; i < vector_in.size(); i++) { ptr_[i] = vector_in[i]; } + is_alias_ = false; } void Copy(const DenseConstPoint &point_in) { DenseConstPoint::ptr_ = (global_m_file_) ? - (double *) global_m_file_->Allocate(sizeof(double) * point_in.length()) : + (double *) global_m_file_->Allocate( + sizeof(double) * point_in.length()) : new double[point_in.length()]; memcpy( DenseConstPoint::ptr_, point_in.ptr(), sizeof(double) * point_in.length()); DenseConstPoint::n_rows_ = point_in.length(); + is_alias_ = false; } void SetZero() { @@ -164,7 +172,11 @@ class DensePoint: public DenseConstPoint { } void operator=(const core::table::DenseConstPoint &point_in) { + if(ptr_ == NULL) { + this->Init(point_in.length()); + } memcpy(ptr_, point_in.ptr(), sizeof(double) * point_in.length()); + is_alias_ = false; } void operator+=(const core::table::DenseConstPoint &point_in) { diff --git a/fastlib/trunk/contrib/dongryel/thesis_research/core/table/global.cc b/fastlib/trunk/contrib/dongryel/thesis_research/core/table/global.cc index 383a8c2f2d..2ab413bc5f 100644 --- a/fastlib/trunk/contrib/dongryel/thesis_research/core/table/global.cc +++ b/fastlib/trunk/contrib/dongryel/thesis_research/core/table/global.cc @@ -3,7 +3,13 @@ * @author Dongryeol Lee (dongryel@cc.gatech.edu) */ -#include "core/table/memory_mapped_file.h" -#include "core/table/dense_point.h" +#include "memory_mapped_file.h" +#include "dense_matrix.h" +#include "dense_point.h" +#include "table.h" + +core::table::MemoryMappedFile *core::table::DenseMatrix::global_m_file_ = NULL; core::table::MemoryMappedFile *core::table::DensePoint::global_m_file_ = NULL; + +core::table::MemoryMappedFile *core::table::Table::global_m_file_ = NULL; diff --git a/fastlib/trunk/contrib/dongryel/thesis_research/core/table/table.h b/fastlib/trunk/contrib/dongryel/thesis_research/core/table/table.h index 5098755235..caca4f7d78 100644 --- a/fastlib/trunk/contrib/dongryel/thesis_research/core/table/table.h +++ b/fastlib/trunk/contrib/dongryel/thesis_research/core/table/table.h @@ -23,6 +23,8 @@ class Table: public boost::noncopyable { typedef core::tree::GeneralBinarySpaceTree < core::tree::BallBound < core::table::DensePoint > > TreeType; + static core::table::MemoryMappedFile *global_m_file_; + public: class TreeIterator { @@ -145,7 +147,12 @@ class Table: public boost::noncopyable { } ~Table() { - delete tree_; + if(global_m_file_) { + RecursiveDeallocate_(tree_); + } + else { + delete tree_; + } tree_ = NULL; } @@ -255,6 +262,14 @@ class Table: public boost::noncopyable { private: + void RecursiveDeallocate_(TreeType *node) { + if(node->is_leaf() == false) { + RecursiveDeallocate_(node->left()); + RecursiveDeallocate_(node->right()); + } + global_m_file_->Deallocate(node); + } + void direct_get_(int point_id, double *entry) const { if(this->IsIndexed() == false) { data_.CopyColumnVector(point_id, entry); diff --git a/fastlib/trunk/contrib/dongryel/thesis_research/core/tree/gen_metric_tree_impl.h b/fastlib/trunk/contrib/dongryel/thesis_research/core/tree/gen_metric_tree_impl.h index c5d9fb47dd..391f7e5ac2 100644 --- a/fastlib/trunk/contrib/dongryel/thesis_research/core/tree/gen_metric_tree_impl.h +++ b/fastlib/trunk/contrib/dongryel/thesis_research/core/tree/gen_metric_tree_impl.h @@ -5,6 +5,9 @@ * @author Dongryeol Lee (dongryel@cc.gatech.edu) */ +#ifndef CORE_TREE_GEN_METRIC_TREE_IMPL_H +#define CORE_TREE_GEN_METRIC_TREE_IMPL_H + #include #include #include "core/metric_kernels/abstract_metric.h" @@ -105,9 +108,10 @@ int MatrixPartition( return left_count; } +template int FurthestColumnIndex( const core::metric_kernels::AbstractMetric &metric_in, - const core::table::AbstractPoint &pivot, + const PointType &pivot, const core::table::DenseMatrix &matrix, int begin, int count, double *furthest_distance) { @@ -265,3 +269,5 @@ void SplitGenMetricTree( } }; }; + +#endif