From 6cb1fd2112db36f735691f83bb7de89f6a757308 Mon Sep 17 00:00:00 2001 From: Jordi Inglada <jordi.inglada@cesbio.cnes.fr> Date: Mon, 21 Mar 2011 09:42:50 +0100 Subject: [PATCH] ENH: make functor thread safe by const methods --- .../otbTimeSeriesLeastSquareFittingFunctor.h | 22 ++++++++++--------- ...imeSeriesLeastSquareFittingFunctorTest.cxx | 3 +-- ...esLeastSquareFittingFunctorWeightsTest.cxx | 3 +-- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Code/MultiTemporal/otbTimeSeriesLeastSquareFittingFunctor.h b/Code/MultiTemporal/otbTimeSeriesLeastSquareFittingFunctor.h index 0767e5f81e..948f3925b0 100644 --- a/Code/MultiTemporal/otbTimeSeriesLeastSquareFittingFunctor.h +++ b/Code/MultiTemporal/otbTimeSeriesLeastSquareFittingFunctor.h @@ -64,10 +64,10 @@ public: inline TSeriesType operator ()(const TSeriesType& series) { - this->EstimateTimeFunction(series); + TTimeFunction estFunction = this->EstimateTimeFunction(series); TSeriesType outSeries; for(unsigned int i = 0; i < m_DoySeries.Size(); ++i) - outSeries[i] = m_TimeFunction.GetValue( m_DoySeries[i] ); + outSeries[i] = estFunction.GetValue( m_DoySeries[i] ); return outSeries; } @@ -83,15 +83,16 @@ public: m_WeightSeries[i] = weights[i]; } - inline CoefficientsType GetCoefficients() const + inline CoefficientsType GetCoefficients(const TSeriesType& series) const { - return m_TimeFunction.GetCoefficients(); + return (this->EstimateTimeFunction(series)).GetCoefficients(); } - inline void EstimateTimeFunction(const TSeriesType& series) + inline TTimeFunction EstimateTimeFunction(const TSeriesType& series) const { + TTimeFunction estFunction; unsigned int nbDates = m_DoySeries.Size(); - unsigned int nbCoefs = m_TimeFunction.GetCoefficients().Size(); + unsigned int nbCoefs = estFunction.GetCoefficients().Size(); // b = A * c vnl_matrix<double> A(nbDates, nbCoefs); @@ -109,8 +110,8 @@ public: for(unsigned int j = 0; j < nbCoefs; ++j) { tmpCoefs[j] = 1.0; - m_TimeFunction.SetCoefficients(tmpCoefs); - A.put(i, j, m_TimeFunction.GetValue(m_DoySeries[i]) / m_WeightSeries[i]); + estFunction.SetCoefficients(tmpCoefs); + A.put(i, j, estFunction.GetValue(m_DoySeries[i]) / m_WeightSeries[i]); tmpCoefs[j] = 0.0; } } @@ -123,12 +124,13 @@ public: for(unsigned int j = 0; j < nbCoefs; ++j) tmpCoefs[j] = c.get(j, 0); - m_TimeFunction.SetCoefficients(tmpCoefs); + estFunction.SetCoefficients(tmpCoefs); + + return estFunction; } private: /// - TTimeFunction m_TimeFunction; TDateType m_DoySeries; TWeightType m_WeightSeries; }; diff --git a/Testing/Code/MultiTemporal/otbTimeSeriesLeastSquareFittingFunctorTest.cxx b/Testing/Code/MultiTemporal/otbTimeSeriesLeastSquareFittingFunctorTest.cxx index 6df31bd2d1..d3b3fcbed0 100644 --- a/Testing/Code/MultiTemporal/otbTimeSeriesLeastSquareFittingFunctorTest.cxx +++ b/Testing/Code/MultiTemporal/otbTimeSeriesLeastSquareFittingFunctorTest.cxx @@ -56,9 +56,8 @@ int otbTimeSeriesLeastSquareFittingFunctorTest(int argc, char* argv[]) FunctorType f; f.SetDates( doySeries ); - SeriesType outSeries = f(inSeries); - FunctorType::CoefficientsType outCoefs = f.GetCoefficients(); + FunctorType::CoefficientsType outCoefs = f.GetCoefficients(inSeries); for(unsigned int i=0; i<= Degree; i++) if(fabs((outCoefs[i]-inCoefs[i])/inCoefs[i])>0.01) diff --git a/Testing/Code/MultiTemporal/otbTimeSeriesLeastSquareFittingFunctorWeightsTest.cxx b/Testing/Code/MultiTemporal/otbTimeSeriesLeastSquareFittingFunctorWeightsTest.cxx index ffe1017f5f..1cffb66e10 100644 --- a/Testing/Code/MultiTemporal/otbTimeSeriesLeastSquareFittingFunctorWeightsTest.cxx +++ b/Testing/Code/MultiTemporal/otbTimeSeriesLeastSquareFittingFunctorWeightsTest.cxx @@ -69,9 +69,8 @@ int otbTimeSeriesLeastSquareFittingFunctorWeightsTest(int argc, char* argv[]) FunctorType f; f.SetDates( doySeries ); f.SetWeights (weightSeries); - SeriesType outSeries = f(inSeries); - FunctorType::CoefficientsType outCoefs = f.GetCoefficients(); + FunctorType::CoefficientsType outCoefs = f.GetCoefficients(inSeries); for(unsigned int i=0; i<= Degree; i++) if(fabs((outCoefs[i]-inCoefs[i])/inCoefs[i])>0.01) -- GitLab