1 #include <unordered_map> 26 bool id_features[256];
37 std::unordered_map<uint64_t, expert_pair>
44 for (
size_t i = 0; i < 256; i++) temp[i].delete_v();
50 float Rpos = R > 0 ? R : 0.f;
51 if (C == 0. || Rpos == 0.)
53 return 2 * Rpos *
correctedExp(Rpos * Rpos / (3 * C)) / (3 * C);
56 template <
bool is_learn>
72 std::swap(sm.
temp[n], *i);
77 float first_value = j.value();
78 uint64_t first_index = j.index() & mask;
81 std::cout <<
"warning: id feature namespace has " << sm.
temp[n].
size()
82 <<
" features. Should be a multiple of 2" << std::endl;
85 float second_value = j.value();
86 uint64_t second_index = j.index() & mask;
87 if (first_value != 1. || second_value != 1.)
89 std::cout <<
"warning: bad id features, must have value 1." << std::endl;
92 uint64_t key = second_index + ec.
ft_offset;
99 sm.
expert_state.insert(std::make_pair(key, std::make_pair(e, e)));
127 std::swap(sm.
temp[n], *i);
131 template <
bool is_learn>
175 uint64_t second_index = j.index() & mask;
176 uint64_t key = second_index + ec.
ft_offset;
185 e.first.regret += regret1 *
weight;
186 e.first.abs_regret += regret1 * regret1 *
weight;
188 e.second.regret += regret2 *
weight;
189 e.second.abs_regret += regret2 * regret2 *
weight;
199 template <
bool is_learn>
202 make_marginal<is_learn>(sm, ec);
204 if (sm.update_before_learn)
210 sm.feature_pred = pred;
211 compute_expert_loss<is_learn>(sm, ec);
215 make_marginal<is_learn>(sm, ec);
225 compute_expert_loss<is_learn>(sm, ec);
235 sm.feature_pred = pred;
236 compute_expert_loss<is_learn>(sm, ec);
250 std::stringstream msg;
254 total_size = (uint64_t)sm.
marginals.size();
255 msg <<
"marginals size = " << total_size <<
"\n";
260 for (
size_t i = 0; i < total_size; ++i)
272 numerator = iter->second.first;
273 msg << numerator <<
":";
279 denominator = iter->second.second;
280 msg << denominator <<
"\n";
284 sm.
marginals.insert(std::make_pair(index << stride_shift, std::make_pair(numerator, denominator)));
294 msg <<
"expert_state size = " << total_size <<
"\n";
299 for (
size_t i = 0; i < total_size; ++i)
308 float r1, c1, w1, r2, c2, w2;
311 r1 = exp_iter->second.first.regret;
312 c1 = exp_iter->second.first.abs_regret;
313 w1 = exp_iter->second.first.weight;
314 r2 = exp_iter->second.second.regret;
315 c2 = exp_iter->second.second.abs_regret;
316 w2 = exp_iter->second.second.weight;
340 sm.
expert_state.insert(std::make_pair(index << stride_shift, std::make_pair(e1, e2)));
357 marginal_options.
add(
make_option(
"marginal", marginal).keep().help(
"substitute marginal label estimates for ids"));
358 marginal_options.
add(
359 make_option(
"initial_denominator", d->initial_denominator).default_value(1.f).help(
"initial denominator"));
360 marginal_options.
add(
361 make_option(
"initial_numerator", d->initial_numerator).default_value(0.5f).help(
"initial numerator"));
362 marginal_options.
add(
make_option(
"compete", d->compete).help(
"enable competition with marginal features"));
363 marginal_options.
add(
364 make_option(
"update_before_learn", d->update_before_learn).help(
"update marginal values before learning"));
365 marginal_options.
add(
make_option(
"unweighted_marginals", d->unweighted_marginals)
366 .help(
"ignore importance weights when computing marginals"));
367 marginal_options.
add(
368 make_option(
"decay", d->decay).default_value(0.f).help(
"decay multiplier per event (1e-3 for example)"));
378 for (
size_t u = 0; u < 256; u++)
379 if (marginal.find((
char)u) != std::string::npos)
380 d->id_features[u] =
true;
void save_load(data &sm, io_buf &io, bool read, bool text)
void predict(E &ec, size_t i=0)
uint64_t stride_shift(const stagewise_poly &poly, uint64_t idx)
void push_back(feature_value v, feature_index i)
bool unweighted_marginals
float initial_denominator
std::unordered_map< uint64_t, marginal > marginals
the core definition of a set of features.
size_t bin_text_read_write_fixed_validated(io_buf &io, char *data, size_t len, const char *read_message, bool read, std::stringstream &msg, bool text)
std::unordered_map< uint64_t, expert_pair > expert_state
base_learner * make_base(learner< T, E > &base)
void undo_marginal(data &sm, example &ec)
virtual void add_and_parse(const option_group_definition &group)=0
std::pair< double, double > marginal
std::unique_ptr< T, free_fn > free_ptr
single_learner * as_singleline(learner< T, E > *l)
float get_adanormalhedge_weights(float R, float C)
virtual float getLoss(shared_data *, float prediction, float label)=0
learner< T, E > & init_learner(free_ptr< T > &dat, L *base, void(*learn)(T &, L &, E &), void(*predict)(T &, L &, E &), size_t ws, prediction_type::prediction_type_t pred_type)
void push_back(const T &new_ele)
void make_marginal(data &sm, example &ec)
virtual bool was_supplied(const std::string &key)=0
unsigned char namespace_index
LEARNER::base_learner * marginal_setup(options_i &options, vw &all)
void compute_expert_loss(data &sm, example &ec)
void predict_or_learn(data &sm, LEARNER::single_learner &base, example &ec)
option_group_definition & add(T &&op)
iterator over values and indicies
v_array< audit_strings_ptr > space_names
typed_option< T > make_option(std::string name, T &location)
LEARNER::base_learner * setup_base(options_i &options, vw &all)
void learn(E &ec, size_t i=0)
void update_marginal(data &sm, example &ec)
size_t bin_text_read_write_fixed(io_buf &io, char *data, size_t len, const char *read_message, bool read, std::stringstream &msg, bool text)
std::pair< expert, expert > expert_pair