tesseract v5.3.3.20231005
tesseract::IntFeatureDist Class Reference

#include <intfeaturedist.h>

Public Member Functions

 IntFeatureDist ()
 
 ~IntFeatureDist ()
 
void Init (const IntFeatureMap *feature_map)
 
void Set (const std::vector< int > &indexed_features, int canonical_count, bool value)
 
double FeatureDistance (const std::vector< int > &features) const
 
double DebugFeatureDistance (const std::vector< int > &features) const
 

Detailed Description

Definition at line 38 of file intfeaturedist.h.

Constructor & Destructor Documentation

◆ IntFeatureDist()

tesseract::IntFeatureDist::IntFeatureDist ( )

Definition at line 24 of file intfeaturedist.cpp.

25 : size_(0)
26 , total_feature_weight_(0.0)
27 , feature_map_(nullptr)
28 , features_(nullptr)
29 , features_delta_one_(nullptr)
30 , features_delta_two_(nullptr) {}

◆ ~IntFeatureDist()

tesseract::IntFeatureDist::~IntFeatureDist ( )

Definition at line 32 of file intfeaturedist.cpp.

32 {
33 Clear();
34}

Member Function Documentation

◆ DebugFeatureDistance()

double tesseract::IntFeatureDist::DebugFeatureDistance ( const std::vector< int > &  features) const

Definition at line 102 of file intfeaturedist.cpp.

102 {
103 const int num_test_features = features.size();
104 const double denominator = total_feature_weight_ + num_test_features;
105 double misses = denominator;
106 for (int i = 0; i < num_test_features; ++i) {
107 const int index = features[i];
108 const double weight = 1.0;
109 INT_FEATURE_STRUCT f = feature_map_->InverseMapFeature(features[i]);
110 tprintf("Testing feature weight %g:", weight);
111 f.print();
112 if (features_[index]) {
113 // A perfect match.
114 misses -= 2.0 * weight;
115 tprintf("Perfect hit\n");
116 } else if (features_delta_one_[index]) {
117 misses -= 1.5 * weight;
118 tprintf("-1 hit\n");
119 } else if (features_delta_two_[index]) {
120 // A near miss.
121 misses -= 1.0 * weight;
122 tprintf("-2 hit\n");
123 } else {
124 tprintf("Total miss\n");
125 }
126 }
127 tprintf("Features present:");
128 for (int i = 0; i < size_; ++i) {
129 if (features_[i]) {
130 INT_FEATURE_STRUCT f = feature_map_->InverseMapFeature(i);
131 f.print();
132 }
133 }
134 tprintf("\nMinus one features:");
135 for (int i = 0; i < size_; ++i) {
136 if (features_delta_one_[i]) {
137 INT_FEATURE_STRUCT f = feature_map_->InverseMapFeature(i);
138 f.print();
139 }
140 }
141 tprintf("\nMinus two features:");
142 for (int i = 0; i < size_; ++i) {
143 if (features_delta_two_[i]) {
144 INT_FEATURE_STRUCT f = feature_map_->InverseMapFeature(i);
145 f.print();
146 }
147 }
148 tprintf("\n");
149 return misses / denominator;
150}
void tprintf(const char *format,...)
Definition: tprintf.cpp:41
INT_FEATURE_STRUCT InverseMapFeature(int map_feature) const

◆ FeatureDistance()

double tesseract::IntFeatureDist::FeatureDistance ( const std::vector< int > &  features) const

Definition at line 80 of file intfeaturedist.cpp.

80 {
81 const int num_test_features = features.size();
82 const double denominator = total_feature_weight_ + num_test_features;
83 double misses = denominator;
84 for (int i = 0; i < num_test_features; ++i) {
85 const int index = features[i];
86 const double weight = 1.0;
87 if (features_[index]) {
88 // A perfect match.
89 misses -= 2.0 * weight;
90 } else if (features_delta_one_[index]) {
91 misses -= 1.5 * weight;
92 } else if (features_delta_two_[index]) {
93 // A near miss.
94 misses -= 1.0 * weight;
95 }
96 }
97 return misses / denominator;
98}

◆ Init()

void tesseract::IntFeatureDist::Init ( const IntFeatureMap feature_map)

Definition at line 37 of file intfeaturedist.cpp.

37 {
38 size_ = feature_map->sparse_size();
39 Clear();
40 feature_map_ = feature_map;
41 features_ = new bool[size_];
42 features_delta_one_ = new bool[size_];
43 features_delta_two_ = new bool[size_];
44 memset(features_, false, size_ * sizeof(features_[0]));
45 memset(features_delta_one_, false, size_ * sizeof(features_delta_one_[0]));
46 memset(features_delta_two_, false, size_ * sizeof(features_delta_two_[0]));
47 total_feature_weight_ = 0.0;
48}

◆ Set()

void tesseract::IntFeatureDist::Set ( const std::vector< int > &  indexed_features,
int  canonical_count,
bool  value 
)

Definition at line 52 of file intfeaturedist.cpp.

53 {
54 total_feature_weight_ = canonical_count;
55 for (int f : indexed_features) {
56 features_[f] = value;
57 for (int dir = -kNumOffsetMaps; dir <= kNumOffsetMaps; ++dir) {
58 if (dir == 0) {
59 continue;
60 }
61 const int mapped_f = feature_map_->OffsetFeature(f, dir);
62 if (mapped_f >= 0) {
63 features_delta_one_[mapped_f] = value;
64 for (int dir2 = -kNumOffsetMaps; dir2 <= kNumOffsetMaps; ++dir2) {
65 if (dir2 == 0) {
66 continue;
67 }
68 const int mapped_f2 = feature_map_->OffsetFeature(mapped_f, dir2);
69 if (mapped_f2 >= 0) {
70 features_delta_two_[mapped_f2] = value;
71 }
72 }
73 }
74 }
75 }
76}
int value
int OffsetFeature(int index_feature, int dir) const

The documentation for this class was generated from the following files: