#ifndef OPTVEC_HPP #define OPTVEC_HPP #include #include #include namespace opt_utilities { template class optvec :public std::vector { public: optvec() {} explicit optvec(size_t s) :std::vector(s) {} optvec(const std::vector& rhs) :std::vector(rhs) {} optvec& operator=(const optvec& rhs) { //dynamic_cast&>(*this).operator=(rhs); std::vector::operator=(rhs); return *this; } public: operator std::vector& () { return dynamic_cast&>(*this); } operator const std::vector& ()const { return dynamic_cast&>(*this); } }; template optvec operator+(const optvec& x1,const optvec& x2) { optvec result(x1.size()); for(size_t i=0;i!=x1.size();++i) { result[i]=x1[i]+x2.at(i); } return result; } template optvec operator+(const optvec& x1,const T& x2) { optvec result(x1.size()); for(size_t i=0;i!=x1.size();++i) { result[i]=x1[i]+x2; } return result; } template optvec& operator+=(optvec& x1,const optvec& x2) { for(size_t i=0;i!=x1.size();++i) { x1[i]+=x2.at(i); } return x1; } template optvec operator-(const optvec& x1,const optvec& x2) { optvec result(x1.size()); for(size_t i=0;i!=x1.size();++i) { result[i]=x1[i]-x2.at(i); } return result; } template optvec operator-(const optvec& x1,const T& x2) { optvec result(x1.size()); for(size_t i=0;i!=x1.size();++i) { result[i]=x1[i]-x2; } return result; } template optvec operator-(const optvec& x1) { optvec result(x1.size()); for(size_t i=0;i!=x1.size();++i) { result[i]=-x1[i]; } return result; } template optvec& operator-=(optvec& x1,const optvec& x2) { for(size_t i=0;i!=x1.size();++i) { x1[i]-=x2.at(i); } return x1; } template optvec operator*(const optvec& x1,const optvec& x2) { optvec result(x1.size()); for(size_t i=0;i!=x1.size();++i) { result[i]=x1[i]*x2.at(i); } return result; } template optvec operator*(const optvec& x1,const T& x2) { optvec result(x1.size()); for(size_t i=0;i!=x1.size();++i) { result[i]=x1[i]*x2; } return result; } template optvec operator*(const T& x1,const optvec& x2) { optvec result(x2.size()); for(size_t i=0;i!=x2.size();++i) { result[i]=x2[i]*x1; } return result; } template optvec& operator*=(optvec& x1,const optvec& x2) { for(size_t i=0;i!=x1.size();++i) { x1[i]*=x2.at(i); } return x1; } template optvec& operator*=(optvec& x1,const T& x2) { for(size_t i=0;i!=x1.size();++i) { x1[i]*=x2; } return x1; } template optvec operator/(const optvec& x1,const optvec& x2) { optvec result(x1.size()); for(size_t i=0;i!=x1.size();++i) { result[i]=x1[i]/x2.at(i); } return result; } template optvec operator/(const optvec& x1,const T& x2) { optvec result(x1.size()); for(size_t i=0;i!=x1.size();++i) { result[i]=x1[i]/x2; } return result; } template optvec operator/(const T& x1,const optvec& x2) { optvec result(x1.size()); for(size_t i=0;i!=x1.size();++i) { result[i]=x1/x2[i]; } return result; } template optvec& operator/=(optvec& x1,const optvec& x2) { for(size_t i=0;i!=x1.size();++i) { x1[i]/=x2.at(i); } return x1; } template optvec& operator/=(optvec& x1,const T& x2) { for(size_t i=0;i!=x1.size();++i) { x1[i]/=x2; } return x1; } template T sum(const optvec& x) { T result=0; for(size_t i=0;i!=x.size();++i) { result+=x[i]; } return result; } template bool operator<(const optvec& x1,const optvec& x2) { for(size_t i=0;i!=x1.size();++i) { if(x1[i]!=x2[i]) { return x1[i] \ opt_utilities::optvec _func(const opt_utilities::optvec& x) \ { \ opt_utilities::optvec result(x.size()); \ for(int i=0;i!=result.size();++i) \ { \ result[i]=_func(x[i]); \ } \ return result; \ } namespace std { DEF_VEC_FUNC(sin) DEF_VEC_FUNC(cos) DEF_VEC_FUNC(log) DEF_VEC_FUNC(sqrt) DEF_VEC_FUNC(exp) template opt_utilities::optvec pow(const opt_utilities::optvec& x,const T& y) { opt_utilities::optvec result(x.size()); for(int i=0;i!=result.size();++i) { result[i]=pow(x[i],y); } return result; } } #endif