Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
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];
}
Пример #6
0
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];
}
Пример #7
0
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];
}
Пример #8
0
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];
}
Пример #9
0
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;
}
Пример #10
0
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];
}