From b07eca54e48d108c8f70b75b1ec8ab62d0be013f Mon Sep 17 00:00:00 2001
From: Charles Peyrega <charles.peyrega@c-s.fr>
Date: Thu, 21 Mar 2013 15:29:56 +0100
Subject: [PATCH] ENH: Modification of the template of the
 ConfusionMatrixToMassOfBelief class and its corresponding tests

---
 Code/Fuzzy/otbConfusionMatrixToMassOfBelief.h |  98 +++++++++---
 .../otbConfusionMatrixToMassOfBelief.txx      |  54 ++++---
 Testing/Code/Fuzzy/CMakeLists.txt             |   9 +-
 .../otbConfusionMatrixToMassOfBeliefNew.cxx   |  41 -----
 .../otbConfusionMatrixToMassOfBeliefTest.cxx  | 146 +++++++++++-------
 .../otbConfusionMatrixMeasurementsTest.cxx    |  18 +--
 6 files changed, 212 insertions(+), 154 deletions(-)
 delete mode 100644 Testing/Code/Fuzzy/otbConfusionMatrixToMassOfBeliefNew.cxx

diff --git a/Code/Fuzzy/otbConfusionMatrixToMassOfBelief.h b/Code/Fuzzy/otbConfusionMatrixToMassOfBelief.h
index 9ddb9f51a4..2caf4ef05b 100644
--- a/Code/Fuzzy/otbConfusionMatrixToMassOfBelief.h
+++ b/Code/Fuzzy/otbConfusionMatrixToMassOfBelief.h
@@ -23,8 +23,9 @@
 // gets integrated into the main directories.
 #include "itkConfigure.h"
 
-#include "itkListSample.h"
-#include "otbConfusionMatrixCalculator.h"
+#include "itkProcessObject.h"
+#include "itkVariableSizeMatrix.h"
+#include "otbConfusionMatrixMeasurements.h"
 
 
 namespace otb
@@ -35,50 +36,94 @@ namespace otb
  *  This class converts a confusion matrix into a std::map<ClassLabelType, MassType> with MassType being
  *  the type of the Mass of Belief of each label to be used in the Dempster-Shafer theory.
  *
- *  TConfusionMatrixCalculator is the type of the confusion matrix calculator
- *  which generates the confusion matrix from reference and classified samples.
+ *  TConfusionMatrix is the type of the confusion matrix from which the measurements will be computed.
  *  N.B.: The confusion matrix indices are expected to be organized the following way:
  *  confusionMatrix[itReference][itClassified], with itClassified the indice
  *  over the columns representing the classified labels compared to the reference
  *  labels (i.e. the reference truth) organized over the lines of the confusion matrix.
  *
  *  The MassOfBeliefDefinitionMethod indicates which parameter of the confusion matrix will
- *  stand for the mass of belief of each label.
+ *  stand for the mass of belief of each label (PRECISION, RECALL, ACCURACY, KAPPA).
  *
  */
 
-template < class TConfusionMatrixCalculator >
-class ITK_EXPORT ConfusionMatrixToMassOfBelief : public itk::DataObject
+template <class TConfusionMatrix = itk::VariableSizeMatrix<double> >
+class ITK_EXPORT ConfusionMatrixToMassOfBelief :
+  public itk::ProcessObject
 {
 public:
   /** Standard class typedefs */
-  typedef ConfusionMatrixToMassOfBelief          Self;
-  typedef itk::DataObject                        Superclass;
-  typedef itk::SmartPointer<Self>                Pointer;
-  typedef itk::SmartPointer<const Self>          ConstPointer;
-  
+  typedef ConfusionMatrixToMassOfBelief             Self;
+  typedef itk::ProcessObject                        Superclass;
+  typedef itk::SmartPointer<Self>                   Pointer;
+  typedef itk::SmartPointer<const Self>             ConstPointer;
+
+  /** Run-time type information (and related methods). */
+  itkTypeMacro(ConfusionMatrixToMassOfBelief, itk::ProcessObject);
+
   /** Method for creation through the object factory. */
   itkNewMacro(Self);
-  
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(ConfusionMatrixToMassOfBelief, DataObject);
 
-  typedef TConfusionMatrixCalculator                            ConfusionMatrixCalculatorType;
-  typedef typename TConfusionMatrixCalculator::Pointer          ConfusionMatrixCalculatorPointerType;
-  typedef typename TConfusionMatrixCalculator::ClassLabelType   ClassLabelType;
-  typedef std::map<int, ClassLabelType>                         MapOfIndicesType;
 
-  typedef double                                                MassType;
-  typedef std::map<ClassLabelType, MassType>                    SingleClassLabelMassMapType;
+  /** Type for the confusion matrix */
+  typedef TConfusionMatrix                                               ConfusionMatrixType;
 
-  enum MassOfBeliefDefinitionMethod {PRECISION, RECALL};
+  /** Type for the confusion matrix measurements calculator*/
+  typedef otb::ConfusionMatrixMeasurements<ConfusionMatrixType>          ConfusionMatrixMeasurementsType;
+  typedef typename ConfusionMatrixMeasurementsType::ClassLabelType       ClassLabelType;
+  typedef typename ConfusionMatrixMeasurementsType::MapOfClassesType     MapOfClassesType;
+  typedef typename ConfusionMatrixMeasurementsType::MapOfIndicesType     MapOfIndicesType;
+
+  typedef double                                                         MassType;
+  typedef std::map<ClassLabelType, MassType>                             SingleClassLabelMassMapType;
+
+  enum MassOfBeliefDefinitionMethod {PRECISION, RECALL, ACCURACY, KAPPA};
 
   virtual void Update();
 
   /** Accessors */
-  itkSetMacro(ConfusionMatrixCalculator, ConfusionMatrixCalculatorPointerType);
+  itkSetMacro(ConfusionMatrix, ConfusionMatrixType);
   itkSetMacro(DefinitionMethod, MassOfBeliefDefinitionMethod);
 
+  /* Gives the correspondence between a class label
+   * and its index in the confusion matrix
+   */
+  virtual void SetMapOfClasses(const MapOfClassesType _arg)
+  {
+    m_MapOfClasses = _arg;
+    typename MapOfClassesType::iterator itMapOfClasses;
+    m_MapOfIndices.clear();
+    for (itMapOfClasses = m_MapOfClasses.begin(); itMapOfClasses != m_MapOfClasses.end(); ++itMapOfClasses)
+      {
+      m_MapOfIndices[itMapOfClasses->second] = itMapOfClasses->first;
+      }
+  }
+
+  MapOfClassesType GetMapOfClasses() const
+  {
+    return m_MapOfClasses;
+  }
+
+  /* Gives the correspondence between an index in the
+   * confusion matrix and the class label
+   */
+  virtual void SetMapOfIndices(const MapOfIndicesType _arg)
+  {
+    m_MapOfIndices = _arg;
+    typename MapOfIndicesType::iterator itMapOfIndices;
+    m_MapOfClasses.clear();
+    for (itMapOfIndices = m_MapOfIndices.begin(); itMapOfIndices != m_MapOfIndices.end(); ++itMapOfIndices)
+      {
+      m_MapOfClasses[itMapOfIndices->second] = itMapOfIndices->first;
+      }
+  }
+
+  MapOfIndicesType GetMapOfIndices() const
+  {
+    return m_MapOfIndices;
+  }
+
+
   SingleClassLabelMassMapType GetMapMassOfBelief() const
   {
     return m_MapMassOfBelief;
@@ -99,7 +144,12 @@ private:
   ConfusionMatrixToMassOfBelief(const Self&); //purposely not implemented
   void operator=(const Self&); //purposely not implemented
 
-  ConfusionMatrixCalculatorPointerType m_ConfusionMatrixCalculator;
+  ConfusionMatrixType m_ConfusionMatrix;
+  typename ConfusionMatrixMeasurementsType::Pointer m_ConfMatMeasurements;
+
+  MapOfClassesType m_MapOfClasses;
+  MapOfIndicesType m_MapOfIndices;
+
   MassOfBeliefDefinitionMethod m_DefinitionMethod;
   SingleClassLabelMassMapType m_MapMassOfBelief;
 };
diff --git a/Code/Fuzzy/otbConfusionMatrixToMassOfBelief.txx b/Code/Fuzzy/otbConfusionMatrixToMassOfBelief.txx
index 9393c1edfd..1122c4bf48 100644
--- a/Code/Fuzzy/otbConfusionMatrixToMassOfBelief.txx
+++ b/Code/Fuzzy/otbConfusionMatrixToMassOfBelief.txx
@@ -27,8 +27,10 @@ template<class TConfusionMatrix>
 ConfusionMatrixToMassOfBelief<TConfusionMatrix>
 ::ConfusionMatrixToMassOfBelief()
 {
-  m_ConfusionMatrixCalculator = ConfusionMatrixCalculatorType::New();
-  m_DefinitionMethod = this->PRECISION;
+  this->SetNumberOfRequiredInputs(2);
+  this->SetNumberOfRequiredOutputs(1);
+  this->m_ConfMatMeasurements = ConfusionMatrixMeasurementsType::New();
+  this->m_DefinitionMethod = this->PRECISION;
 }
 
 template <class TConfusionMatrix>
@@ -44,27 +46,41 @@ void
 ConfusionMatrixToMassOfBelief<TConfusionMatrix>
 ::GenerateData()
 {
-  MapOfIndicesType mapOfIndices = m_ConfusionMatrixCalculator->GetMapOfIndices();
+  this->m_ConfMatMeasurements->SetConfusionMatrix(m_ConfusionMatrix);
+  this->m_ConfMatMeasurements->Update();
+
   typename MapOfIndicesType::iterator itMapOfIndices;
 
-  MassType currentMass = 0;
-  for (itMapOfIndices = mapOfIndices.begin(); itMapOfIndices != mapOfIndices.end(); ++itMapOfIndices)
+  MassType currentMass = 0.;
+  this->m_MapMassOfBelief.clear();
+  for (itMapOfIndices = m_MapOfIndices.begin(); itMapOfIndices != m_MapOfIndices.end(); ++itMapOfIndices)
     {
-    // Masses of Belief = Precision Rate of each label (TP/[TP + FP])
-    if (m_DefinitionMethod == this->PRECISION)
-      {
-      currentMass = m_ConfusionMatrixCalculator->GetPrecisions()[itMapOfIndices->first];
-      }
-    else
+    switch (m_DefinitionMethod)
       {
-      // Masses of Belief = Recall Rate of each label (TP/[TP + FN])
-      if (m_DefinitionMethod == this->RECALL)
-        {
-        currentMass = m_ConfusionMatrixCalculator->GetRecalls()[itMapOfIndices->first];
-        }
-      }
-
-    m_MapMassOfBelief[itMapOfIndices->second] = currentMass;
+      case PRECISION:
+        // Masses of Belief = Precision Rate of each label (TP / [TP + FP])
+        currentMass = m_ConfMatMeasurements->GetPrecisions()[itMapOfIndices->first];
+        break;
+      case RECALL:
+        // Masses of Belief = Recall Rate of each label (TP / [TP + FN])
+        currentMass = m_ConfMatMeasurements->GetRecalls()[itMapOfIndices->first];
+        break;
+      case ACCURACY:
+        // Masses of Belief = Overall Accuracy of the confusion matrix (SUM[TP] / nbSamples)
+        currentMass = m_ConfMatMeasurements->GetOverallAccuracy();
+        break;
+      case KAPPA:
+        // Masses of Belief = Kappa Index of the confusion matrix
+        currentMass = m_ConfMatMeasurements->GetKappaIndex();
+        break;
+
+      default:
+        // Masses of Belief = Precision Rate of each label (TP / [TP + FP]
+        currentMass = m_ConfMatMeasurements->GetPrecisions()[itMapOfIndices->first];
+        break;
+      }// END switch (m_DefinitionMethod)
+
+    this->m_MapMassOfBelief[itMapOfIndices->second] = currentMass;
     }
 }
 } // end namespace otb
diff --git a/Testing/Code/Fuzzy/CMakeLists.txt b/Testing/Code/Fuzzy/CMakeLists.txt
index a601265df4..2659108007 100644
--- a/Testing/Code/Fuzzy/CMakeLists.txt
+++ b/Testing/Code/Fuzzy/CMakeLists.txt
@@ -155,6 +155,14 @@ ADD_TEST(fzTvConfusionMatrixToMassOfBeliefTestPrecision ${Fuzzy_TESTS3}
 ADD_TEST(fzTvConfusionMatrixToMassOfBeliefTestRecall ${Fuzzy_TESTS3}
   otbConfusionMatrixToMassOfBeliefTest
  RECALL)
+   
+ADD_TEST(fzTvConfusionMatrixToMassOfBeliefTestAccuracy ${Fuzzy_TESTS3}
+  otbConfusionMatrixToMassOfBeliefTest
+ ACCURACY)
+   
+ADD_TEST(fzTvConfusionMatrixToMassOfBeliefTestKappa ${Fuzzy_TESTS3}
+  otbConfusionMatrixToMassOfBeliefTest
+ KAPPA)
 
 
 
@@ -182,7 +190,6 @@ otbStandardDSCostFunction.cxx
 SET(BasicFuzzy_SRCS3
 otbFuzzyTests3.cxx
 otbDempsterShaferFusionTests.cxx
-otbConfusionMatrixToMassOfBeliefNew.cxx
 otbConfusionMatrixToMassOfBeliefTest.cxx
 )
 
diff --git a/Testing/Code/Fuzzy/otbConfusionMatrixToMassOfBeliefNew.cxx b/Testing/Code/Fuzzy/otbConfusionMatrixToMassOfBeliefNew.cxx
deleted file mode 100644
index d9e1288004..0000000000
--- a/Testing/Code/Fuzzy/otbConfusionMatrixToMassOfBeliefNew.cxx
+++ /dev/null
@@ -1,41 +0,0 @@
-/*=========================================================================
-
- Program:   ORFEO Toolbox
- Language:  C++
- Date:      $Date$
- Version:   $Revision$
-
-
- Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
- See OTBCopyright.txt for details.
-
-
- This software is distributed WITHOUT ANY WARRANTY; without even
- the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- PURPOSE.  See the above copyright notices for more information.
-
- =========================================================================*/
-#include "itkMacro.h"
-#include <iostream>
-
-#include "otbConfusionMatrixToMassOfBelief.h"
-
-int otbConfusionMatrixToMassOfBeliefNew(int argc, char* argv[])
-{
-  typedef unsigned int LabelType;
-  typedef itk::VariableLengthVector<LabelType> RefLabelType;
-  typedef itk::Statistics::ListSample<RefLabelType> RefListLabelType;
-  typedef itk::VariableLengthVector<LabelType> ProdLabelType;
-  typedef itk::Statistics::ListSample<ProdLabelType> ProdListLabelType;
-  typedef otb::ConfusionMatrixCalculator<RefListLabelType, ProdListLabelType> ConfusionMatrixCalculatorType;
-
-  // filter type
-  typedef otb::ConfusionMatrixToMassOfBelief<ConfusionMatrixCalculatorType> ConfusionMatrixToMassOfBeliefType;
-
-  // filter
-  ConfusionMatrixToMassOfBeliefType::Pointer ConfMatToMOB = ConfusionMatrixToMassOfBeliefType::New();
-
-  std::cout<<ConfMatToMOB<<std::endl;
-
-  return EXIT_SUCCESS;
-}
diff --git a/Testing/Code/Fuzzy/otbConfusionMatrixToMassOfBeliefTest.cxx b/Testing/Code/Fuzzy/otbConfusionMatrixToMassOfBeliefTest.cxx
index 463535f98c..97acdb5ca9 100644
--- a/Testing/Code/Fuzzy/otbConfusionMatrixToMassOfBeliefTest.cxx
+++ b/Testing/Code/Fuzzy/otbConfusionMatrixToMassOfBeliefTest.cxx
@@ -20,73 +20,48 @@
 
 #include "otbConfusionMatrixToMassOfBelief.h"
 
-int otbConfusionMatrixToMassOfBeliefTest(int argc, char* argv[])
+int otbConfusionMatrixToMassOfBeliefNew(int argc, char* argv[])
 {
-  // Filling the Confusion Matrix
-  typedef unsigned int LabelType;
-  typedef itk::FixedArray<LabelType, 1> RLabelType;
-  typedef itk::Statistics::ListSample<RLabelType> RListLabelType;
-  typedef itk::FixedArray<LabelType, 1> PLabelType;
-  typedef itk::Statistics::ListSample<PLabelType> PListLabelType;
-  typedef otb::ConfusionMatrixCalculator<RListLabelType, PListLabelType> ConfusionMatrixCalculatorType;
-
-  //Filling the Confusion Matrix from samples
-  ConfusionMatrixCalculatorType::Pointer confusionMatrixCalculator = ConfusionMatrixCalculatorType::New();
-
-  RListLabelType::Pointer refLabels = RListLabelType::New();
-  PListLabelType::Pointer prodLabels = PListLabelType::New();
-
-  RListLabelType::Iterator itRefLabels;
-  PListLabelType::Iterator itProdLabels;
-
-  int nbSamples = 12;
-  int nbClasses = 4;
-
-  // Reference samples: 1 2 3 4 1 2 3 4 1 2 3 4
-  // Classified reference samples: 1 3 3 4 4 2 3 4 4 4 4 3
-  std::vector<LabelType> labelsClassified;
-  labelsClassified.push_back(1);
-  labelsClassified.push_back(3);
-  labelsClassified.push_back(3);
-  labelsClassified.push_back(4);
-  labelsClassified.push_back(4);
-  labelsClassified.push_back(2);
-  labelsClassified.push_back(3);
-  labelsClassified.push_back(4);
-  labelsClassified.push_back(4);
-  labelsClassified.push_back(4);
-  labelsClassified.push_back(4);
-  labelsClassified.push_back(3);
-
-  for (int i = 0; i < nbSamples; ++i)
-    {
-    int label = (i % nbClasses) + 1;
-    refLabels->PushBack(label);
-    prodLabels->PushBack(labelsClassified[i]);
-    }
+  typedef itk::VariableSizeMatrix<double> ConfusionMatrixType;
 
-  int k = 0;
-  for (itRefLabels = refLabels->Begin(), itProdLabels = prodLabels->Begin(); itRefLabels != refLabels->End(); ++itRefLabels, ++itProdLabels)
-    {
-    std::cout << "refLabels[" << k << "] = " << itRefLabels.GetMeasurementVector()[0] << "; prodLabels[" << k << "] = "
-        << itProdLabels.GetMeasurementVector()[0] << std::endl;
-    ++k;
-    }
+  // filter type
+  typedef otb::ConfusionMatrixToMassOfBelief<ConfusionMatrixType> ConfusionMatrixToMassOfBeliefType;
 
-  confusionMatrixCalculator->SetReferenceLabels(refLabels);
-  confusionMatrixCalculator->SetProducedLabels(prodLabels);
-  confusionMatrixCalculator->Update();
+  // filter
+  ConfusionMatrixToMassOfBeliefType::Pointer confMatToMOB = ConfusionMatrixToMassOfBeliefType::New();
+  std::cout << confMatToMOB << std::endl;
 
-  ConfusionMatrixCalculatorType::ConfusionMatrixType confusionMatrix = confusionMatrixCalculator->GetConfusionMatrix();
-  std::cout << std::endl;
-  std::cout << "confusion matrix" << std::endl << confusionMatrix << std::endl;
+  return EXIT_SUCCESS;
+}
 
 
-  // Converting the Confusion Matrix into a std::map<ClassLabelType, MassType> of Masses of Belief for each label
-  typedef otb::ConfusionMatrixToMassOfBelief<ConfusionMatrixCalculatorType> ConfusionMatrixToMassOfBeliefType;
+int otbConfusionMatrixToMassOfBeliefTest(int argc, char* argv[])
+{
+  typedef itk::VariableSizeMatrix<double> ConfusionMatrixType;
+
+  // filter type
+  typedef otb::ConfusionMatrixToMassOfBelief<ConfusionMatrixType> ConfusionMatrixToMassOfBeliefType;
+  typedef ConfusionMatrixToMassOfBeliefType::MapOfClassesType MapOfClassesType;
   typedef ConfusionMatrixToMassOfBeliefType::MassOfBeliefDefinitionMethod MassOfBeliefDefinitionMethod;
   typedef ConfusionMatrixToMassOfBeliefType::SingleClassLabelMassMapType SingleClassLabelMassMapType;
 
+  // mapOfClasses[label] = index in the rows/columns of the confusion matrix
+  MapOfClassesType mapOfClasses;
+  mapOfClasses[1] = 0;
+  mapOfClasses[2] = 1;
+  mapOfClasses[3] = 2;
+  mapOfClasses[4] = 3;
+
+  unsigned int nbClasses = mapOfClasses.size();
+  ConfusionMatrixType confMat = ConfusionMatrixType(nbClasses, nbClasses);
+  confMat(0, 0) = 1, confMat(0, 1) = 0, confMat(0, 2) = 0, confMat(0, 3) = 2;
+  confMat(1, 0) = 0, confMat(1, 1) = 1, confMat(1, 2) = 1, confMat(1, 3) = 1;
+  confMat(2, 0) = 0, confMat(2, 1) = 0, confMat(2, 2) = 2, confMat(2, 3) = 1;
+  confMat(3, 0) = 0, confMat(3, 1) = 0, confMat(3, 2) = 1, confMat(3, 3) = 2;
+  std::cout << "confusion matrix = " << std::endl << confMat << std::endl;
+
+
+  // Converting the Confusion Matrix into a std::map<ClassLabelType, MassType> of Masses of Belief for each label
   ConfusionMatrixToMassOfBeliefType::Pointer confMatToMass = ConfusionMatrixToMassOfBeliefType::New();
   MassOfBeliefDefinitionMethod massOfBeliefDefMethod;
 
@@ -101,9 +76,24 @@ int otbConfusionMatrixToMassOfBeliefTest(int argc, char* argv[])
       {
       massOfBeliefDefMethod = ConfusionMatrixToMassOfBeliefType::RECALL;
       }
+    else
+      {
+      if (massOfBeliefDefMethodStr.compare("ACCURACY") == 0)
+        {
+        massOfBeliefDefMethod = ConfusionMatrixToMassOfBeliefType::ACCURACY;
+        }
+      else
+        {
+        if (massOfBeliefDefMethodStr.compare("KAPPA") == 0)
+          {
+          massOfBeliefDefMethod = ConfusionMatrixToMassOfBeliefType::KAPPA;
+          }
+        }
+      }
     }
 
-  confMatToMass->SetConfusionMatrixCalculator(confusionMatrixCalculator);
+  confMatToMass->SetConfusionMatrix(confMat);
+  confMatToMass->SetMapOfClasses(mapOfClasses);
   confMatToMass->SetDefinitionMethod(massOfBeliefDefMethod);
   confMatToMass->Update();
   SingleClassLabelMassMapType mapMOB = confMatToMass->GetMapMassOfBelief();
@@ -119,7 +109,7 @@ int otbConfusionMatrixToMassOfBeliefTest(int argc, char* argv[])
   // Baselines for the different measurements
   //******************************************
 
-  SingleClassLabelMassMapType mapMOBBLPrecision, mapMOBBLRecall;
+  SingleClassLabelMassMapType mapMOBBLPrecision, mapMOBBLRecall, mapMOBBLAccuracy, mapMOBBLKappa;
   SingleClassLabelMassMapType::iterator itMapMOBBL;
 
   mapMOBBLPrecision[1] = 1;
@@ -132,6 +122,16 @@ int otbConfusionMatrixToMassOfBeliefTest(int argc, char* argv[])
   mapMOBBLRecall[3] = 2.0 / 3.0;
   mapMOBBLRecall[4] = 2.0 / 3.0;
 
+  mapMOBBLAccuracy[1] = 1.0 / 2.0;
+  mapMOBBLAccuracy[2] = 1.0 / 2.0;
+  mapMOBBLAccuracy[3] = 1.0 / 2.0;
+  mapMOBBLAccuracy[4] = 1.0 / 2.0;
+
+  mapMOBBLKappa[1] = 1.0 / 3.0;
+  mapMOBBLKappa[2] = 1.0 / 3.0;
+  mapMOBBLKappa[3] = 1.0 / 3.0;
+  mapMOBBLKappa[4] = 1.0 / 3.0;
+
   if ((mapMOB != mapMOBBLPrecision) && (massOfBeliefDefMethodStr.compare("PRECISION") == 0))
     {
     std::cout << std::endl;
@@ -158,5 +158,31 @@ int otbConfusionMatrixToMassOfBeliefTest(int argc, char* argv[])
     return EXIT_FAILURE;
     }
 
+  if ((mapMOB != mapMOBBLAccuracy) && (massOfBeliefDefMethodStr.compare("ACCURACY") == 0))
+      {
+      std::cout << std::endl;
+      std::cout << "ERROR in Map Mass of Belief Accuracy" << std::endl;
+      for (itMapMOBBL = mapMOBBLAccuracy.begin(), itMapMOB = mapMOB.begin();
+          itMapMOBBL != mapMOBBLAccuracy.end(); ++itMapMOBBL, ++itMapMOB)
+        {
+        std::cout << "mapMOBBLAccuracy[" << itMapMOBBL->first << "] = " << itMapMOBBL->second << "; ";
+        std::cout << "mapMOB[" << itMapMOB->first << "] = " << itMapMOB->second << std::endl;
+        }
+      return EXIT_FAILURE;
+      }
+
+  if ((mapMOB != mapMOBBLKappa) && (massOfBeliefDefMethodStr.compare("KAPPA") == 0))
+      {
+      std::cout << std::endl;
+      std::cout << "ERROR in Map Mass of Belief Kappa" << std::endl;
+      for (itMapMOBBL = mapMOBBLKappa.begin(), itMapMOB = mapMOB.begin();
+          itMapMOBBL != mapMOBBLKappa.end(); ++itMapMOBBL, ++itMapMOB)
+        {
+        std::cout << "mapMOBBLKappa[" << itMapMOBBL->first << "] = " << itMapMOBBL->second << "; ";
+        std::cout << "mapMOB[" << itMapMOB->first << "] = " << itMapMOB->second << std::endl;
+        }
+      return EXIT_FAILURE;
+      }
+
   return EXIT_SUCCESS;
 }
diff --git a/Testing/Code/Learning/otbConfusionMatrixMeasurementsTest.cxx b/Testing/Code/Learning/otbConfusionMatrixMeasurementsTest.cxx
index 180609dc32..333293b2b2 100644
--- a/Testing/Code/Learning/otbConfusionMatrixMeasurementsTest.cxx
+++ b/Testing/Code/Learning/otbConfusionMatrixMeasurementsTest.cxx
@@ -28,8 +28,8 @@ int otbConfusionMatrixMeasurementsNew(int argc, char* argv[])
   typedef otb::ConfusionMatrixMeasurements<ConfusionMatrixType> ConfusionMatrixMeasurementsType;
 
   // filter
-  ConfusionMatrixMeasurementsType::Pointer ConfMatMeasurements = ConfusionMatrixMeasurementsType::New();
-  std::cout << ConfMatMeasurements << std::endl;
+  ConfusionMatrixMeasurementsType::Pointer confMatMeasurements = ConfusionMatrixMeasurementsType::New();
+  std::cout << confMatMeasurements << std::endl;
 
   return EXIT_SUCCESS;
 }
@@ -54,18 +54,18 @@ int otbConfusionMatrixMeasurementsTest(int argc, char* argv[])
   mapOfClasses[4] = 3;
 
   unsigned int nbClasses = mapOfClasses.size();
-  ConfusionMatrixType ConfMat = ConfusionMatrixType(nbClasses, nbClasses);
-  ConfMat(0, 0) = 1, ConfMat(0, 1) = 0, ConfMat(0, 2) = 0, ConfMat(0, 3) = 2;
-  ConfMat(1, 0) = 0, ConfMat(1, 1) = 1, ConfMat(1, 2) = 1, ConfMat(1, 3) = 1;
-  ConfMat(2, 0) = 0, ConfMat(2, 1) = 0, ConfMat(2, 2) = 2, ConfMat(2, 3) = 1;
-  ConfMat(3, 0) = 0, ConfMat(3, 1) = 0, ConfMat(3, 2) = 1, ConfMat(3, 3) = 2;
-  std::cout << "confusion matrix = " << std::endl << ConfMat << std::endl;
+  ConfusionMatrixType confMat = ConfusionMatrixType(nbClasses, nbClasses);
+  confMat(0, 0) = 1, confMat(0, 1) = 0, confMat(0, 2) = 0, confMat(0, 3) = 2;
+  confMat(1, 0) = 0, confMat(1, 1) = 1, confMat(1, 2) = 1, confMat(1, 3) = 1;
+  confMat(2, 0) = 0, confMat(2, 1) = 0, confMat(2, 2) = 2, confMat(2, 3) = 1;
+  confMat(3, 0) = 0, confMat(3, 1) = 0, confMat(3, 2) = 1, confMat(3, 3) = 2;
+  std::cout << "confusion matrix = " << std::endl << confMat << std::endl;
 
   // filter
   ConfusionMatrixMeasurementsType::Pointer confMatMeasurements = ConfusionMatrixMeasurementsType::New();
 
   confMatMeasurements->SetMapOfClasses(mapOfClasses);
-  confMatMeasurements->SetConfusionMatrix(ConfMat);
+  confMatMeasurements->SetConfusionMatrix(confMat);
   confMatMeasurements->Update();
 
   // mapOfIndices[index] = label associated to the rows/columns of the confusion matrix
-- 
GitLab