/* * ===================================================================================== * * Filename: hyper_rectangle_unit.cc * * Description: * * Version: 1.0 * Created: 04/22/2007 09:45:28 PM EDT * Revision: none * Compiler: gcc * * Author: Nikolaos Vasiloglou (NV), nvasil@ieee.org * Company: Georgia Tech Fastlab-ESP Lab * * ===================================================================================== */ #include #include "fastlib/fastlib.h" #include "u/nvasil/mmanager/memory_manager.h" #include "u/nvasil/mmanager_with_tpie/memory_manager.h" #include "point.h" #include "euclidean_metric.h" #include "hyper_rectangle.h" template class HyperRectangleTest { friend class HyperRectangle; public: typedef typename TYPELIST::Precision_t Precision_t; typedef typename TYPELIST::Allocator_t Allocator_t; typedef typename TYPELIST::Metric_t Metric_t; typedef HyperRectangle HyperRectangle_t; HyperRectangleTest() { } ~HyperRectangleTest() { } void Init() { dimension_=2; Allocator_t::allocator_ = new Allocator_t(); Allocator_t::allocator_->Init(); hyper_rectangle_= new HyperRectangle_t(); hyper_rectangle_->Init(dimension_); hyper_rectangle_->min_.Lock(); hyper_rectangle_->max_.Lock(); hyper_rectangle_->min_[0]=-1; hyper_rectangle_->min_[1]=-1; hyper_rectangle_->max_[0]=1; hyper_rectangle_->max_[1]=1; hyper_rectangle_->min_.Unlock(); hyper_rectangle_->max_.Unlock(); } void Destruct() { delete hyper_rectangle_; Allocator_t::allocator_->Destruct(); delete Allocator_t::allocator_; unlink("temp_mem"); } void AliasTest() { printf("Alias Test\n"); Init(); HyperRectangle_t other; other.Alias(*hyper_rectangle_); other.min_.Lock(); other.max_.Lock(); DEBUG_ASSERT_MSG(other.min_==hyper_rectangle_->min_, "Min don't match\n"); DEBUG_ASSERT_MSG(other.max_==hyper_rectangle_->max_, "Max don't match\n"); DEBUG_ASSERT_MSG(other.pivot_dimension_==hyper_rectangle_->pivot_dimension_, "Pivot dimension doesn't match\n"); DEBUG_ASSERT_MSG(other.pivot_value_==hyper_rectangle_->pivot_value_, "Pivot value don't match\n"); other.min_.Unlock(); other.max_.Unlock(); Destruct(); } void CopyTest() { printf("Copy Test\n"); Init(); HyperRectangle_t other; other.Init(dimension_); other.Copy(*hyper_rectangle_, dimension_); other.min_.Lock(); other.max_.Lock(); DEBUG_ASSERT_MSG(other.min_==hyper_rectangle_->min_, "Min don't match\n"); DEBUG_ASSERT_MSG(other.max_!=hyper_rectangle_->max_, "Max are the same \n"); for(index_t i=0; imin_[i], "Min don't match\n"); DEBUG_ASSERT_MSG(other.max_[i]==hyper_rectangle_->max_[i], "Max left doesn't match\n"); } other.min_.Unlock(); other.max_.Unlock(); Destruct(); } void IsWithinTest() { Init(); Point point; point.Init(dimension_); point.Lock(); point[0]=-0.1; point[1]=0.3; Precision_t range=0.03; DEBUG_ASSERT_MSG(hyper_rectangle_->IsWithin(point, dimension_, range, comp_)==true, "IsWithin doesn't work\n"); range=2; DEBUG_ASSERT_MSG(hyper_rectangle_->IsWithin(point, dimension_, range, comp_)==false, "IsWithin doesn't work\n"); point.Unlock(); Destruct(); } void CrossesBoundariesTest() { Init(); Point point; point.Init(dimension_); point.Lock(); point[0]=2; point[1]=-4; Precision_t range=11; DEBUG_ASSERT_MSG(hyper_rectangle_->CrossesBoundaries(point, dimension_, range, comp_)==true, "CrossesBoundary doesn't work\n"); range=0.25; DEBUG_ASSERT_MSG(hyper_rectangle_->CrossesBoundaries(point, dimension_, range, comp_)==false, "CrossesBoundary doesn't work\n"); point.Unlock(); Destruct(); } void DistanceTest(){ Init(); Point point1; Point point2; point1.Init(dimension_); point2.Init(dimension_); point1.Lock(); point2.Lock(); point1[0]=0; point1[1]=1; point2[0]=-1; point2[1]=-2; DEBUG_ASSERT_MSG(HyperRectangle_t::Distance(point1, point2, dimension_)==10, "Distance between points doesn't work\n"); HyperRectangle_t other; other.Init(dimension_); other.min_.Lock(); other.max_.Lock(); other.min_[0]=2; other.min_[1]=2; other.max_[0]=5; other.max_[1]=5; other.min_.Unlock(); other.max_.Unlock(); DEBUG_ASSERT_MSG(HyperRectangle_t::Distance(*hyper_rectangle_, other, dimension_, comp_)==2, "Distance doesn't work\n"); other.min_.Lock(); other.max_.Lock(); other.min_[0]=-0.5; other.min_[1]=-0.5; other.min_.Unlock(); other.max_.Unlock(); DEBUG_ASSERT_MSG(HyperRectangle_t::Distance(*hyper_rectangle_, other, dimension_, comp_)==0, "Distance doesn't work\n"); point1.Unlock(); point2.Unlock(); Destruct(); } void TestAll() { AliasTest(); IsWithinTest(); CrossesBoundariesTest(); DistanceTest(); } private: HyperRectangle *hyper_rectangle_; int32 dimension_; ComputationsCounter comp_; }; struct BasicTypes1 { typedef float32 Precision_t; typedef mmapmm::MemoryManager Allocator_t; typedef EuclideanMetric Metric_t; }; struct BasicTypes2 { typedef float32 Precision_t; typedef tpiemm::MemoryManager Allocator_t; typedef EuclideanMetric Metric_t; }; int main(int argc, char *argv[]) { HyperRectangleTest hyper_rectangle_test1; HyperRectangleTest hyper_rectangle_test2; hyper_rectangle_test1.TestAll(); hyper_rectangle_test2.TestAll(); }