Point OjaData::oja_rank(const Point& x) const { errif(x.dim() != dim(), "OjaData::oja_rank: Illegal dimension on point " << x); if (plane) return plane->oja_rank(x); Point Gr(dim()); Simplex S; double sgn; double k = 0; for (Index I(dim(), size()); I; I++, k++) { S.get(*this, I, x); sgn = S.sign(); for (int j = 0; j<dim(); j++) Gr[j] += S.row_cof(j + 1) * sgn; } for (int i = 0; i < dim(); i++) Gr[i] /= k; return Gr; }
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; }
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; }
Point OjaData::gradient(const Point& x) const { errif(x.dim() != dim(),"OjaData::gradient: Illegal dimension on point " << x); if(plane) return plane->gradient(x); Point Gr(dim()); Simplex S; double sgn; double k = 1.0 / double(fact(dim())); for(Index I(dim(),size()); I; I++) { S.get(*this,I,x); sgn = S.sign(); for(int j=0; j<dim(); j++) Gr[j] += S.row_cof(j+1) * sgn * k; } return Gr; }