Adding the documentation.
[u/mrichter/AliRoot.git] / STAT / Macros / kDTreeTest.C
CommitLineData
8a8f8274 1#include <malloc.h>
2#include "TMatrixD.h"
3#include "TRandom.h"
4#include "TGraph.h"
5#include "TStopwatch.h"
6#include "../src/TKDTree.h"
7
8
9Float_t Mem()
10{
11 // size in KB
12 static struct mallinfo memdebug;
13 memdebug = mallinfo();
14 return memdebug.uordblks/1024.;
15}
16
17
18void TestBuild(const Int_t npoints = 1000000, const Int_t bsize = 100);
19void TestSpeed(const Int_t npower2 = 20, const Int_t bsize = 10);
20
21void testindexes(Int_t nloop, Int_t npoints);
22void testkdtreeIF(Int_t npoints=1000, Int_t bsize=9, Int_t nloop=1000, Int_t mode = 2);
23void TestSizeIF(Int_t npoints=1000, Int_t nrows = 150, Int_t nsec=18, Int_t mode = 1, Int_t bsize=9);
24
25//______________________________________________________________________
26void kDTreeTest()
27{
28 printf("\n\tTesting kDTree memory usage ...\n");
29 TestBuild();
30
31 printf("\n\tTesting kDTree speed ...\n");
32 TestSpeed();
33}
34
35//______________________________________________________________________
36void TestBuild(const Int_t npoints, const Int_t bsize){
37 Float_t *data0 = new Float_t[npoints*2];
38 Float_t *data[2];
39 data[0] = &data0[0];
40 data[1] = &data0[npoints];
41 for (Int_t i=0;i<npoints;i++) {
42 data[1][i]= gRandom->Rndm();
43 data[0][i]= gRandom->Rndm();
44 }
45 Float_t before =Mem();
46 TKDTreeIF *kdtree = new TKDTreeIF(npoints, 2, bsize, data);
47 Float_t after = Mem();
48 printf("Memory usage %f KB\n",after-before);
49 delete kdtree;
50 Float_t end = Mem();
51 printf("Memory leak %f KB\n", end-before);
52 return;
53}
54
55//______________________________________________________________________
56void TestSpeed(const Int_t npower2, const Int_t bsize)
57{
58 if(npower2 < 10){
59 printf("Please specify a power of 2 greater than 10\n");
60 return;
61 }
62
63 Int_t npoints = Int_t(pow(2., npower2))*bsize;
64 Float_t *data0 = new Float_t[npoints*2];
65 Float_t *data[2];
66 data[0] = &data0[0];
67 data[1] = &data0[npoints];
68 for (Int_t i=0;i<npoints;i++) {
69 data[1][i]= gRandom->Rndm();
70 data[0][i]= gRandom->Rndm();
71 }
72
73 TGraph *g = new TGraph(npower2-10);
74 g->SetMarkerStyle(7);
75 TStopwatch timer;
76 Int_t tpoints;
77 TKDTreeIF *kdtree = 0x0;
78 for(int i=10; i<npower2; i++){
79 tpoints = Int_t(pow(2., i))*bsize;
80 timer.Start(kTRUE);
81 kdtree = new TKDTreeIF(tpoints, 2, bsize, data);
82 timer.Stop();
83 g->SetPoint(i-10, i, timer.CpuTime());
84 printf("npoints [%d] nodes [%d] cpu time %f [s]\n", tpoints, kdtree->GetNNodes(), timer.CpuTime());
85 //timer.Print("u");
86 delete kdtree;
87 }
88 g->Draw("apl");
89 return;
90}
91
92//______________________________________________________________________
93void TestSizeIF(Int_t npoints, Int_t nrows, Int_t nsec, Int_t mode, Int_t bsize)
94{
95 //
96 // test size to build kdtree
97 //
98 Float_t before =Mem();
99 for (Int_t isec=0; isec<nsec;isec++)
100 for (Int_t irow=0;irow<nrows;irow++){
101 testkdtreeIF(npoints,0,mode,bsize);
102 }
103 Float_t after = Mem();
104 printf("Memory usage %f\n",after-before);
105}
106
107
108void testindexes(Int_t nloop, Int_t npoints){
109 //
110 // test indexing
111 //
112 TKDTree<Int_t, Float_t> *kdtree = new TKDTree<Int_t, Float_t>(0,0,0,0);
113 Int_t row =0;
114 Int_t collumn =0;
115 TStopwatch timer;
116 timer.Start();
117 row = 10;
118 for (Int_t iloop=0;iloop<nloop;iloop++)
119 for (Int_t index=1;index<npoints;index++){
120 //row = TMath::Log2(index);
121 //row=0;
122 // if (index< (16<<row)) row=0;
123// for (; index>=(32<<row);row+=5);
124// for (; index>=(2<<row);row++);
125// collumn= index-(1<<row);
126 TKDTree<Int_t, Float_t>::GetCoord(index,row,collumn);
127 //
128 //Int_t index2=kdtree->GetIndex(row,collumn);
129 //printf("%d\t%d\t%d\t%d\n",index,index2,row,collumn);
130 if (kdtree->GetIndex(row,collumn)!=index || collumn<0) {
131 printf("Problem\n");
132 }
133 }
134 timer.Stop();
135 timer.Print();
136}
137
138
139void testkdtreeIF(Int_t npoints, Int_t bsize, Int_t nloop, Int_t mode)
140{
141//
142// Test speed and functionality of 2D kdtree.
143// Input parametrs:
144// npoints - number of data points
145// bsize - bucket size
146// nloop - number of loops
147// mode - tasks to be performed by the kdTree
148// - 0 : time building the tree
149//
150
151
152 Float_t rangey = 100;
153 Float_t rangez = 100;
154 Float_t drangey = 0.1;
155 Float_t drangez = 0.1;
156
157 //
158 Float_t *data0 = new Float_t[npoints*2];
159 Float_t *data[2];
160 data[0] = &data0[0];
161 data[1] = &data0[npoints];
162 Int_t i;
163 for (i=0; i<npoints; i++){
164 data[0][i] = gRandom->Uniform(-rangey, rangey);
165 data[1][i] = gRandom->Uniform(-rangez, rangez);
166 }
167 TStopwatch timer;
168
169 // check time build
170 printf("building kdTree ...\n");
171 timer.Start(kTRUE);
172 TKDTreeIF *kdtree = new TKDTreeIF(npoints, 2, bsize, data);
173 timer.Stop();
174 timer.Print();
175 if(mode == 0) return;
176
177
178
179 Float_t countern=0;
180 Float_t counteriter = 0;
181 Float_t counterfound = 0;
182
183
184 if (mode ==2){
185 if (nloop) timer.Start(kTRUE);
186 Int_t res[npoints];
187 Int_t nfound = 0;
188 for (Int_t kloop = 0;kloop<nloop;kloop++){
189 if (kloop==0){
190 counteriter = 0;
191 counterfound= 0;
192 countern = 0;
193 }
194 for (Int_t i=0;i<npoints;i++){
195 Float_t point[2]={data[0][i],data[1][i]};
196 Float_t delta[2]={drangey,drangez};
197 Int_t iter =0;
198 nfound =0;
199 Int_t bnode =0;
200 //kdtree->FindBNode(point,delta, bnode);
201 //continue;
202 kdtree->FindInRangeA(point,delta,res,nfound,iter,bnode);
203 if (kloop==0){
204 //Bool_t isOK = kTRUE;
205 Bool_t isOK = kFALSE;
206 for (Int_t ipoint=0;ipoint<nfound;ipoint++)
207 if (res[ipoint]==i) isOK =kTRUE;
208 counteriter+=iter;
209 counterfound+=nfound;
210 if (isOK) {
211 countern++;
212 }else{
213 printf("Bug\n");
214 }
215 }
216 }
217 }
218
219 if (nloop){
220 timer.Stop();
221 timer.Print();
222 }
223 }
224 delete [] data0;
225
226 counteriter/=npoints;
227 counterfound/=npoints;
228 if (nloop) printf("Find nearest point:\t%f\t%f\t%f\n",countern, counteriter, counterfound);
229}