Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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_;
}