From 8765cb66820cefaaf70a23847a3e23a77bfdef02 Mon Sep 17 00:00:00 2001
From: Julien Michel <julien.michel@cnes.fr>
Date: Tue, 10 Nov 2015 16:56:51 +0100
Subject: [PATCH] PERF: Same trick as for PCAImageFilter (separate statistics
 estimation from actual image processing)

---
 .../include/otbMNFImageFilter.h               |  2 +
 .../include/otbMNFImageFilter.txx             | 94 +++++++++++++------
 2 files changed, 65 insertions(+), 31 deletions(-)

diff --git a/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.h b/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.h
index 9ae62f88e1..27c2f2f573 100644
--- a/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.h
+++ b/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.h
@@ -166,6 +166,8 @@ protected:
   void PrintSelf(std::ostream& os, itk::Indent indent) const;
 
   /** Internal methods */
+  void ForwardGenerateOutputInformation();
+  void ReverseGenerateOutputInformation();
   virtual void ForwardGenerateData();
   virtual void ReverseGenerateData();
 
diff --git a/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.txx b/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.txx
index 20e1f43eac..3308074e37 100644
--- a/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.txx
+++ b/Modules/Filtering/DimensionalityReduction/include/otbMNFImageFilter.txx
@@ -104,7 +104,6 @@ MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransf
 
       m_NumberOfPrincipalComponentsRequired = 0;
       this->GetOutput()->SetNumberOfComponentsPerPixel( theOutputDimension );
-
       break;
     }
     default: // should not go so far...
@@ -112,26 +111,21 @@ MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransf
           "Class should be templeted with FORWARD or INVERSE only...",
           ITK_LOCATION );
   }
-}
 
-template <class TInputImage, class TOutputImage,
-            class TNoiseImageFilter,
-            Transform::TransformDirection TDirectionOfTransformation >
-void
-MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransformation >
-::GenerateData ()
-{
+
   switch ( static_cast<int>(DirectionOfTransformation) )
-  {
-  case static_cast<int>(Transform::FORWARD):
-    return ForwardGenerateData();
-  case static_cast<int>(Transform::INVERSE):
-    return ReverseGenerateData();
-  default: // should not go so far
-    throw itk::ExceptionObject(__FILE__, __LINE__,
-                               "Class should be templated with FORWARD or INVERSE only...",
-                               ITK_LOCATION );
-  }
+    {
+    case static_cast<int>(Transform::FORWARD):
+    {
+    ForwardGenerateOutputInformation();
+    break;
+    }
+    case static_cast<int>(Transform::INVERSE):
+    {
+    ReverseGenerateOutputInformation();
+    break;
+    }
+    }
 }
 
 template <class TInputImage, class TOutputImage,
@@ -139,7 +133,7 @@ template <class TInputImage, class TOutputImage,
             Transform::TransformDirection TDirectionOfTransformation >
 void
 MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransformation >
-::ForwardGenerateData ()
+::ForwardGenerateOutputInformation()
 {
   typename InputImageType::Pointer inputImgPtr
     = const_cast<InputImageType*>( this->GetInput() );
@@ -157,10 +151,10 @@ MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransf
     m_Normalizer->SetUseStdDev( false );
 
   m_Normalizer->SetInput( inputImgPtr );
-  m_Normalizer->Update();
+  m_Normalizer->GetOutput()->UpdateOutputInformation();
 
   if ( !m_GivenMeanValues )
-    m_MeanValues = m_Normalizer->GetFunctor().GetMean();
+    m_MeanValues = m_Normalizer->GetCovarianceEstimator()->GetMean();
 
   if ( m_UseNormalization )
   {
@@ -213,11 +207,6 @@ MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransf
 
   m_Transformer->SetInput( m_Normalizer->GetOutput() );
   m_Transformer->SetMatrix( m_TransformationMatrix.GetVnlMatrix() );
-  m_Transformer->GraftOutput( this->GetOutput() );
-  m_Transformer->Update();
-
-  this->GraftOutput( m_Transformer->GetOutput() );
-
 }
 
 template <class TInputImage, class TOutputImage,
@@ -225,9 +214,9 @@ template <class TInputImage, class TOutputImage,
             Transform::TransformDirection TDirectionOfTransformation >
 void
 MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransformation >
-::ReverseGenerateData ()
+::ReverseGenerateOutputInformation()
 {
-  if ( !m_GivenTransformationMatrix )
+ if ( !m_GivenTransformationMatrix )
   {
     if ( !m_GivenCovarianceMatrix )
     {
@@ -313,12 +302,55 @@ MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransf
       revMean[i] = - m_MeanValues[i];
     m_Normalizer->SetMean( revMean );
     m_Normalizer->SetUseStdDev( false );
-  }
+  }  
 
   m_Normalizer->SetInput( m_Transformer->GetOutput() );
+ 
+
+}
+
+
+template <class TInputImage, class TOutputImage,
+            class TNoiseImageFilter,
+            Transform::TransformDirection TDirectionOfTransformation >
+void
+MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransformation >
+::GenerateData ()
+{
+  switch ( static_cast<int>(DirectionOfTransformation) )
+  {
+  case static_cast<int>(Transform::FORWARD):
+    return ForwardGenerateData();
+  case static_cast<int>(Transform::INVERSE):
+    return ReverseGenerateData();
+  default: // should not go so far
+    throw itk::ExceptionObject(__FILE__, __LINE__,
+                               "Class should be templated with FORWARD or INVERSE only...",
+                               ITK_LOCATION );
+  }
+}
+
+template <class TInputImage, class TOutputImage,
+            class TNoiseImageFilter,
+            Transform::TransformDirection TDirectionOfTransformation >
+void
+MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransformation >
+::ForwardGenerateData ()
+{
+  m_Transformer->GraftOutput( this->GetOutput() );
+  m_Transformer->Update();
+  this->GraftOutput( m_Transformer->GetOutput() );
+}
+
+template <class TInputImage, class TOutputImage,
+            class TNoiseImageFilter,
+            Transform::TransformDirection TDirectionOfTransformation >
+void
+MNFImageFilter< TInputImage, TOutputImage, TNoiseImageFilter, TDirectionOfTransformation >
+::ReverseGenerateData ()
+{
   m_Normalizer->GraftOutput( this->GetOutput() );
   m_Normalizer->Update();
-
   this->GraftOutput( m_Normalizer->GetOutput() );
 }
 
-- 
GitLab