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