12 #ifndef ossimPolynom_HEADER 13 #define ossimPolynom_HEADER 37 template <
class T,
int DIM = 1 >
52 for(
unsigned int i=0;i<o1.size();++i)
57 }
else if (o1[i]>o2[i])
66 typedef std::map< EXP_TUPLE, T , EXP_TUPLE_LESSTHAN >
MONOM_MAP;
68 typedef std::set< EXP_TUPLE, EXP_TUPLE_LESSTHAN >
EXPT_SET;
126 typename MONOM_MAP::const_iterator it =
theMonoms.find(m);
165 typename MONOM_MAP::const_iterator it;
188 if ((d>=DIM) || (d<0))
return -1;
193 typename MONOM_MAP::const_iterator it;
196 corder = (it->first)[d];
197 if ( corder > order ) order = corder;
206 typename MONOM_MAP::const_iterator it;
210 for (
int d=0;d<DIM;++d) sorder+=(it->first)[d];
211 if ( sorder > order ) order = sorder;
223 typename MONOM_MAP::const_iterator it;
229 for(
int d=0;d<DIM;++d)
234 mv *= std::pow( v[d], p );
251 for (
typename MONOM_MAP::const_iterator it =
getMonoms().begin(); it !=
getMonoms().end() ; ++it )
253 ord = it->first[pdim];
258 result.
setMonom(expDiff, it->second * ord);
269 for (
typename MONOM_MAP::const_iterator it =
getMonoms().begin(); it !=
getMonoms().end() ; ++it )
292 typename MONOM_MAP::const_iterator it;
303 typename MONOM_MAP::const_iterator it;
321 for (
typename MONOM_MAP::const_iterator it =
getMonoms().begin(); it !=
getMonoms().end() ; ++it )
323 for (
typename MONOM_MAP::const_iterator pit = p.
getMonoms().begin(); pit != p.
getMonoms().end() ; ++pit )
325 coeff = it->second * pit->second;
346 for(
int i=0;i<DIM;++i) {
372 static const char* monom_sep =
" ; ";
373 static const char* no_sep =
"";
375 const char* use_sep = no_sep;
378 os<<std::setprecision(16);
379 os<<std::setiosflags(std::ios_base::scientific);
387 for (
typename MONOM_MAP::const_iterator it =
getMonoms().begin(); it !=
getMonoms().end() ; ++it )
389 os<<use_sep<<it->second<<
"(";
390 for(
int d=0 ; d<DIM ; ++d)
412 os<<std::setiosflags(std::ios_base::fixed);
413 os<<std::setprecision(14);
415 for (
typename MONOM_MAP::const_iterator it =
getMonoms().begin(); it !=
getMonoms().end() ; ++it )
417 T coeff = it->second;
423 for(
int d=0;d<DIM;++d)
425 int ord=(it->first)[d];
451 std::cerr<<
"ossimPolynom::import ERROR, cannot read left bracket ["<<std::endl;
456 std::cerr<<
"ossimPolynom::import ERROR, missing left bracket ["<<std::endl;
459 const int BUFSIZE=32768;
460 char buffer[BUFSIZE];
461 is.
getline(buffer, BUFSIZE,
']');
464 std::cerr<<
"ossimPolynom::import ERROR, cannot read after left bracket ["<<std::endl;
467 if (is.gcount() >= BUFSIZE-1)
469 std::cerr<<
"ossimPolynom::import ERROR, cannot find right bracket ] after "<<BUFSIZE-1<<
"characters"<<std::endl;
475 std::vector< ossimString > subparts = tempString.
explode(
";");
477 for (
typename std::vector< ossimString >::const_iterator it=subparts.begin() ; it!=subparts.end() ; ++it )
482 if (aft_eps.
size()>0)
492 T coeff =
static_cast< T
>(scalpart.
toDouble());
494 if (expopart.
size() == 0)
496 std::cerr<<
"ossimPolynom::import ERROR, cannot find ) in monom or empty monom"<<std::endl;
499 std::vector< ossimString > vexpo = expopart.
explode(
",");
500 if (vexpo.size() != DIM)
502 std::cerr<<
"ossimPolynom::import ERROR, bad number of exponents in monom (need "<<DIM<<
"): "<<vexpo.size()<<std::endl;
508 std::vector< ossimString >::const_iterator eit;
509 for (eit=vexpo.begin() , d=0 ; eit != vexpo.end() ; ++eit, ++d )
511 expt[d] = eit->toInt();
516 std::cerr<<
"ossimPolynom::import ERROR, duplicate exponent tuple in polynom"<<std::endl;
522 std::cerr<<
"ossimPolynom::import ERROR, cannot find left parenthesis ( in monom "<<std::endl;
537 if (orders.size() != DIM)
539 std::cerr<<
"ossimPolynom::import ERROR bad dimension for parameter, need "<<DIM<<
" elements"<<std::endl;
544 for(
int d=0;d<DIM;++d) et[d]=0;
545 while (et[0] <= orders[0])
552 for(
int d=DIM-1 ; d>=0 ; --d)
554 if ((et[d] > orders[d]) && (d>0))
573 for(
int o=0; o<=totalOrder ; ++o)
584 for(
typename EXPT_SET::iterator sit = eset.begin(); sit != eset.end(); ++sit)
597 newset.insert(extset.begin(), extset.end());
612 const std::vector< VAR_TUPLE > obs_input,
613 const std::vector< T > obs_output,
620 int nobs = (int)obs_input.size();
621 if (nobs != (
int)obs_output.size())
623 std::cerr<<
"ossimPolynom::LMSfit ERROR observation input/output must have the same size"<<std::endl;
628 std::cerr<<
"ossimPolynom::LMSfit ERROR observation count is zero"<<std::endl;
631 int ncoeff = (int)expset.size();
634 std::cerr<<
"ossimPolynom::LMSfit ERROR exponent count is zero"<<std::endl;
643 NEWMAT::Matrix M(nobs, ncoeff);
646 typename EXPT_SET::const_iterator cit;
647 typename std::vector< VAR_TUPLE >::const_iterator oit;
649 for (cit=expset.begin(), j=1; cit != expset.end() ; ++cit, ++j)
651 for(oit=obs_input.begin(), i=1; oit!=obs_input.end();++oit, ++i)
655 for(
int d=0;d<DIM;++d)
660 elt *= std::pow( (*oit)[d], p );
668 NEWMAT::ColumnVector v(nobs);
669 for(
int o=0;o<nobs;++o)
671 v(o+1) = obs_output[o];
676 NEWMAT::ColumnVector bfit =
invert(M.t()*M)*M.t()*v;
681 NEWMAT::ColumnVector delta = M*bfit - v;
682 *prms = std::sqrt( delta.SumSquare() / nobs);
686 for (cit=expset.begin(), j=1; cit != expset.end() ; ++cit, ++j)
701 const std::vector< VAR_TUPLE > obs_input,
702 const std::vector< T > obs_output,
709 int nobs = (int)obs_input.size();
710 if (nobs != (
int)obs_output.size())
712 std::cerr<<
"ossimPolynom::LMSfit ERROR observation input/output must have the same size"<<std::endl;
717 std::cerr<<
"ossimPolynom::LMSfit ERROR observation count is zero"<<std::endl;
720 int ncoeff = (int)expset.size();
723 std::cerr<<
"ossimPolynom::LMSfit ERROR exponent count is zero"<<std::endl;
730 NEWMAT::Matrix M(nobs, ncoeff);
733 typename EXPT_SET::const_iterator cit;
734 typename std::vector< VAR_TUPLE >::const_iterator oit;
736 for (cit=expset.begin(), j=1; cit != expset.end() ; ++cit, ++j)
738 for(oit=obs_input.begin(), i=1; oit!=obs_input.end();++oit, ++i)
741 for(
int d=0;d<DIM;++d)
746 elt *= std::pow( (*oit)[d], p );
753 NEWMAT::ColumnVector v(nobs);
754 for(
int o=0;o<nobs;++o)
756 v(o+1) = obs_output[o];
760 NEWMAT::ColumnVector bfit = (M.t()*M).i()*M.t()*v;
765 NEWMAT::ColumnVector delta = M*bfit - v;
766 *prms = std::sqrt( delta.SumSquare() / nobs);
770 for (cit=expset.begin(), j=1; cit != expset.end() ; ++cit, ++j)
791 std::vector< typename MONOM_MAP::iterator > erasev;
792 for (
typename MONOM_MAP::iterator it =
theMonoms.begin(); it !=
theMonoms.end() ; ++it )
797 for (
typename std::vector< typename MONOM_MAP::iterator >::const_iterator vit = erasev.begin(); vit != erasev.end() ; ++vit )
809 typename MONOM_MAP::iterator it =
theMonoms.find(m);
814 theMonoms.insert( MONOM_MAP::value_type(m,v));
825 NEWMAT::DiagonalMatrix d;
861 operator<<(std::ostream& os, const ossimPolynom<T,DIM>& pt)
ossimPolynom(const ossimPolynom &p)
ossimString before(const ossimString &str, std::string::size_type pos=0) const
METHOD: before(str, pos) Returns string beginning at pos and ending one before the token str If strin...
EXPT_SET builExpSet(const EXP_TUPLE &orders) const
constructs simple exponent tuples set for using LMSfit need order for each dimension ...
const T & getEpsilon() const
no setEpsilon beacause might erase monoms
bool isNegligible(const T &v) const
can v be considered as zero?
int getOrder(int d) const
orders
T eval(const VAR_TUPLE &v) const
evaluation : needs DIM values as input
type to store multivariate input
template class for multivariate polynom algebra
bool SLSfit(const EXPT_SET &expset, const std::vector< VAR_TUPLE > obs_input, const std::vector< T > obs_output, T *prms=NULL)
Standard least squares Modified version of LMSfit that uses standard NEWMAT inverse as alternative to...
T theEpsilon
associate a scalar to each tuple of orders : monom
ossimPolynom operator*(const ossimPolynom &p) const
product operator : use epsilon from left side
std::istream & import(std::istream &is)
note that it can only import for the template type T and dimesnion DIM
std::string::size_type size() const
void addExpTupleRight(int newdim, int totalOrder, EXPT_SET &eset) const
concatenate exponents (at the right) to existing tuple set, for a given maximum total order eg: with ...
unsigned int ossim_uint32
bool operator!=(const ossimPolynom &pt) const
ossimString trim(const ossimString &valueToTrim=ossimString(" \\)) const
this will strip lead and trailing character passed in.
void setMonom(const int mexp[DIM], const T &v)
std::map< EXP_TUPLE, T, EXP_TUPLE_LESSTHAN > MONOM_MAP
ossimPolynom(const T &epsilon=0)
for storing set of exponent tuples
void SVD(const Matrix &, DiagonalMatrix &, Matrix &, Matrix &, bool=true, bool=true)
std::set< EXP_TUPLE, EXP_TUPLE_LESSTHAN > EXPT_SET
for storing polynom
std::vector< int > EXP_TUPLE
inner types
const ossimPolynom & operator*=(const T &k)
operations with scalar
MONOM_MAP theMonoms
protected data members
const MONOM_MAP & getMonoms() const
std::vector< ossimString > explode(const ossimString &delimeter) const
NEWMAT::Matrix invert(const NEWMAT::Matrix &m) const
invert stolen from ossimRpcSolver
const ossimPolynom & operator*=(const ossimPolynom &p)
bool operator==(const ossimPolynom &pt) const
comparison operators -don't compare theEpsilon values -use my own epsilon in comparisons (not the com...
ossimPolynom operator-(const ossimPolynom &p) const
std::ostream & printNice(std::ostream &os, const char symbols[DIM])
classic representation (bad accuracy, for display only)
std::basic_istream< char > istream
Base class for char input streams.
ossimPolynom operator+(const ossimPolynom &p) const
arithmetic operators
void discardNullMonoms()
positive values below epsilon are considered 0
void delMonom(const EXP_TUPLE &m)
int getTotalOrder() const
returns maximum order of monoms
const ossimPolynom & operator=(const ossimPolynom< T, DIM > &pt)
void addMonomQuick(const EXP_TUPLE &m, const T &v)
add value without testing for negligible
bool LMSfit(const EXPT_SET &expset, const std::vector< VAR_TUPLE > obs_input, const std::vector< T > obs_output, T *prms=NULL)
fits the polynom to the observations using Least Mean Squares returns true on success (can fail if no...
std::ostream & print(std::ostream &os) const
I/O.
std::vector< T > VAR_TUPLE
type to store exponent tuples
bool operator()(const EXP_TUPLE &o1, const EXP_TUPLE &o2) const
const ossimPolynom & operator+=(const ossimPolynom &p)
void pdiff(int pdim, ossimPolynom &result) const
partial differentiation polynom
friend OSSIM_DLL std::istream & getline(std::istream &is, ossimString &str, char delim)
Reads a string from the input stream is, stopping when it reaches delim.
static void addExpTuple(EXP_TUPLE &m1, const EXP_TUPLE &m2)
void setMonom(const EXP_TUPLE &m, const T &v)
ossimString after(const ossimString &str, std::string::size_type pos=0) const
METHOD: after(str, pos) Returns string immediately after the token str.
const ossimPolynom & operator-=(const ossimPolynom &p)
std::basic_ostream< char > ostream
Base class for char output streams.
T getCoeff(const EXP_TUPLE &m) const
std::istream & operator>>(std::istream &is, ossimPolynom< T, DIM > &pt)