void w_transform(wstr *in, wtrans_func f) { wstr t, *out = w_new(); f(in, out); t = *in; *in = *out; *out = t; w_del(out); }
wstr *w_make(wchar_t *s) { int i, len = wcslen(s); wstr *w = w_new(); for (i = 0; i < len; i++) w_append(w, s[i]); return w; }
static Weight *maw_new(Query *query, Searcher *searcher) { Weight *self = w_new(Weight, query); self->scorer = &masc_new; self->explain = &maw_explain; self->to_s = &maw_to_s; self->similarity = query->get_similarity(query, searcher); self->idf = 1.0; return self; }
static Weight *fqw_new(Query *query, Weight *sub_weight, Similarity *sim) { Weight *self = w_new(FilteredQueryWeight, query); FQW(self)->sub_weight = sub_weight; self->get_value = &fqw_get_value; self->normalize = &fqw_normalize; self->scorer = &fqw_scorer; self->explain = &fqw_explain; self->to_s = &fqw_to_s; self->destroy = &fqw_destroy; self->sum_of_squared_weights = &fqw_sum_of_squared_weights; self->similarity = sim; self->idf = 1.0; self->value = sub_weight->value; return self; }
Eigen::VectorXd l2r_l1hinge_spdc::train_warm_start(const Eigen::VectorXd &alp) { set_alpha(alp); alpha_ = Eigen::VectorXd::Constant(num_ins_, C); // set_w_by_alpha(alpha_); double alpha_old = 0.0; std::default_random_engine g; std::uniform_int_distribution<> uni_dist(0, num_ins_ - 1); const auto ins_is_begin_it = std::begin(active_index_); w_ = Eigen::VectorXd::Zero(num_fea_); spdc_w_ = w_; auto random_it = std::next(ins_is_begin_it, uni_dist(g)); gamma_ = 0.1; double tau_ = std::sqrt(gamma_ / (1.0 * (1.0 / C))) / R_; double sigma_ = std::sqrt(((1.0 / C) * 1.0) / gamma_) / R_; double theta_ = 1.0 - 1.0 / ((1.0 / C) + R_ * std::sqrt((1.0 / C) / (1.0 * gamma_))); // double tau_ = std::sqrt(1.0) / (2.0 * R_); // double sigma_ = std::sqrt(1.0 / 1.0) / (2.0 * R_); // double theta_ = 1.0 - 1.0 / (1.0 + (R_ / gamma_) * std::sqrt(1.0 / 1.0)); const double sig_gam = -sigma_ * gamma_ - 1.0; int i = 0, itr_ = 0; double delta_alpha_i = 0.0, yi = 0.0, beta_i = 0.0, alpha_i_new = 0.0, eta = 0.0; Eigen::VectorXd delta_v(num_fea_), w_new(num_fea_); calculate_duality_gap(true, true); std::cout << tau_ << " " << sigma_ << " " << theta_ << " " << R_ << std::endl; std::cout << " start optimization " << max_iteration << std::endl; for (itr_ = 1; itr_ < max_iteration && duality_gap_ > 1e-6; ++itr_) { for (int ir = 0; ir < num_ins_; ++ir) { random_it = std::next(ins_is_begin_it, uni_dist(g)); i = *random_it; yi = y_[i]; // beta_i = -(sigma_ * (yi * (x_.row(i) * spdc_w_)(0) - 1.0)) + alpha_[i]; beta_i = (sigma_ * (yi * (x_.row(i) * spdc_w_)(0) - 1.0) - alpha_[i]) / (sig_gam); alpha_i_new = std::min(C, std::max(0.0, beta_i)); delta_alpha_i = alpha_i_new - alpha_[i]; alpha_[i] = alpha_i_new; delta_v = (yi * delta_alpha_i) * x_.row(i); // w_new = (1.0 / (1.0 + tau_)) * (w_ - tau_ * (za_ - delta_v)); for (int j = 0; j < num_fea_; ++j) { eta = (1.0 / (1.0 + tau_)) * (w_[j] + tau_ * (za_[j] + delta_v[j])); spdc_w_[j] = eta + theta_ * (eta - w_[j]); w_[j] = eta; } // spdc_w_ = w_new + theta_ * (w_new - w_); // w_ = w_new; // for (srm_iit it(x_, i); it; ++it) // za_[it.index()] += delta_v[it.index()]; za_ += delta_v; } // if (itr_) { calculate_duality_gap(true, true); std::cout << itr_ << " optimization end gap : " << duality_gap_ << " " << primal_obj_value_ << " " << dual_obj_value_ << std::endl; } std::cout << itr_ << " optimization end gap : " << duality_gap_ << " " << primal_obj_value_ << " " << dual_obj_value_ << std::endl; std::cout << w_.transpose() << std::endl; return w_; }