14 #ifndef ROOT_Math_KDTree
15 #define ROOT_Math_KDTree
33 template<
class _DataPo
int>
38 typedef _DataPoint point_type;
39 typedef typename _DataPoint::value_type value_type;
40 static UInt_t Dimension() {
return _DataPoint::Dimension();}
51 Bool_t operator()(
const point_type* pFirst,
const point_type* pSecond)
const;
53 UInt_t GetAxis()
const {
return fAxis;}
54 void SetAxis(UInt_t iAxis) {fAxis = iAxis;}
63 Cut():fAxis(0),fCutValue(0) {}
64 Cut(UInt_t iAxis,Double_t fNewCutValue):fAxis(iAxis),fCutValue(fNewCutValue) {}
67 UInt_t GetAxis()
const {
return fAxis;}
68 value_type GetCutValue()
const {
return fCutValue;}
69 void SetAxis(UInt_t iAxis) {fAxis = iAxis;}
70 void SetCutValue(Double_t fNewCutValue) {fCutValue = fNewCutValue;}
72 Bool_t operator<(
const point_type& rPoint)
const;
73 Bool_t operator>(
const point_type& rPoint)
const;
91 BaseNode(BaseNode* pParent = 0);
95 virtual BaseNode* Clone() = 0;
96 virtual const BinNode* FindNode(
const point_type& rPoint)
const = 0;
97 virtual void GetClosestPoints(
const point_type& rRef,UInt_t nPoints,std::vector<std::pair<const _DataPoint*,Double_t> >& vFoundPoints)
const = 0;
98 virtual void GetPointsWithinDist(
const point_type& rRef,value_type fDist,std::vector<const point_type*>& vFoundPoints)
const = 0;
99 virtual Bool_t Insert(
const point_type& rPoint) = 0;
100 virtual void Print(
int iRow = 0)
const = 0;
103 BaseNode*& LeftChild() {
return fLeftChild;}
104 const BaseNode* LeftChild()
const {
return fLeftChild;}
105 BaseNode*& Parent() {
return fParent;}
106 const BaseNode* Parent()
const {
return fParent;}
107 BaseNode*& RightChild() {
return fRightChild;}
108 const BaseNode* RightChild()
const {
return fRightChild;}
111 BaseNode*& GetParentPointer();
112 virtual Bool_t IsHeadNode()
const {
return false;}
113 Bool_t IsLeftChild()
const;
117 BaseNode(
const BaseNode& ) {}
118 BaseNode& operator=(
const BaseNode& ) {
return *
this;}
122 BaseNode* fLeftChild;
123 BaseNode* fRightChild;
126 class HeadNode :
public BaseNode
130 HeadNode(BaseNode& rNode):BaseNode(&rNode) {}
131 virtual ~HeadNode() {
delete Parent();}
134 virtual const BinNode* FindNode(
const point_type& rPoint)
const {
return Parent()->FindNode(rPoint);}
135 virtual void GetClosestPoints(
const point_type& rRef,UInt_t nPoints,std::vector<std::pair<const _DataPoint*,Double_t> >& vFoundPoints)
const;
136 virtual void GetPointsWithinDist(
const point_type& rRef,value_type fDist,std::vector<const _DataPoint*>& vFoundPoints)
const;
137 virtual Bool_t Insert(
const point_type& rPoint) {
return Parent()->Insert(rPoint);}
138 virtual void Print(Int_t)
const {Parent()->Print();}
142 HeadNode(
const HeadNode& ) {}
143 HeadNode& operator=(
const HeadNode& ) {
return *
this;}
145 virtual HeadNode* Clone();
146 virtual bool IsHeadNode()
const {
return true;}
149 using BaseNode::Parent;
150 using BaseNode::LeftChild;
151 using BaseNode::RightChild;
153 using BaseNode::GetParentPointer;
154 using BaseNode::IsLeftChild;
157 class SplitNode :
public BaseNode
161 SplitNode(UInt_t iAxis,Double_t fCutValue,BaseNode& rLeft,BaseNode& rRight,BaseNode* pParent = 0);
162 virtual ~SplitNode();
165 const Cut* GetCut()
const {
return fCut;}
166 virtual void Print(Int_t iRow = 0)
const;
170 SplitNode(
const SplitNode& ) {}
171 SplitNode& operator=(
const SplitNode& ) {
return *
this;}
173 virtual SplitNode* Clone();
174 virtual const BinNode* FindNode(
const point_type& rPoint)
const;
175 virtual void GetClosestPoints(
const point_type& rRef,UInt_t nPoints,std::vector<std::pair<const _DataPoint*,Double_t> >& vFoundPoints)
const;
176 virtual void GetPointsWithinDist(
const point_type& rRef,value_type fDist,std::vector<const _DataPoint*>& vFoundPoints)
const;
177 virtual Bool_t Insert(
const point_type& rPoint);
182 class BinNode :
public BaseNode
186 typedef std::pair<value_type,value_type> tBoundary;
189 BinNode(BaseNode* pParent = 0);
190 BinNode(
const BinNode& copy);
191 virtual ~BinNode() {}
194 virtual void EmptyBin();
195 virtual const BinNode* FindNode(
const point_type& rPoint)
const;
196 point_type GetBinCenter()
const;
197 Double_t GetBinContent()
const {
return GetSumw();}
199 virtual const std::vector<tBoundary>& GetBoundaries()
const {
return fBoundaries;}
201 virtual void GetBoundaries()
const { }
203 Double_t GetDensity()
const {
return GetBinContent()/GetVolume();}
204 Double_t GetEffectiveEntries()
const {
return (GetSumw2()) ? std::pow(GetSumw(),2)/GetSumw2() : 0;}
205 UInt_t GetEntries()
const {
return fEntries;}
206 Double_t GetVolume()
const;
207 Double_t GetSumw()
const {
return fSumw;}
208 Double_t GetSumw2()
const {
return fSumw2;}
209 virtual Bool_t Insert(
const point_type& rPoint);
210 Bool_t IsInBin(
const point_type& rPoint)
const;
211 virtual void Print(
int iRow = 0)
const;
214 virtual BinNode* Clone();
217 std::vector<tBoundary> fBoundaries;
223 BinNode& operator=(
const BinNode& rhs);
226 virtual void GetClosestPoints(
const point_type&,UInt_t,std::vector<std::pair<const _DataPoint*,Double_t> >&)
const {}
227 virtual void GetPointsWithinDist(
const point_type&,value_type,std::vector<const point_type*>&)
const {}
230 using BaseNode::LeftChild;
231 using BaseNode::RightChild;
234 class TerminalNode :
public BinNode
236 friend class KDTree<_DataPoint>;
238 typedef std::pair<value_type,value_type> tBoundary;
242 TerminalNode(Double_t iBucketSize,BaseNode* pParent = 0);
243 virtual ~TerminalNode();
245 virtual void EmptyBin();
247 virtual const std::vector<tBoundary>& GetBoundaries()
const;
249 virtual void GetBoundaries()
const;
251 virtual void GetClosestPoints(
const point_type& rRef,UInt_t nPoints,std::vector<std::pair<const _DataPoint*,Double_t> >& vFoundPoints)
const;
252 const std::vector<const point_type*>& GetPoints()
const {
return fDataPoints;}
253 virtual void GetPointsWithinDist(
const point_type& rRef,value_type fDist,std::vector<const _DataPoint*>& vFoundPoints)
const;
254 virtual void Print(
int iRow = 0)
const;
258 TerminalNode(
const TerminalNode& ) {}
259 TerminalNode& operator=(
const TerminalNode& ) {
return *
this;}
262 typedef typename std::vector<const point_type* >::iterator data_it;
263 typedef typename std::vector<const point_type* >::const_iterator const_data_it;
266 TerminalNode(Double_t iBucketSize,UInt_t iSplitAxis,data_it first,data_it end);
269 virtual BinNode* Clone() {
return ConvertToBinNode();}
270 BinNode* ConvertToBinNode();
271 virtual const BinNode* FindNode(
const point_type&)
const {
return this;}
272 virtual Bool_t Insert(
const point_type& rPoint);
274 void SetOwner(Bool_t bIsOwner =
true) {fOwnData = bIsOwner;}
275 void SetSplitOption(eSplitOption opt) {fSplitOption = opt;}
276 data_it SplitEffectiveEntries();
277 data_it SplitBinContent();
278 void UpdateBoundaries();
281 eSplitOption fSplitOption;
282 Double_t fBucketSize;
284 std::vector<const _DataPoint*> fDataPoints;
296 friend class KDTree<_DataPoint>;
298 iterator(): fBin(0) {}
299 iterator(
const iterator& copy): fBin(copy.fBin) {}
302 iterator& operator++();
303 const iterator& operator++()
const;
304 iterator operator++(
int);
305 const iterator operator++(
int)
const;
306 iterator& operator--();
307 const iterator& operator--()
const;
308 iterator operator--(
int);
309 const iterator operator--(
int)
const;
310 bool operator==(
const iterator& rIterator)
const {
return (fBin == rIterator.fBin);}
311 bool operator!=(
const iterator& rIterator)
const {
return !(*
this == rIterator);}
312 iterator& operator=(
const iterator& rhs);
313 Bin& operator*() {
return *fBin;}
314 const Bin& operator*()
const {
return *fBin;}
315 Bin* operator->() {
return fBin;}
316 const Bin* operator->()
const {
return fBin;}
318 TerminalNode* TN() {assert(dynamic_cast<TerminalNode*>(fBin));
return (TerminalNode*)fBin;}
321 iterator(BinNode* pNode): fBin(pNode) {}
324 Bin* Previous()
const;
330 KDTree(UInt_t iBucketSize);
336 const iterator End()
const;
337 const Bin* FindBin(
const point_type& rPoint)
const {
return fHead->FindNode(rPoint);}
339 const iterator First()
const;
341 Double_t GetBucketSize()
const {
return fBucketSize;}
342 void GetClosestPoints(
const point_type& rRef,UInt_t nPoints,std::vector<std::pair<const _DataPoint*,Double_t> >& vFoundPoints)
const;
343 Double_t GetEffectiveEntries()
const;
344 KDTree<_DataPoint>* GetFrozenCopy();
345 UInt_t GetNBins()
const;
346 UInt_t GetEntries()
const;
347 void GetPointsWithinDist(
const point_type& rRef,value_type fDist,std::vector<const point_type*>& vFoundPoints)
const;
348 Double_t GetTotalSumw()
const;
349 Double_t GetTotalSumw2()
const;
350 Bool_t Insert(
const point_type& rData) {
return fHead->Parent()->Insert(rData);}
351 Bool_t IsFrozen()
const {
return fIsFrozen;}
353 const iterator Last()
const;
354 void Print() {fHead->Parent()->Print();}
356 void SetOwner(Bool_t bIsOwner =
true);
357 void SetSplitOption(eSplitOption opt);
361 KDTree(
const KDTree<point_type>& ) {}
362 KDTree<point_type>& operator=(
const KDTree<point_type>& ) {
return *
this;}
365 Double_t fBucketSize;
375 #endif // ROOT_Math_KDTree