void selection_rank_fun::grad(double *w, double *g) { int i; int l=prob->l; double *ATAXw; ATAXw = new double[l]; int w_size = get_nr_variable(); double begin, end; #pragma omp parallel for default(shared) private(i) for (i=0;i<l;i++) ATAXw[i]=(double)l_plus[i]-(double)l_minus[i]+((double)l_plus[i]+(double)l_minus[i])*z[i]-alpha_plus[i]-alpha_minus[i]; begin = omp_get_wtime(); XTv(ATAXw, g); end = omp_get_wtime(); XTviter++; XTvtime += end-begin; #pragma omp parallel for default(shared) private(i) for(i=0;i<w_size;i++) g[i] = w[i] + 2*C*g[i]; delete[] ATAXw; }
void l2r_l2_ranksvm_fun::grad(double *w, double *g) { int i; int l = prob->l; double *ATAXw; ATAXw = new double[l]; int w_size = get_nr_variable(); for (i=0;i<l;i++) ATAXw[i] = l_plus[i] - l_minus[i] + (l_plus[i] + l_minus[i]) * z[i] - alpha_plus[i] - alpha_minus[i]; XTv(ATAXw, g); for(i=0;i<w_size;i++) g[i] = w[i] + 2 * C * g[i]; delete[] ATAXw; }
void l2_lr_fun::Hv(double *s, double *Hs) { int i; int l=prob->l; int n=prob->n; double *wa = new double[l]; Xv(s, wa); for(i=0;i<l;i++) wa[i] = C[i]*D[i]*wa[i]; XTv(wa, Hs); for(i=0;i<n;i++) Hs[i] = s[i] + Hs[i]; delete[] wa; }
void l2r_lr_fun::Hv(double *s, double *Hs) { int i; int l=prob->l; int w_size=get_nr_variable(); double *wa = new double[l]; Xv(s, wa); for(i=0;i<l;i++) wa[i] = C[i]*D[i]*wa[i]; XTv(wa, Hs); for(i=0;i<w_size;i++) Hs[i] = s[i] + Hs[i]; delete[] wa; }
void l2r_l2_ranksvm_fun::Hv(double *s, double *Hs) { int q,i,j; int w_size = get_nr_variable(); int l = prob->l; double *wa = new double[l]; selectiontree *T; double* alpha_plus_minus; alpha_plus_minus = new double[l]; Xv(s, wa); for (q=0;q<nr_query;q++) { id_and_value *order_perm_q = order_perm[q]; T = new selectiontree(nr_class[q]); j = 0; for (i=0;i<count[q];i++) { while (j<count[q] && (1 - order_perm_q[j].value + order_perm_q[i].value>0)) { T->insert_node(int_y[order_perm_q[j].id],wa[order_perm_q[j].id]); j++; } alpha_plus_minus[order_perm_q[i].id] = T->xv_larger(int_y[order_perm_q[i].id]); } delete T; j = count[q] - 1; T = new selectiontree(nr_class[q]); for (i=count[q]-1;i>=0;i--) { while (j>=0 && (1 - order_perm_q[i].value + order_perm_q[j].value>0)) { T->insert_node(int_y[order_perm_q[j].id], wa[order_perm_q[j].id]); j--; } alpha_plus_minus[order_perm_q[i].id] += T->xv_smaller(int_y[order_perm_q[i].id]); } delete T; } for (i=0;i<l;i++) wa[i] = wa[i] * (l_plus[i] + l_minus[i]) - alpha_plus_minus[i]; delete[] alpha_plus_minus; XTv(wa, Hs); delete[] wa; for(i=0;i<w_size;i++) Hs[i] = s[i] + 2 * C * Hs[i]; }
void selection_rank_fun::Hv(double *s, double *Hs) { int i,j,k; int w_size=get_nr_variable(); int l=prob->l; double *wa = new double[l]; selectiontree *T; double* alpha_plus_minus; alpha_plus_minus = new double[l]; Xv(s, wa); for (i=0;i<nr_subset;i++) { T=new selectiontree(nr_class[i]); k=0; for (j=0;j<count[i];j++) { while (k<count[i]&&(1-pi[i][j].value+pi[i][k].value>0)) { T->insert_node(int_y[pi[i][k].id],wa[pi[i][k].id]); k++; } alpha_plus_minus[pi[i][j].id]=T->vector_sum_smaller(int_y[pi[i][j].id]); } delete T; k=count[i]-1; T = new selectiontree(nr_class[i]); for (j=count[i]-1;j>=0;j--) { while (k>=0&&(1+pi[i][j].value-pi[i][k].value>0)) { T->insert_node(int_y[pi[i][k].id],wa[pi[i][k].id]); k--; } alpha_plus_minus[pi[i][j].id]+=T->vector_sum_larger(int_y[pi[i][j].id]); } delete T; } for (i=0;i<l;i++) wa[i]=wa[i]*((double)l_plus[i]+(double)l_minus[i])-alpha_plus_minus[i]; delete[] alpha_plus_minus; XTv(wa, Hs); delete[] wa; for(i=0;i<w_size;i++) Hs[i] = s[i] + 2*C*Hs[i]; }
void l2_lr_fun::grad(double *w, double *g) { int i; int *y=prob->y; int l=prob->l; int n=prob->n; for(i=0;i<l;i++) { z[i] = 1/(1 + exp(-y[i]*z[i])); D[i] = z[i]*(1-z[i]); z[i] = C[i]*(z[i]-1)*y[i]; } XTv(z, g); for(i=0;i<n;i++) g[i] = w[i] + g[i]; }
void l2r_lr_fun::grad(double *w, double *g) { int i; int *y=prob->y; int l=prob->l; int w_size=get_nr_variable(); for(i=0;i<l;i++) { z[i] = 1/(1 + exp(-y[i]*z[i])); D[i] = z[i]*(1-z[i]); z[i] = C[i]*(z[i]-1)*y[i]; } XTv(z, g); for(i=0;i<w_size;i++) g[i] = w[i] + g[i]; }
void selection_rank_fun::grad(double *w, double *g, int *Hsample, int now_iter, int num_sample, long int *num_data ) { int i, j, k; int l=prob->l; double *ATAXw; ATAXw = new double[l]; int w_size=get_nr_variable(); for(i=0;i<nr_subset;i++)//do sampling { sizeS[i]=0; for(j=0;j<count[i];j++) { k = pi[i][j].id; if(Hsample[k]==now_iter%num_sample) { Spi[i][sizeS[i]].id = pi[i][j].id; Spi[i][sizeS[i]].value = pi[i][j].value; Is[i][sizeS[i]] = j; sizeS[i]++; } } } startS[0] = 0; totalS = sizeS[0]; for(i=1;i<nr_subset;i++) { totalS += sizeS[i]; startS[i] = startS[i-1] + sizeS[i-1]; } for (i=0;i<l;i++) { ATAXw[i]=(double)l_plus[i]-(double)l_minus[i]+((double)l_plus[i]+(double)l_minus[i])*z[i]-alpha_plus[i]-alpha_minus[i]; } XTv(ATAXw, g); for(i=0;i<w_size;i++) g[i] = w[i] + 2*C*g[i]; delete[] ATAXw; }
void selection_rank_fun::Hv(double *s, double *Hs) { int i,j,k; int w_size=get_nr_variable(); int l=prob->l; double *wa = new double[l]; selectiontree *T; double* alpha_plus_minus; alpha_plus_minus = new double[l]; double begin, end; begin = omp_get_wtime(); Xv(s, wa); end = omp_get_wtime(); Xviter++; Xvtime += end-begin; begin = omp_get_wtime(); #pragma omp parallel for default(shared) private(i, j, k, T) for (i=0;i<nr_subset;i++) { T=new selectiontree(nr_class[i]);// nr_class[i]is the i-th query's number of different label k=0; for (j=0;j<count[i];j++) { while (k<count[i]&&(1-pi[i][j].value+pi[i][k].value>0)) { T->insert_node(int_y[pi[i][k].id],wa[pi[i][k].id]); k++; } alpha_plus_minus[pi[i][j].id]=T->vector_sum_smaller(int_y[pi[i][j].id]); } delete T; k=count[i]-1; T = new selectiontree(nr_class[i]); for (j=count[i]-1;j>=0;j--) { while (k>=0&&(1+pi[i][j].value-pi[i][k].value>0)) { T->insert_node(int_y[pi[i][k].id],wa[pi[i][k].id]); k--; } alpha_plus_minus[pi[i][j].id]+=T->vector_sum_larger(int_y[pi[i][j].id]); } delete T; } end = omp_get_wtime(); AViter++; AVtime += end-begin; #pragma omp parallel for default(shared) private(i) for (i=0;i<l;i++) wa[i]=wa[i]*((double)l_plus[i]+(double)l_minus[i])-alpha_plus_minus[i]; delete[] alpha_plus_minus; begin = omp_get_wtime(); XTv(wa, Hs); end = omp_get_wtime(); XTviter++; XTvtime += end-begin; delete[] wa; #pragma omp parallel for default(shared) private(i) for(i=0;i<w_size;i++) Hs[i] = s[i] + 2*C*Hs[i]; }