void l2loss_svm_fun::Hv(double *s, double *Hs) { int i; int l=prob->l; int n=prob->n; double *wa = new double[l]; subXv(s, wa); for(i=0;i<sizeI;i++) wa[i] = C[I[i]]*wa[i]; subXTv(wa, Hs); for(i=0;i<n;i++) Hs[i] = s[i] + 2*Hs[i]; delete[] wa; }
void l2r_l2_svc_fun::Hv(double *s, double *Hs) { int i; int l=prob->l; int w_size=get_nr_variable(); double *wa = new double[l]; subXv(s, wa); for(i=0;i<sizeI;i++) wa[i] = C[I[i]]*wa[i]; subXTv(wa, Hs); for(i=0;i<w_size;i++) Hs[i] = s[i] + 2*Hs[i]; delete[] wa; }
void l2loss_svm_fun::grad(double *w, double *g) { int i; int *y=prob->y; int l=prob->l; int n=prob->n; sizeI = 0; for (i=0;i<l;i++) if (z[i] < 1) { z[sizeI] = C[i]*y[i]*(z[i]-1); I[sizeI] = i; sizeI++; } subXTv(z, g); for(i=0;i<n;i++) g[i] = w[i] + 2*g[i]; }
void l2r_l2_svc_fun::grad(double *w, double *g) { int i; int *y=prob->y; int l=prob->l; int w_size=get_nr_variable(); sizeI = 0; for (i=0;i<l;i++) if (z[i] < 1) { z[sizeI] = C[i]*y[i]*(z[i]-1); I[sizeI] = i; sizeI++; } subXTv(z, g); for(i=0;i<w_size;i++) g[i] = w[i] + 2*g[i]; }