Vowpal Wabbit
label_dictionary.cc
Go to the documentation of this file.
1 #include "reductions.h"
2 #include "cost_sensitive.h"
3 #include "label_dictionary.h"
4 
5 namespace LabelDict
6 {
7 constexpr size_t hash_lab(size_t lab) noexcept { return 328051 + 94389193 * lab; }
8 
10 {
11  // print_update is called after this del_example_namespace,
12  // so we need to keep the ec.num_features correct,
13  // so shared features are included in the reported number of "current features"
14  // ec.num_features -= numf;
15  features& del_target = ec.feature_space[(size_t)ns];
16  assert(del_target.size() >= fs.size());
17  assert(ec.indices.size() > 0);
18  if (ec.indices.last() == ns && ec.feature_space[(size_t)ns].size() == fs.size())
19  ec.indices.pop();
21  ec.num_features -= fs.size();
22  del_target.truncate_to(del_target.size() - fs.size());
23  del_target.sum_feat_sq -= fs.sum_feat_sq;
24 }
25 
27 {
28  bool has_ns = false;
29  for (size_t i = 0; i < ec.indices.size(); i++)
30  if (ec.indices[i] == (size_t)ns)
31  {
32  has_ns = true;
33  break;
34  }
35 
36  if (!has_ns)
37  ec.indices.push_back((size_t)ns);
38 
39  bool audit = fs.space_names.size() > 0;
40  features& add_fs = ec.feature_space[(size_t)ns];
41  for (size_t i = 0; i < fs.size(); ++i)
42  {
43  add_fs.push_back(fs.values[i], fs.indicies[i]);
44  if (audit)
45  add_fs.space_names.push_back(fs.space_names[i]);
46  }
48 
49  ec.num_features += fs.size();
50 }
51 
53 {
54  for (namespace_index idx : source.indices)
55  {
56  if (idx == constant_namespace)
57  continue;
58  add_example_namespace(target, idx, source.feature_space[idx]);
59  }
60 }
61 
63 {
64  if (source.indices.size() == 0) // making sure we can deal with empty shared example
65  return;
66  namespace_index* idx = source.indices.end();
67  idx--;
68  for (; idx >= source.indices.begin(); idx--)
69  {
70  if (*idx == constant_namespace)
71  continue;
72  del_example_namespace(target, *idx, source.feature_space[*idx]);
73  }
74 }
75 
77 {
78  size_t lab_hash = hash_lab(lab);
79  features& res = lfm.get(lab, lab_hash);
80  if (res.size() == 0)
81  return;
82  add_example_namespace(ec, static_cast<unsigned char>('l'), res);
83 }
84 
86 {
87  size_t lab_hash = hash_lab(lab);
88  features& res = lfm.get(lab, lab_hash);
89  if (res.size() == 0)
90  return;
91  del_example_namespace(ec, static_cast<unsigned char>('l'), res);
92 }
93 
94 void set_label_features(label_feature_map& lfm, size_t lab, features& fs)
95 {
96  size_t lab_hash = hash_lab(lab);
97  if (lfm.contains(lab, lab_hash))
98  return;
99  lfm.put_after_get(lab, lab_hash, fs);
100 }
101 
103 {
104  void* label_iter = lfm.iterator();
105  while (label_iter != nullptr)
106  {
107  features* res = lfm.iterator_get_value(label_iter);
108  res->values.delete_v();
109  res->indicies.delete_v();
110  res->space_names.delete_v();
111 
112  label_iter = lfm.iterator_next(label_iter);
113  }
114  lfm.clear();
115  lfm.delete_v();
116 }
117 } // namespace LabelDict
v_array< namespace_index > indices
V * iterator_get_value(void *el)
Definition: v_hashmap.h:143
T pop()
Definition: v_array.h:58
void push_back(feature_value v, feature_index i)
void set_label_features(label_feature_map &lfm, size_t lab, features &fs)
v_array< feature_index > indicies
void put_after_get(const K &key, uint64_t hash, const V &val)
Definition: v_hashmap.h:259
void del_example_namespaces_from_example(example &target, example &source)
void del_example_namespace(example &ec, namespace_index ns, features &fs)
the core definition of a set of features.
v_array< feature_value > values
void * iterator()
Definition: v_hashmap.h:131
void add_example_namespace_from_memory(label_feature_map &lfm, example &ec, size_t lab)
void * iterator_next(void *prev)
Definition: v_hashmap.h:116
T *& begin()
Definition: v_array.h:42
size_t size() const
Definition: v_array.h:68
std::array< features, NUM_NAMESPACES > feature_space
void truncate_to(const features_value_iterator &pos)
size_t size() const
void push_back(const T &new_ele)
Definition: v_array.h:107
void del_example_namespace_from_memory(label_feature_map &lfm, example &ec, size_t lab)
size_t num_features
Definition: example.h:67
void clear()
Definition: v_hashmap.h:107
unsigned char namespace_index
T *& end()
Definition: v_array.h:43
v_array< audit_strings_ptr > space_names
float total_sum_feat_sq
Definition: example.h:71
float sum_feat_sq
void add_example_namespace(example &ec, namespace_index ns, features &fs)
void delete_v()
Definition: v_hashmap.h:103
bool contains(const K &key, size_t hash)
Definition: v_hashmap.h:230
T last() const
Definition: v_array.h:57
void delete_v()
Definition: v_array.h:98
constexpr unsigned char constant_namespace
Definition: constant.h:22
V & get(const K &key, uint64_t hash)
Definition: v_hashmap.h:203
void free_label_features(label_feature_map &lfm)
constexpr size_t hash_lab(size_t lab) noexcept
void add_example_namespaces_from_example(example &target, example &source)