ROOT logo
/*
  Test macro for TKDTree
  
  //Initialization:

  gSystem->AddIncludePath("-I$ALICE_ROOT/STAT")
  gSystem->Load("$ALICE_ROOT/lib/tgt_linux/libSTAT.so");
  .L $ALICE_ROOT/STAT/Macros/kDTreeTest.C+ 

  
  TestBuild();       // test build function of kdTree for memory leaks
  TestSpeed();       // test the CPU consumption to build kdTree
  TestkdtreeIF();    // test functionality of the kdTree
  TestSizeIF();      // test the size of kdtree - search application - Alice TPC tracker situation
  //
*/

#include <malloc.h>
#include "TSystem.h"
#include "TMatrixD.h"
#include "TRandom.h"
#include "TGraph.h"
#include "TStopwatch.h"
#include "TKDTree.h"




void TestBuild(const Int_t npoints = 1000000, const Int_t bsize = 100);
void TestSpeed(const Int_t npower2 = 20, const Int_t bsize = 10);

void TestkdtreeIF(Int_t npoints=1000, Int_t bsize=9, Int_t nloop=1000, Int_t mode = 2);
void TestSizeIF(Int_t nsec=36, Int_t nrows=159, Int_t npoints=1000,  Int_t bsize=10, Int_t mode=1);



Float_t Mem()
{
  // get mem info
  ProcInfo_t procInfo;
  gSystem->GetProcInfo(&procInfo);
  return procInfo.fMemVirtual;
}

//______________________________________________________________________
void kDTreeTest()
{
  //
  //
  //
  printf("\n\tTesting kDTree memory usage ...\n");
  TestBuild();  
  printf("\n\tTesting kDTree speed ...\n");
  TestSpeed();
}

//______________________________________________________________________
void TestBuild(const Int_t npoints, const Int_t bsize){  
  //
  // Test kdTree for memory leaks
  //
  Float_t *data0 =  new Float_t[npoints*2];
  Float_t *data[2];
  data[0] = &data0[0];
  data[1] = &data0[npoints];
  for (Int_t i=0;i<npoints;i++) {
    data[1][i]= gRandom->Rndm();
    data[0][i]= gRandom->Rndm();
  }
  Float_t before =Mem();
  TKDTreeIF *kdtree = new TKDTreeIF(npoints, 2, bsize, data);
	Float_t after = Mem();
  printf("Memory usage %f KB\n",after-before);
	delete kdtree;
  Float_t end = Mem();
  printf("Memory leak %f KB\n", end-before);
	return;	
}

//______________________________________________________________________
void TestSpeed(const Int_t npower2, const Int_t bsize)
{
  //
  // Test of building time of kdTree
  //
  if(npower2 < 10){
    printf("Please specify a power of 2 greater than 10\n");
    return;
  }
  
  Int_t npoints = Int_t(pow(2., npower2))*bsize;
  Float_t *data0 =  new Float_t[npoints*2];
  Float_t *data[2];
  data[0] = &data0[0];
  data[1] = &data0[npoints];
  for (Int_t i=0;i<npoints;i++) {
    data[1][i]= gRandom->Rndm();
    data[0][i]= gRandom->Rndm();
  }
  
  TGraph *g = new TGraph(npower2-10);
  g->SetMarkerStyle(7);
  TStopwatch timer;
  Int_t tpoints;
  TKDTreeIF *kdtree = 0x0;
  for(int i=10; i<npower2; i++){
    tpoints = Int_t(pow(2., i))*bsize;
    timer.Start(kTRUE);
    kdtree = new TKDTreeIF(tpoints, 2, bsize, data);
    timer.Stop();
    g->SetPoint(i-10, i, timer.CpuTime());
    printf("npoints [%d] nodes [%d] cpu time %f [s]\n", tpoints, kdtree->GetNNodes(), timer.CpuTime());
    //timer.Print("u");
    delete kdtree;
  }
  g->Draw("apl");
  return;
}

//______________________________________________________________________
void TestSizeIF(Int_t nsec, Int_t nrows, Int_t npoints,  Int_t bsize, Int_t mode)
{
  //
  // Test size to build kdtree
  //
  Float_t before =Mem();
  for (Int_t isec=0; isec<nsec;isec++)
    for (Int_t irow=0;irow<nrows;irow++){
      TestkdtreeIF(npoints,1,mode,bsize);
    }
  Float_t after = Mem();
  printf("Memory usage %f\n",after-before);
}




void  TestkdtreeIF(Int_t npoints, Int_t bsize, Int_t nloop, Int_t mode)
{
//
// Test speed and functionality of 2D kdtree.
// Input parametrs:
// npoints - number of data points
// bsize   - bucket size
// nloop   - number of loops
// mode    - tasks to be performed by the kdTree
//         - 0  : time building the tree
//

 
  Float_t rangey  = 100;
  Float_t rangez  = 100;
  Float_t drangey = 0.1;
  Float_t drangez = 0.1;

  //
  Float_t *data0 =  new Float_t[npoints*2];
  Float_t *data[2];
  data[0] = &data0[0];
  data[1] = &data0[npoints];
  Int_t i;   
  for (i=0; i<npoints; i++){
    data[0][i]          = gRandom->Uniform(-rangey, rangey);
    data[1][i]          = gRandom->Uniform(-rangez, rangez);
  }
  TStopwatch timer;
  
  // check time build
  printf("building kdTree ...\n");
  timer.Start(kTRUE);
  TKDTreeIF *kdtree = new TKDTreeIF(npoints, 2, bsize, data);
  timer.Stop();
  timer.Print();
  if(mode == 0) return;
  
  Float_t countern=0;
  Float_t counteriter  = 0;
  Float_t counterfound = 0;
  
  if (mode ==2){
    if (nloop) timer.Start(kTRUE);
    Int_t res[npoints];
    Int_t nfound = 0;
    for (Int_t kloop = 0;kloop<nloop;kloop++){
      if (kloop==0){
	counteriter = 0;
	counterfound= 0;
	countern    = 0;
      }
      for (Int_t i=0;i<npoints;i++){
	Float_t point[2]={data[0][i],data[1][i]};
	Float_t delta[2]={drangey,drangez};
	Int_t iter  =0;
	nfound =0;
	Int_t bnode =0;
	//kdtree->FindBNode(point,delta, bnode);
	//continue;
	kdtree->FindInRangeA(point,delta,res,nfound,iter,bnode);
	if (kloop==0){
	  //Bool_t isOK = kTRUE;
	  Bool_t isOK = kFALSE;
	  for (Int_t ipoint=0;ipoint<nfound;ipoint++)
	    if (res[ipoint]==i) isOK =kTRUE;
	  counteriter+=iter;
	  counterfound+=nfound;
	  if (isOK) {
	    countern++;
	  }else{
	    printf("Bug\n");
	  }
	}
      }
    }
    
    if (nloop){
      timer.Stop();
      timer.Print();
    }
  }
  delete [] data0;
  
  counteriter/=npoints;
  counterfound/=npoints;
  if (nloop) printf("Find nearest point:\t%f\t%f\t%f\n",countern, counteriter, counterfound);
}
 kDTreeTest.C:1
 kDTreeTest.C:2
 kDTreeTest.C:3
 kDTreeTest.C:4
 kDTreeTest.C:5
 kDTreeTest.C:6
 kDTreeTest.C:7
 kDTreeTest.C:8
 kDTreeTest.C:9
 kDTreeTest.C:10
 kDTreeTest.C:11
 kDTreeTest.C:12
 kDTreeTest.C:13
 kDTreeTest.C:14
 kDTreeTest.C:15
 kDTreeTest.C:16
 kDTreeTest.C:17
 kDTreeTest.C:18
 kDTreeTest.C:19
 kDTreeTest.C:20
 kDTreeTest.C:21
 kDTreeTest.C:22
 kDTreeTest.C:23
 kDTreeTest.C:24
 kDTreeTest.C:25
 kDTreeTest.C:26
 kDTreeTest.C:27
 kDTreeTest.C:28
 kDTreeTest.C:29
 kDTreeTest.C:30
 kDTreeTest.C:31
 kDTreeTest.C:32
 kDTreeTest.C:33
 kDTreeTest.C:34
 kDTreeTest.C:35
 kDTreeTest.C:36
 kDTreeTest.C:37
 kDTreeTest.C:38
 kDTreeTest.C:39
 kDTreeTest.C:40
 kDTreeTest.C:41
 kDTreeTest.C:42
 kDTreeTest.C:43
 kDTreeTest.C:44
 kDTreeTest.C:45
 kDTreeTest.C:46
 kDTreeTest.C:47
 kDTreeTest.C:48
 kDTreeTest.C:49
 kDTreeTest.C:50
 kDTreeTest.C:51
 kDTreeTest.C:52
 kDTreeTest.C:53
 kDTreeTest.C:54
 kDTreeTest.C:55
 kDTreeTest.C:56
 kDTreeTest.C:57
 kDTreeTest.C:58
 kDTreeTest.C:59
 kDTreeTest.C:60
 kDTreeTest.C:61
 kDTreeTest.C:62
 kDTreeTest.C:63
 kDTreeTest.C:64
 kDTreeTest.C:65
 kDTreeTest.C:66
 kDTreeTest.C:67
 kDTreeTest.C:68
 kDTreeTest.C:69
 kDTreeTest.C:70
 kDTreeTest.C:71
 kDTreeTest.C:72
 kDTreeTest.C:73
 kDTreeTest.C:74
 kDTreeTest.C:75
 kDTreeTest.C:76
 kDTreeTest.C:77
 kDTreeTest.C:78
 kDTreeTest.C:79
 kDTreeTest.C:80
 kDTreeTest.C:81
 kDTreeTest.C:82
 kDTreeTest.C:83
 kDTreeTest.C:84
 kDTreeTest.C:85
 kDTreeTest.C:86
 kDTreeTest.C:87
 kDTreeTest.C:88
 kDTreeTest.C:89
 kDTreeTest.C:90
 kDTreeTest.C:91
 kDTreeTest.C:92
 kDTreeTest.C:93
 kDTreeTest.C:94
 kDTreeTest.C:95
 kDTreeTest.C:96
 kDTreeTest.C:97
 kDTreeTest.C:98
 kDTreeTest.C:99
 kDTreeTest.C:100
 kDTreeTest.C:101
 kDTreeTest.C:102
 kDTreeTest.C:103
 kDTreeTest.C:104
 kDTreeTest.C:105
 kDTreeTest.C:106
 kDTreeTest.C:107
 kDTreeTest.C:108
 kDTreeTest.C:109
 kDTreeTest.C:110
 kDTreeTest.C:111
 kDTreeTest.C:112
 kDTreeTest.C:113
 kDTreeTest.C:114
 kDTreeTest.C:115
 kDTreeTest.C:116
 kDTreeTest.C:117
 kDTreeTest.C:118
 kDTreeTest.C:119
 kDTreeTest.C:120
 kDTreeTest.C:121
 kDTreeTest.C:122
 kDTreeTest.C:123
 kDTreeTest.C:124
 kDTreeTest.C:125
 kDTreeTest.C:126
 kDTreeTest.C:127
 kDTreeTest.C:128
 kDTreeTest.C:129
 kDTreeTest.C:130
 kDTreeTest.C:131
 kDTreeTest.C:132
 kDTreeTest.C:133
 kDTreeTest.C:134
 kDTreeTest.C:135
 kDTreeTest.C:136
 kDTreeTest.C:137
 kDTreeTest.C:138
 kDTreeTest.C:139
 kDTreeTest.C:140
 kDTreeTest.C:141
 kDTreeTest.C:142
 kDTreeTest.C:143
 kDTreeTest.C:144
 kDTreeTest.C:145
 kDTreeTest.C:146
 kDTreeTest.C:147
 kDTreeTest.C:148
 kDTreeTest.C:149
 kDTreeTest.C:150
 kDTreeTest.C:151
 kDTreeTest.C:152
 kDTreeTest.C:153
 kDTreeTest.C:154
 kDTreeTest.C:155
 kDTreeTest.C:156
 kDTreeTest.C:157
 kDTreeTest.C:158
 kDTreeTest.C:159
 kDTreeTest.C:160
 kDTreeTest.C:161
 kDTreeTest.C:162
 kDTreeTest.C:163
 kDTreeTest.C:164
 kDTreeTest.C:165
 kDTreeTest.C:166
 kDTreeTest.C:167
 kDTreeTest.C:168
 kDTreeTest.C:169
 kDTreeTest.C:170
 kDTreeTest.C:171
 kDTreeTest.C:172
 kDTreeTest.C:173
 kDTreeTest.C:174
 kDTreeTest.C:175
 kDTreeTest.C:176
 kDTreeTest.C:177
 kDTreeTest.C:178
 kDTreeTest.C:179
 kDTreeTest.C:180
 kDTreeTest.C:181
 kDTreeTest.C:182
 kDTreeTest.C:183
 kDTreeTest.C:184
 kDTreeTest.C:185
 kDTreeTest.C:186
 kDTreeTest.C:187
 kDTreeTest.C:188
 kDTreeTest.C:189
 kDTreeTest.C:190
 kDTreeTest.C:191
 kDTreeTest.C:192
 kDTreeTest.C:193
 kDTreeTest.C:194
 kDTreeTest.C:195
 kDTreeTest.C:196
 kDTreeTest.C:197
 kDTreeTest.C:198
 kDTreeTest.C:199
 kDTreeTest.C:200
 kDTreeTest.C:201
 kDTreeTest.C:202
 kDTreeTest.C:203
 kDTreeTest.C:204
 kDTreeTest.C:205
 kDTreeTest.C:206
 kDTreeTest.C:207
 kDTreeTest.C:208
 kDTreeTest.C:209
 kDTreeTest.C:210
 kDTreeTest.C:211
 kDTreeTest.C:212
 kDTreeTest.C:213
 kDTreeTest.C:214
 kDTreeTest.C:215
 kDTreeTest.C:216
 kDTreeTest.C:217
 kDTreeTest.C:218
 kDTreeTest.C:219
 kDTreeTest.C:220
 kDTreeTest.C:221
 kDTreeTest.C:222
 kDTreeTest.C:223
 kDTreeTest.C:224
 kDTreeTest.C:225
 kDTreeTest.C:226