Loading [MathJax]/extensions/tex2jax.js
ITK 6.0.0
Insight Toolkit
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Loading...
Searching...
No Matches
itkKdTree.h
Go to the documentation of this file.
1/*=========================================================================
2 *
3 * Copyright NumFOCUS
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * https://www.apache.org/licenses/LICENSE-2.0.txt
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *=========================================================================*/
18#ifndef itkKdTree_h
19#define itkKdTree_h
20
21#include <queue>
22#include <vector>
23
24#include "itkPoint.h"
25#include "itkSize.h"
26#include "itkObject.h"
27#include "itkArray.h"
28
29#include "itkSubsample.h"
30
32
33namespace itk
34{
35namespace Statistics
36{
63template <typename TSample>
64
65struct ITK_TEMPLATE_EXPORT KdTreeNode
66{
69
71 using MeasurementType = typename TSample::MeasurementType;
72
75
78 using InstanceIdentifier = typename TSample::InstanceIdentifier;
79
82 virtual bool
83 IsTerminal() const = 0;
84
90 virtual void
91 GetParameters(unsigned int &, MeasurementType &) const = 0;
92
94 virtual Self *
95 Left() = 0;
96
98 virtual const Self *
99 Left() const = 0;
100
102 virtual Self *
103 Right() = 0;
104
106 virtual const Self *
107 Right() const = 0;
108
113 virtual unsigned int
114 Size() const = 0;
115
117 virtual void
119
121 virtual void
123
126
129
131 virtual ~KdTreeNode() = default; // needed to subclasses will actually be deleted
132}; // end of class
133
147template <typename TSample>
148
149struct ITK_TEMPLATE_EXPORT KdTreeNonterminalNode : public KdTreeNode<TSample>
150{
152 using typename Superclass::MeasurementType;
153 using typename Superclass::CentroidType;
154 using typename Superclass::InstanceIdentifier;
155
157
158 ~KdTreeNonterminalNode() override = default;
159
160 bool
161 IsTerminal() const override
162 {
163 return false;
164 }
165
166 void
167 GetParameters(unsigned int &, MeasurementType &) const override;
168
170 Superclass *
171 Left() override
172 {
173 return m_Left;
174 }
175
177 Superclass *
178 Right() override
179 {
180 return m_Right;
181 }
182
184 const Superclass *
185 Left() const override
186 {
187 return m_Left;
188 }
189
191 const Superclass *
192 Right() const override
193 {
194 return m_Right;
195 }
196
201 unsigned int
202 Size() const override
203 {
204 return 0;
205 }
206
211 void
214
219 void
221 {}
222
228 InstanceIdentifier
230 {
231 return this->m_InstanceIdentifier;
232 }
233
237 void
239 {
240 this->m_InstanceIdentifier = valueId;
241 }
242
243private:
244 unsigned int m_PartitionDimension{};
249}; // end of class
250
267template <typename TSample>
268struct ITK_TEMPLATE_EXPORT KdTreeWeightedCentroidNonterminalNode : public KdTreeNode<TSample>
269{
271 using typename Superclass::MeasurementType;
272 using typename Superclass::CentroidType;
273 using typename Superclass::InstanceIdentifier;
274 using MeasurementVectorSizeType = typename TSample::MeasurementVectorSizeType;
275
278 Superclass *,
279 Superclass *,
280 CentroidType &,
281 unsigned int);
282
284
286 bool
287 IsTerminal() const override
288 {
289 return false;
290 }
291
293 void
294 GetParameters(unsigned int &, MeasurementType &) const override;
295
299 {
301 }
302
304 Superclass *
305 Left() override
306 {
307 return m_Left;
308 }
309
311 Superclass *
312 Right() override
313 {
314 return m_Right;
315 }
316
318 const Superclass *
319 Left() const override
320 {
321 return m_Left;
322 }
323
325 const Superclass *
326 Right() const override
327 {
328 return m_Right;
329 }
330
332 unsigned int
333 Size() const override
334 {
335 return m_Size;
336 }
337
341 void
343 {
344 centroid = m_WeightedCentroid;
345 }
346
350 void
351 GetCentroid(CentroidType & centroid) override
352 {
353 centroid = m_Centroid;
354 }
355
361 InstanceIdentifier
363 {
364 return this->m_InstanceIdentifier;
365 }
366
370 void
372 {
373 this->m_InstanceIdentifier = valueId;
374 }
375
376private:
378 unsigned int m_PartitionDimension{};
383 unsigned int m_Size{};
386}; // end of class
387
401template <typename TSample>
402struct ITK_TEMPLATE_EXPORT KdTreeTerminalNode : public KdTreeNode<TSample>
403{
405 using typename Superclass::MeasurementType;
406 using typename Superclass::CentroidType;
407 using typename Superclass::InstanceIdentifier;
408
410
411 ~KdTreeTerminalNode() override { this->m_InstanceIdentifiers.clear(); }
412
414 bool
415 IsTerminal() const override
416 {
417 return true;
418 }
419
421 void
422 GetParameters(unsigned int &, MeasurementType &) const override
423 {}
424
426 Superclass *
427 Left() override
428 {
429 return nullptr;
430 }
431
433 Superclass *
434 Right() override
435 {
436 return nullptr;
437 }
438
440 const Superclass *
441 Left() const override
442 {
443 return nullptr;
444 }
445
447 const Superclass *
448 Right() const override
449 {
450 return nullptr;
451 }
452
454 unsigned int
455 Size() const override
456 {
457 return static_cast<unsigned int>(m_InstanceIdentifiers.size());
458 }
459
464 void
467
472 void
474 {}
475
481 InstanceIdentifier
483 {
484 return m_InstanceIdentifiers[index];
485 }
486
490 void
492 {
493 m_InstanceIdentifiers.push_back(id);
494 }
495
496private:
497 std::vector<InstanceIdentifier> m_InstanceIdentifiers{};
498}; // end of class
499
533
534template <typename TSample>
535class ITK_TEMPLATE_EXPORT KdTree : public Object
536{
537public:
538 ITK_DISALLOW_COPY_AND_MOVE(KdTree);
539
541 using Self = KdTree;
545
547 itkOverrideGetNameOfClassMacro(KdTree);
548
550 itkNewMacro(Self);
551
553 using SampleType = TSample;
554 using MeasurementVectorType = typename TSample::MeasurementVectorType;
555 using MeasurementType = typename TSample::MeasurementType;
556 using InstanceIdentifier = typename TSample::InstanceIdentifier;
557 using AbsoluteFrequencyType = typename TSample::AbsoluteFrequencyType;
558
559 using MeasurementVectorSizeType = unsigned int;
560
563 itkGetConstMacro(MeasurementVectorSize, MeasurementVectorSizeType);
564
567
570
574 using NeighborType = std::pair<InstanceIdentifier, double>;
575
576 using InstanceIdentifierVectorType = std::vector<InstanceIdentifier>;
577
590 {
591 public:
593 NearestNeighbors(std::vector<double> & cache_vector)
595 , m_Distances(cache_vector)
596 {}
598
600 ~NearestNeighbors() = default;
601
604 void
605 resize(unsigned int k)
606 {
607 m_Identifiers.clear();
609 m_Distances.clear();
612 }
613
615 double
620
623 void
625 {
628 double farthestDistance = NumericTraits<double>::min();
629 const auto size = static_cast<unsigned int>(m_Distances.size());
630 for (unsigned int i = 0; i < size; ++i)
631 {
632 if (m_Distances[i] > farthestDistance)
633 {
634 farthestDistance = m_Distances[i];
636 }
637 }
638 }
639
643 {
644 return m_Identifiers;
645 }
646
650 GetNeighbor(unsigned int index) const
651 {
652 return m_Identifiers[index];
653 }
654
655 private:
658
661
665 std::vector<double> & m_Distances;
666 };
667
670 void
671 SetBucketSize(unsigned int);
672
675 void
676 SetSample(const TSample *);
677
679 const TSample *
680 GetSample() const
681 {
682 return m_Sample;
683 }
684
686 Size() const
687 {
688 return m_Sample->Size();
689 }
690
695 KdTreeNodeType *
697 {
698 return m_EmptyTerminalNode;
699 }
700
703 void
705 {
706 if (this->m_Root)
707 {
708 this->DeleteNode(this->m_Root);
709 }
710 this->m_Root = root;
711 }
712
714 KdTreeNodeType *
716 {
717 return m_Root;
718 }
719
722 const MeasurementVectorType &
724 {
725 return m_Sample->GetMeasurementVector(id);
726 }
727
730 AbsoluteFrequencyType
732 {
733 return m_Sample->GetFrequency(id);
734 }
735
737 DistanceMetricType *
739 {
740 return m_DistanceMetric.GetPointer();
741 }
742
744 void
746
750 void
751 Search(const MeasurementVectorType &, unsigned int, InstanceIdentifierVectorType &, std::vector<double> &) const;
752
754 void
756
762 bool
764
768 bool
770
772 void
774
776 void
777 PrintTree(std::ostream &) const;
778
780 void
781 PrintTree(KdTreeNodeType *, unsigned int, unsigned int, std::ostream & os = std::cout) const;
782
785 void
786 PlotTree(std::ostream & os) const;
787
789 void
790 PlotTree(KdTreeNodeType * node, std::ostream & os = std::cout) const;
791
792 using Iterator = typename TSample::Iterator;
793 using ConstIterator = typename TSample::ConstIterator;
794
795protected:
798
800 ~KdTree() override;
801
802 void
803 PrintSelf(std::ostream & os, Indent indent) const override;
804
806 int
808 const MeasurementVectorType &,
811 NearestNeighbors &) const;
812
814 int
816 const MeasurementVectorType &,
817 double,
821
822private:
824 const TSample * m_Sample{};
825
828
831
834
837
840}; // end of class
841} // end of namespace Statistics
842} // end of namespace itk
843
844#ifndef ITK_MANUAL_INSTANTIATION
845# include "itkKdTree.hxx"
846#endif
847
848#endif
Array class with size defined at construction time.
Definition itkArray.h:48
Control indentation during Print() invocation.
Definition itkIndent.h:50
static constexpr T max(const T &)
static constexpr T min(const T &)
Implements transparent reference counting.
data structure for storing k-nearest neighbor search result (k number of Neighbors)
Definition itkKdTree.h:590
std::vector< double > & m_Distances
Definition itkKdTree.h:665
InstanceIdentifier GetNeighbor(unsigned int index) const
Definition itkKdTree.h:650
InstanceIdentifierVectorType m_Identifiers
Definition itkKdTree.h:660
NearestNeighbors(std::vector< double > &cache_vector)
Definition itkKdTree.h:593
const InstanceIdentifierVectorType & GetNeighbors() const
Definition itkKdTree.h:642
void ReplaceFarthestNeighbor(InstanceIdentifier id, double distance)
Definition itkKdTree.h:624
KdTreeNodeType * GetRoot()
Definition itkKdTree.h:715
void PlotTree(std::ostream &os) const
KdTreeNodeType * m_EmptyTerminalNode
Definition itkKdTree.h:833
KdTreeNodeType * GetEmptyTerminalNode()
Definition itkKdTree.h:696
const TSample * GetSample() const
Definition itkKdTree.h:680
void SetBucketSize(unsigned int)
void SetRoot(KdTreeNodeType *root)
Definition itkKdTree.h:704
void Search(const MeasurementVectorType &, unsigned int, InstanceIdentifierVectorType &) const
typename TSample::InstanceIdentifier InstanceIdentifier
Definition itkKdTree.h:556
EuclideanDistanceMetric< MeasurementVectorType > DistanceMetricType
Definition itkKdTree.h:566
SizeValueType Size() const
Definition itkKdTree.h:686
SmartPointer< Self > Pointer
Definition itkKdTree.h:543
bool BoundsOverlapBall(const MeasurementVectorType &, MeasurementVectorType &, MeasurementVectorType &, double) const
MeasurementVectorSizeType m_MeasurementVectorSize
Definition itkKdTree.h:839
const TSample * m_Sample
Definition itkKdTree.h:824
DistanceMetricType * GetDistanceMetric()
Definition itkKdTree.h:738
KdTreeNode< TSample > KdTreeNodeType
Definition itkKdTree.h:569
const MeasurementVectorType & GetMeasurementVector(InstanceIdentifier id) const
Definition itkKdTree.h:723
typename TSample::AbsoluteFrequencyType AbsoluteFrequencyType
Definition itkKdTree.h:557
std::pair< InstanceIdentifier, double > NeighborType
Definition itkKdTree.h:574
void PrintTree(KdTreeNodeType *, unsigned int, unsigned int, std::ostream &os=std::cout) const
std::vector< InstanceIdentifier > InstanceIdentifierVectorType
Definition itkKdTree.h:576
typename TSample::MeasurementType MeasurementType
Definition itkKdTree.h:555
void Search(const MeasurementVectorType &, unsigned int, InstanceIdentifierVectorType &, std::vector< double > &) const
KdTreeNodeType * m_Root
Definition itkKdTree.h:830
DistanceMetricType::Pointer m_DistanceMetric
Definition itkKdTree.h:836
void PrintSelf(std::ostream &os, Indent indent) const override
int SearchLoop(const KdTreeNodeType *, const MeasurementVectorType &, double, MeasurementVectorType &, MeasurementVectorType &, InstanceIdentifierVectorType &) const
unsigned int MeasurementVectorSizeType
Definition itkKdTree.h:559
SmartPointer< const Self > ConstPointer
Definition itkKdTree.h:544
typename TSample::Iterator Iterator
Definition itkKdTree.h:792
int NearestNeighborSearchLoop(const KdTreeNodeType *, const MeasurementVectorType &, MeasurementVectorType &, MeasurementVectorType &, NearestNeighbors &) const
bool BallWithinBounds(const MeasurementVectorType &, MeasurementVectorType &, MeasurementVectorType &, double) const
void SetSample(const TSample *)
void PlotTree(KdTreeNodeType *node, std::ostream &os=std::cout) const
AbsoluteFrequencyType GetFrequency(InstanceIdentifier id) const
Definition itkKdTree.h:731
typename TSample::ConstIterator ConstIterator
Definition itkKdTree.h:793
typename TSample::MeasurementVectorType MeasurementVectorType
Definition itkKdTree.h:554
void Search(const MeasurementVectorType &, double, InstanceIdentifierVectorType &) const
void PrintTree(std::ostream &) const
void DeleteNode(KdTreeNodeType *)
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
unsigned long SizeValueType
Definition itkIntTypes.h:86
This class defines the interface of its derived classes.
Definition itkKdTree.h:66
KdTreeNode< TSample > Self
Definition itkKdTree.h:68
typename TSample::InstanceIdentifier InstanceIdentifier
Definition itkKdTree.h:78
virtual void GetParameters(unsigned int &, MeasurementType &) const =0
virtual InstanceIdentifier GetInstanceIdentifier(InstanceIdentifier) const =0
virtual bool IsTerminal() const =0
virtual Self * Right()=0
virtual void GetCentroid(CentroidType &)=0
typename TSample::MeasurementType MeasurementType
Definition itkKdTree.h:71
virtual void AddInstanceIdentifier(InstanceIdentifier)=0
virtual void GetWeightedCentroid(CentroidType &)=0
virtual unsigned int Size() const =0
virtual const Self * Left() const =0
virtual ~KdTreeNode()=default
virtual const Self * Right() const =0
Array< double > CentroidType
Definition itkKdTree.h:74
virtual Self * Left()=0
const Superclass * Right() const override
Definition itkKdTree.h:192
typename TSample::InstanceIdentifier InstanceIdentifier
Definition itkKdTree.h:78
unsigned int Size() const override
Definition itkKdTree.h:202
const Superclass * Left() const override
Definition itkKdTree.h:185
void GetWeightedCentroid(CentroidType &) override
Definition itkKdTree.h:212
InstanceIdentifier m_InstanceIdentifier
Definition itkKdTree.h:246
Superclass * Right() override
Definition itkKdTree.h:178
void GetParameters(unsigned int &, MeasurementType &) const override
InstanceIdentifier GetInstanceIdentifier(InstanceIdentifier) const override
Definition itkKdTree.h:229
void GetCentroid(CentroidType &) override
Definition itkKdTree.h:220
typename TSample::MeasurementType MeasurementType
Definition itkKdTree.h:71
KdTreeNonterminalNode(unsigned int, MeasurementType, Superclass *, Superclass *)
void AddInstanceIdentifier(InstanceIdentifier valueId) override
Definition itkKdTree.h:238
void GetParameters(unsigned int &, MeasurementType &) const override
Definition itkKdTree.h:422
typename TSample::InstanceIdentifier InstanceIdentifier
Definition itkKdTree.h:78
void GetCentroid(CentroidType &) override
Definition itkKdTree.h:473
bool IsTerminal() const override
Definition itkKdTree.h:415
void GetWeightedCentroid(CentroidType &) override
Definition itkKdTree.h:465
std::vector< InstanceIdentifier > m_InstanceIdentifiers
Definition itkKdTree.h:497
InstanceIdentifier GetInstanceIdentifier(InstanceIdentifier index) const override
Definition itkKdTree.h:482
const Superclass * Right() const override
Definition itkKdTree.h:448
typename TSample::MeasurementType MeasurementType
Definition itkKdTree.h:71
Superclass * Right() override
Definition itkKdTree.h:434
const Superclass * Left() const override
Definition itkKdTree.h:441
unsigned int Size() const override
Definition itkKdTree.h:455
void AddInstanceIdentifier(InstanceIdentifier id) override
Definition itkKdTree.h:491
Superclass * Left() override
Definition itkKdTree.h:427
KdTreeNode< TSample > Superclass
Definition itkKdTree.h:404
typename TSample::InstanceIdentifier InstanceIdentifier
Definition itkKdTree.h:78
KdTreeWeightedCentroidNonterminalNode(unsigned int, MeasurementType, Superclass *, Superclass *, CentroidType &, unsigned int)
void GetWeightedCentroid(CentroidType &centroid) override
Definition itkKdTree.h:342
void GetCentroid(CentroidType &centroid) override
Definition itkKdTree.h:351
InstanceIdentifier GetInstanceIdentifier(InstanceIdentifier) const override
Definition itkKdTree.h:362
MeasurementVectorSizeType GetMeasurementVectorSize() const
Definition itkKdTree.h:298
const Superclass * Left() const override
Definition itkKdTree.h:319
typename TSample::MeasurementType MeasurementType
Definition itkKdTree.h:71
typename TSample::MeasurementVectorSizeType MeasurementVectorSizeType
Definition itkKdTree.h:274
const Superclass * Right() const override
Definition itkKdTree.h:326
void GetParameters(unsigned int &, MeasurementType &) const override
void AddInstanceIdentifier(InstanceIdentifier valueId) override
Definition itkKdTree.h:371