本文整理汇总了C++中Evaluator::get_gradient_vec方法的典型用法代码示例。如果您正苦于以下问题:C++ Evaluator::get_gradient_vec方法的具体用法?C++ Evaluator::get_gradient_vec怎么用?C++ Evaluator::get_gradient_vec使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Evaluator
的用法示例。
在下文中一共展示了Evaluator::get_gradient_vec方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: backtracking_linear_search
double backtracking_linear_search(
Evaluator& evaluator, // class of objective function value evaluation
double *xp, // backup place for x
double *p, // negative of search direction
double *fx, // current function value at x
double c, // sufficient decrease condition threshold
double init_step, // initial step length
double r, // scale factor in backtracking
int *evaluateCnt // counter
){
double *x=0; //current points
int n=evaluator.get_current_parameter(x);
double *g=evaluator.get_gradient_vec();
double dec=vec_dot(g,p,n);
//cout<<"#IN_LINEAR_SEARCH unit decrease of g'p="<<dec<<endl;
if(dec<0){ // non suitable step,p is not a descent search direction
return -1;
}
// for(int i=0;i<5;i++) cout<<"x["<<i<<"]="<<x[i]<<" p["<<i<<"]="<<p[i]<<endl;
double alpha=init_step;
//vec_add(xp,x,p,n,1,-alpha); // p is the negative of search of direction
//TODO: do it better
for(int i=0;i<n;++i) xp[i]=(x[i]-alpha*p[i]<1e-6)?0:(x[i]-alpha*p[i]);
double old_fx=*fx;
*fx=evaluator.evaluate(xp,g);
++(*evaluateCnt);
int trials=0;
while( *fx > old_fx-alpha*c*dec ){
//cout<<"-----try step length "<<alpha<<" get obj="<<*fx<<" dec="<<old_fx-*fx<<" require min dec="<<alpha*c*dec<<endl;
alpha*=r;
//vec_add(xp,x,p,n,1,-alpha);
//TODO: do it better
for(int i=0;i<n;++i) xp[i]=(x[i]-alpha*p[i]<1e-6)?0:(x[i]-alpha*p[i]);
*fx=evaluator.evaluate(xp,g);
++(*evaluateCnt);
++trials;
}
//cout<<"#IN_LINEAR_SEARCH success linear search, get alpha="<<alpha<<" obj="<<*fx<<" dec="<<old_fx-*fx<<" required min dec="<<alpha*c*dec<<" trails="<<trials<<endl;
return alpha;
}