ITK 6.0.0
Insight Toolkit
 
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::Statistics
34{
61template <typename TSample>
62
63struct ITK_TEMPLATE_EXPORT KdTreeNode
64{
67
69 using MeasurementType = typename TSample::MeasurementType;
70
73
76 using InstanceIdentifier = typename TSample::InstanceIdentifier;
77
80 [[nodiscard]] virtual bool
81 IsTerminal() const = 0;
82
88 virtual void
89 GetParameters(unsigned int &, MeasurementType &) const = 0;
90
92 virtual Self *
93 Left() = 0;
94
96 [[nodiscard]] virtual const Self *
97 Left() const = 0;
98
100 virtual Self *
101 Right() = 0;
102
104 [[nodiscard]] virtual const Self *
105 Right() const = 0;
106
111 [[nodiscard]] virtual unsigned int
112 Size() const = 0;
113
115 virtual void
117
119 virtual void
121
124
127
129 virtual ~KdTreeNode() = default; // needed to subclasses will actually be deleted
130}; // end of class
131
145template <typename TSample>
146
147struct ITK_TEMPLATE_EXPORT KdTreeNonterminalNode : public KdTreeNode<TSample>
148{
150 using typename Superclass::MeasurementType;
151 using typename Superclass::CentroidType;
152 using typename Superclass::InstanceIdentifier;
153
155
156 ~KdTreeNonterminalNode() override = default;
157
158 [[nodiscard]] bool
159 IsTerminal() const override
160 {
161 return false;
162 }
163
164 void
165 GetParameters(unsigned int &, MeasurementType &) const override;
166
168 Superclass *
169 Left() override
170 {
171 return m_Left;
172 }
173
175 Superclass *
176 Right() override
177 {
178 return m_Right;
179 }
180
182 [[nodiscard]] const Superclass *
183 Left() const override
184 {
185 return m_Left;
186 }
187
189 [[nodiscard]] const Superclass *
190 Right() const override
191 {
192 return m_Right;
193 }
194
199 [[nodiscard]] unsigned int
200 Size() const override
201 {
202 return 0;
203 }
204
209 void
212
217 void
219 {}
220
226 [[nodiscard]] InstanceIdentifier
228 {
229 return this->m_InstanceIdentifier;
230 }
231
235 void
237 {
238 this->m_InstanceIdentifier = valueId;
239 }
240
241private:
242 unsigned int m_PartitionDimension{};
247}; // end of class
248
265template <typename TSample>
266struct ITK_TEMPLATE_EXPORT KdTreeWeightedCentroidNonterminalNode : public KdTreeNode<TSample>
267{
269 using typename Superclass::MeasurementType;
270 using typename Superclass::CentroidType;
271 using typename Superclass::InstanceIdentifier;
272 using MeasurementVectorSizeType = typename TSample::MeasurementVectorSizeType;
273
276 Superclass *,
277 Superclass *,
278 CentroidType &,
279 unsigned int);
280
282
284 [[nodiscard]] bool
285 IsTerminal() const override
286 {
287 return false;
288 }
289
291 void
292 GetParameters(unsigned int &, MeasurementType &) const override;
293
295 [[nodiscard]] MeasurementVectorSizeType
297 {
299 }
300
302 Superclass *
303 Left() override
304 {
305 return m_Left;
306 }
307
309 Superclass *
310 Right() override
311 {
312 return m_Right;
313 }
314
316 [[nodiscard]] const Superclass *
317 Left() const override
318 {
319 return m_Left;
320 }
321
323 [[nodiscard]] const Superclass *
324 Right() const override
325 {
326 return m_Right;
327 }
328
330 [[nodiscard]] unsigned int
331 Size() const override
332 {
333 return m_Size;
334 }
335
339 void
341 {
342 centroid = m_WeightedCentroid;
343 }
344
348 void
349 GetCentroid(CentroidType & centroid) override
350 {
351 centroid = m_Centroid;
352 }
353
359 [[nodiscard]] InstanceIdentifier
361 {
362 return this->m_InstanceIdentifier;
363 }
364
368 void
370 {
371 this->m_InstanceIdentifier = valueId;
372 }
373
374private:
376 unsigned int m_PartitionDimension{};
381 unsigned int m_Size{};
384}; // end of class
385
399template <typename TSample>
400struct ITK_TEMPLATE_EXPORT KdTreeTerminalNode : public KdTreeNode<TSample>
401{
403 using typename Superclass::MeasurementType;
404 using typename Superclass::CentroidType;
405 using typename Superclass::InstanceIdentifier;
406
408
409 ~KdTreeTerminalNode() override { this->m_InstanceIdentifiers.clear(); }
410
412 [[nodiscard]] bool
413 IsTerminal() const override
414 {
415 return true;
416 }
417
419 void
420 GetParameters(unsigned int &, MeasurementType &) const override
421 {}
422
424 Superclass *
425 Left() override
426 {
427 return nullptr;
428 }
429
431 Superclass *
432 Right() override
433 {
434 return nullptr;
435 }
436
438 [[nodiscard]] const Superclass *
439 Left() const override
440 {
441 return nullptr;
442 }
443
445 [[nodiscard]] const Superclass *
446 Right() const override
447 {
448 return nullptr;
449 }
450
452 [[nodiscard]] unsigned int
453 Size() const override
454 {
455 return static_cast<unsigned int>(m_InstanceIdentifiers.size());
456 }
457
462 void
465
470 void
472 {}
473
479 [[nodiscard]] InstanceIdentifier
481 {
482 return m_InstanceIdentifiers[index];
483 }
484
488 void
490 {
491 m_InstanceIdentifiers.push_back(id);
492 }
493
494private:
495 std::vector<InstanceIdentifier> m_InstanceIdentifiers{};
496}; // end of class
497
531
532template <typename TSample>
533class ITK_TEMPLATE_EXPORT KdTree : public Object
534{
535public:
536 ITK_DISALLOW_COPY_AND_MOVE(KdTree);
537
539 using Self = KdTree;
543
545 itkOverrideGetNameOfClassMacro(KdTree);
546
548 itkNewMacro(Self);
549
551 using SampleType = TSample;
552 using MeasurementVectorType = typename TSample::MeasurementVectorType;
553 using MeasurementType = typename TSample::MeasurementType;
554 using InstanceIdentifier = typename TSample::InstanceIdentifier;
555 using AbsoluteFrequencyType = typename TSample::AbsoluteFrequencyType;
556
557 using MeasurementVectorSizeType = unsigned int;
558
561 itkGetConstMacro(MeasurementVectorSize, MeasurementVectorSizeType);
562
565
568
572 using NeighborType = std::pair<InstanceIdentifier, double>;
573
574 using InstanceIdentifierVectorType = std::vector<InstanceIdentifier>;
575
588 {
589 public:
591 NearestNeighbors(std::vector<double> & cache_vector)
593 , m_Distances(cache_vector)
594 {}
596
598 ~NearestNeighbors() = default;
599
602 void
603 resize(unsigned int k)
604 {
605 m_Identifiers.clear();
607 m_Distances.clear();
610 }
611
613 double
618
621 void
623 {
626 double farthestDistance = NumericTraits<double>::min();
627 const auto size = static_cast<unsigned int>(m_Distances.size());
628 for (unsigned int i = 0; i < size; ++i)
629 {
630 if (m_Distances[i] > farthestDistance)
631 {
632 farthestDistance = m_Distances[i];
634 }
635 }
636 }
637
639 [[nodiscard]] const InstanceIdentifierVectorType &
641 {
642 return m_Identifiers;
643 }
644
647 [[nodiscard]] InstanceIdentifier
648 GetNeighbor(unsigned int index) const
649 {
650 return m_Identifiers[index];
651 }
652
653 private:
656
659
663 std::vector<double> & m_Distances;
664 };
665
668 void
669 SetBucketSize(unsigned int);
670
673 void
674 SetSample(const TSample *);
675
677 const TSample *
678 GetSample() const
679 {
680 return m_Sample;
681 }
682
684 Size() const
685 {
686 return m_Sample->Size();
687 }
688
693 KdTreeNodeType *
695 {
696 return m_EmptyTerminalNode;
697 }
698
701 void
703 {
704 if (this->m_Root)
705 {
706 this->DeleteNode(this->m_Root);
707 }
708 this->m_Root = root;
709 }
710
712 KdTreeNodeType *
714 {
715 return m_Root;
716 }
717
720 const MeasurementVectorType &
722 {
723 return m_Sample->GetMeasurementVector(id);
724 }
725
728 AbsoluteFrequencyType
730 {
731 return m_Sample->GetFrequency(id);
732 }
733
735 DistanceMetricType *
737 {
738 return m_DistanceMetric.GetPointer();
739 }
740
742 void
744
748 void
749 Search(const MeasurementVectorType &, unsigned int, InstanceIdentifierVectorType &, std::vector<double> &) const;
750
752 void
754
760 bool
762
766 bool
768
770 void
772
774 void
775 PrintTree(std::ostream &) const;
776
778 void
779 PrintTree(KdTreeNodeType *, unsigned int, unsigned int, std::ostream & os = std::cout) const;
780
783 void
784 PlotTree(std::ostream & os) const;
785
787 void
788 PlotTree(KdTreeNodeType * node, std::ostream & os = std::cout) const;
789
790 using Iterator = typename TSample::Iterator;
791 using ConstIterator = typename TSample::ConstIterator;
792
793protected:
796
798 ~KdTree() override;
799
800 void
801 PrintSelf(std::ostream & os, Indent indent) const override;
802
804 int
806 const MeasurementVectorType &,
809 NearestNeighbors &) const;
810
812 int
814 const MeasurementVectorType &,
815 double,
819
820private:
822 const TSample * m_Sample{};
823
826
829
832
835
838}; // end of class
839} // namespace itk::Statistics
840
841#ifndef ITK_MANUAL_INSTANTIATION
842# include "itkKdTree.hxx"
843#endif
844
845#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:588
std::vector< double > & m_Distances
Definition itkKdTree.h:663
InstanceIdentifier GetNeighbor(unsigned int index) const
Definition itkKdTree.h:648
InstanceIdentifierVectorType m_Identifiers
Definition itkKdTree.h:658
NearestNeighbors(std::vector< double > &cache_vector)
Definition itkKdTree.h:591
const InstanceIdentifierVectorType & GetNeighbors() const
Definition itkKdTree.h:640
void ReplaceFarthestNeighbor(InstanceIdentifier id, double distance)
Definition itkKdTree.h:622
KdTreeNodeType * GetRoot()
Definition itkKdTree.h:713
void PlotTree(std::ostream &os) const
KdTreeNodeType * m_EmptyTerminalNode
Definition itkKdTree.h:831
KdTreeNodeType * GetEmptyTerminalNode()
Definition itkKdTree.h:694
const TSample * GetSample() const
Definition itkKdTree.h:678
void SetBucketSize(unsigned int)
void SetRoot(KdTreeNodeType *root)
Definition itkKdTree.h:702
void Search(const MeasurementVectorType &, unsigned int, InstanceIdentifierVectorType &) const
typename TSample::InstanceIdentifier InstanceIdentifier
Definition itkKdTree.h:554
EuclideanDistanceMetric< MeasurementVectorType > DistanceMetricType
Definition itkKdTree.h:564
SizeValueType Size() const
Definition itkKdTree.h:684
SmartPointer< Self > Pointer
Definition itkKdTree.h:541
bool BoundsOverlapBall(const MeasurementVectorType &, MeasurementVectorType &, MeasurementVectorType &, double) const
MeasurementVectorSizeType m_MeasurementVectorSize
Definition itkKdTree.h:837
const TSample * m_Sample
Definition itkKdTree.h:822
DistanceMetricType * GetDistanceMetric()
Definition itkKdTree.h:736
KdTreeNode< TSample > KdTreeNodeType
Definition itkKdTree.h:567
const MeasurementVectorType & GetMeasurementVector(InstanceIdentifier id) const
Definition itkKdTree.h:721
typename TSample::AbsoluteFrequencyType AbsoluteFrequencyType
Definition itkKdTree.h:555
std::pair< InstanceIdentifier, double > NeighborType
Definition itkKdTree.h:572
void PrintTree(KdTreeNodeType *, unsigned int, unsigned int, std::ostream &os=std::cout) const
std::vector< InstanceIdentifier > InstanceIdentifierVectorType
Definition itkKdTree.h:574
typename TSample::MeasurementType MeasurementType
Definition itkKdTree.h:553
void Search(const MeasurementVectorType &, unsigned int, InstanceIdentifierVectorType &, std::vector< double > &) const
KdTreeNodeType * m_Root
Definition itkKdTree.h:828
DistanceMetricType::Pointer m_DistanceMetric
Definition itkKdTree.h:834
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:557
SmartPointer< const Self > ConstPointer
Definition itkKdTree.h:542
typename TSample::Iterator Iterator
Definition itkKdTree.h:790
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:729
typename TSample::ConstIterator ConstIterator
Definition itkKdTree.h:791
typename TSample::MeasurementVectorType MeasurementVectorType
Definition itkKdTree.h:552
void Search(const MeasurementVectorType &, double, InstanceIdentifierVectorType &) const
void PrintTree(std::ostream &) const
void DeleteNode(KdTreeNodeType *)
unsigned long SizeValueType
Definition itkIntTypes.h:86
This class defines the interface of its derived classes.
Definition itkKdTree.h:64
KdTreeNode< TSample > Self
Definition itkKdTree.h:66
typename TSample::InstanceIdentifier InstanceIdentifier
Definition itkKdTree.h:76
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:69
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:72
virtual Self * Left()=0
const Superclass * Right() const override
Definition itkKdTree.h:190
typename TSample::InstanceIdentifier InstanceIdentifier
Definition itkKdTree.h:76
unsigned int Size() const override
Definition itkKdTree.h:200
const Superclass * Left() const override
Definition itkKdTree.h:183
void GetWeightedCentroid(CentroidType &) override
Definition itkKdTree.h:210
InstanceIdentifier m_InstanceIdentifier
Definition itkKdTree.h:244
Superclass * Right() override
Definition itkKdTree.h:176
void GetParameters(unsigned int &, MeasurementType &) const override
InstanceIdentifier GetInstanceIdentifier(InstanceIdentifier) const override
Definition itkKdTree.h:227
void GetCentroid(CentroidType &) override
Definition itkKdTree.h:218
typename TSample::MeasurementType MeasurementType
Definition itkKdTree.h:69
KdTreeNonterminalNode(unsigned int, MeasurementType, Superclass *, Superclass *)
void AddInstanceIdentifier(InstanceIdentifier valueId) override
Definition itkKdTree.h:236
void GetParameters(unsigned int &, MeasurementType &) const override
Definition itkKdTree.h:420
typename TSample::InstanceIdentifier InstanceIdentifier
Definition itkKdTree.h:76
void GetCentroid(CentroidType &) override
Definition itkKdTree.h:471
bool IsTerminal() const override
Definition itkKdTree.h:413
void GetWeightedCentroid(CentroidType &) override
Definition itkKdTree.h:463
std::vector< InstanceIdentifier > m_InstanceIdentifiers
Definition itkKdTree.h:495
InstanceIdentifier GetInstanceIdentifier(InstanceIdentifier index) const override
Definition itkKdTree.h:480
const Superclass * Right() const override
Definition itkKdTree.h:446
typename TSample::MeasurementType MeasurementType
Definition itkKdTree.h:69
Superclass * Right() override
Definition itkKdTree.h:432
const Superclass * Left() const override
Definition itkKdTree.h:439
unsigned int Size() const override
Definition itkKdTree.h:453
void AddInstanceIdentifier(InstanceIdentifier id) override
Definition itkKdTree.h:489
Superclass * Left() override
Definition itkKdTree.h:425
KdTreeNode< TSample > Superclass
Definition itkKdTree.h:402
typename TSample::InstanceIdentifier InstanceIdentifier
Definition itkKdTree.h:76
KdTreeWeightedCentroidNonterminalNode(unsigned int, MeasurementType, Superclass *, Superclass *, CentroidType &, unsigned int)
void GetWeightedCentroid(CentroidType &centroid) override
Definition itkKdTree.h:340
void GetCentroid(CentroidType &centroid) override
Definition itkKdTree.h:349
InstanceIdentifier GetInstanceIdentifier(InstanceIdentifier) const override
Definition itkKdTree.h:360
MeasurementVectorSizeType GetMeasurementVectorSize() const
Definition itkKdTree.h:296
const Superclass * Left() const override
Definition itkKdTree.h:317
typename TSample::MeasurementType MeasurementType
Definition itkKdTree.h:69
typename TSample::MeasurementVectorSizeType MeasurementVectorSizeType
Definition itkKdTree.h:272
const Superclass * Right() const override
Definition itkKdTree.h:324
void GetParameters(unsigned int &, MeasurementType &) const override
void AddInstanceIdentifier(InstanceIdentifier valueId) override
Definition itkKdTree.h:369