/** \file linmin.hpp \brief linear search \author Junhua Gu */ #ifndef LINMIN_HPP #define LINMIN_HPP #define OPT_HEADER #include "mnbrak.hpp" #include "brent.hpp" #include #include namespace opt_utilities { template class func_adaptor :public func_obj { private: const pT p1,xi1; const func_obj* pfoo; func_adaptor(){} func_adaptor(const func_adaptor&) :func_obj(),p1(),xi1(),pfoo(0) {} public: /* void set_origin(pT& p2) { p1=p2; } void set_direction(pT& xi2) { xi1=xi2; } void set_func_obj(func_obj& foo) { pfoo=&foo; }*/ public: func_adaptor(const pT& _p,const pT& _xi,const func_obj& pf) :p1(_p),xi1(_xi),pfoo(&pf) {} private: func_obj* do_clone()const { return new func_adaptor(*this); } rT do_eval(const rT& x) { //assert(p1.size()==xi1.size()); pT xt; opt_eq(xt,p1); #pragma omp parallel for for(int i=0;i&>(*pfoo).eval(xt); //return x; } }; template void linmin(pT& p,pT& xi,rT& fret,func_obj& func) { // assert(p.size()==10); //assert(xi.size()==10); func_adaptor fadpt(p,xi,func); int j=0; const rT TOL=std::sqrt(std::numeric_limits::epsilon()); rT xx=0,xmin=0,fx=0,fb=0,fa=0,bx=0,ax=0; int n=(int)get_size(p); ax=0.; xx=1.; mnbrak(ax,xx,bx,fa,fx,fb,fadpt); //cout<