在写一个数值优化库tau, 这是一个很小的改动,却事关系全局,是一个有意义的改动
template <typename T>
class function
{
public:
//array1d<real> x0(2, 1.0f);
//function(x0,g0), 检测不出 x0 与 eval中的dim 是否一致
T operator()(const array1d<T>& x, array1d<T>& g)const
{
size_t N=x.size();
g.resize(N);
assert(g.data());
assert(x.data());
return eval(x.size(), x.data(), g.data());
}
virtual T eval(size_t dim, const T *x, T *g) const =0;
};
修正后:
template <typename T>
class function
{
public:
T operator()(const array1d<T>& x, array1d<T>& g)const
{
size_t N=x.size();
if(N!=dim())
throw tau::dimension_exception("dimensions mismatch!");
g.resize(N);
assert(g.data());
assert(x.data());
return eval(x.data(), g.data());
}
virtual size_t dim() const =0;
virtual T eval(const T *x, T *g) const =0;
virtual ::std::string functionName()const { return "f(x)"; }
virtual ::std::string gradientName()const { return "f'(x)"; }
};