26 , total_feature_weight_(0.0)
27 , feature_map_(nullptr)
29 , features_delta_one_(nullptr)
30 , features_delta_two_(nullptr) {}
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;
54 total_feature_weight_ = canonical_count;
55 for (
int f : indexed_features) {
57 for (
int dir = -kNumOffsetMaps; dir <= kNumOffsetMaps; ++dir) {
63 features_delta_one_[mapped_f] =
value;
64 for (
int dir2 = -kNumOffsetMaps; dir2 <= kNumOffsetMaps; ++dir2) {
68 const int mapped_f2 = feature_map_->
OffsetFeature(mapped_f, dir2);
70 features_delta_two_[mapped_f2] =
value;
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]) {
89 misses -= 2.0 * weight;
90 }
else if (features_delta_one_[index]) {
91 misses -= 1.5 * weight;
92 }
else if (features_delta_two_[index]) {
94 misses -= 1.0 * weight;
97 return misses / denominator;
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;
110 tprintf(
"Testing feature weight %g:", weight);
112 if (features_[index]) {
114 misses -= 2.0 * weight;
116 }
else if (features_delta_one_[index]) {
117 misses -= 1.5 * weight;
119 }
else if (features_delta_two_[index]) {
121 misses -= 1.0 * weight;
128 for (
int i = 0;
i < size_; ++
i) {
134 tprintf(
"\nMinus one features:");
135 for (
int i = 0;
i < size_; ++
i) {
136 if (features_delta_one_[
i]) {
141 tprintf(
"\nMinus two features:");
142 for (
int i = 0;
i < size_; ++
i) {
143 if (features_delta_two_[
i]) {
149 return misses / denominator;
153void IntFeatureDist::Clear() {
156 delete[] features_delta_one_;
157 features_delta_one_ =
nullptr;
158 delete[] features_delta_two_;
159 features_delta_two_ =
nullptr;
void tprintf(const char *format,...)
void Set(const std::vector< int > &indexed_features, int canonical_count, bool value)
double DebugFeatureDistance(const std::vector< int > &features) const
void Init(const IntFeatureMap *feature_map)
double FeatureDistance(const std::vector< int > &features) const
INT_FEATURE_STRUCT InverseMapFeature(int map_feature) const
int OffsetFeature(int index_feature, int dir) const