コード例 #1
0
ファイル: oja_data.cpp プロジェクト: cran/OjaNP
void OjaData::get_oja_and_gradient(const Point& x,double& oja
  ,Point& grad) const
{
    errif(x.dim() != dim(),"OjaData::get_oja_and_gradient: point " << x
	  << " has illegal dimension");

 	if(plane)
 	{
 		plane->oja_and_gradient(x,oja,grad);
 		return;
 	}
			
    double sum = 0.0;
    double sgn;
    double k = 1.0 / double(fact(dim()));
    Simplex S;
    Point Gr(dim());
	
    for(Index I(dim(),size()); I; I++)
    {
		S.get(*this,I,x);
		sum += S.size();
		sgn = S.sign();
		for(int j=0; j<dim(); j++)
			Gr[j] +=  S.row_cof(j+1) * sgn * k;
    }
    
    oja = sum;
    grad = Gr;
}
コード例 #2
0
ファイル: oja_data.cpp プロジェクト: cran/OjaNP
double OjaData::oja(const Point& x) const
{
	if (size() == 0) return -1;
    errif(x.dim() != dim(),"OjaData::oja: Illegal dimension on point " << x);
	
    if(plane)
		return plane->oja(x);
	
    double sum = 0.0;
    Simplex S;
	
    for(Index I(dim(),size()); I; I++)
    {
		S.get(*this,I,x);
		sum += S.size();
    }
    
    return sum;
}