diff --git a/multiview_platform/MonoMultiViewClassifiers/ExecClassif.py b/multiview_platform/MonoMultiViewClassifiers/ExecClassif.py
index 642acfd1baa3ffdea31a26bec42bef6b5aadf448..700c6ccedc8da4115242e5d8c75db5da75ab623f 100644
--- a/multiview_platform/MonoMultiViewClassifiers/ExecClassif.py
+++ b/multiview_platform/MonoMultiViewClassifiers/ExecClassif.py
@@ -139,15 +139,7 @@ def arangeMetrics(metrics, metricPrinc):
         raise AttributeError(metricPrinc + " not in metric pool")
     return metrics
 
-
-def execOneBenchmark(coreIndex=-1, LABELS_DICTIONARY=None, directory=None, classificationIndices=None, args=None,
-                     kFolds=None, randomState=None, hyperParamSearch=None, metrics=None, argumentDictionaries=None,
-                     benchmark=None, views=None, viewsIndices=None, flag=None, labels=None,
-                     ExecMonoview_multicore=ExecMonoview_multicore, ExecMultiview_multicore=ExecMultiview_multicore,
-                     initMultiviewArguments=initMultiviewArguments):
-    """Used to run a benchmark using one core. ExecMonoview_multicore, initMultiviewArguments and
-     ExecMultiview_multicore args are only used for tests"""
-
+def benchmarkInit(directory, classificationIndices, labels, LABELS_DICTIONARY, kFolds):
     logging.debug("Start:\t Benchmark initialization")
     if not os.path.exists(os.path.dirname(directory + "train_labels.csv")):
         try:
@@ -158,10 +150,34 @@ def execOneBenchmark(coreIndex=-1, LABELS_DICTIONARY=None, directory=None, class
     trainIndices = classificationIndices[0]
     trainLabels = labels[trainIndices]
     np.savetxt(directory + "train_labels.csv", trainLabels, delimiter=",")
+    np.savetxt(directory + "train_indices.csv", classificationIndices[0], delimiter=",")
     resultsMonoview = []
+
+    folds = kFolds.split(np.arange(len(trainLabels)), trainLabels)
+    for foldIndex, (trainCVIndices, testCVIndices) in enumerate(folds):
+        fileName = directory+"/folds/test_labels_fold_"+str(foldIndex)+".csv"
+        if not os.path.exists(os.path.dirname(fileName)):
+            try:
+                os.makedirs(os.path.dirname(fileName))
+            except OSError as exc:
+                if exc.errno != errno.EEXIST:
+                    raise
+        np.savetxt(fileName, trainLabels[testCVIndices], delimiter=",")
     labelsNames = list(LABELS_DICTIONARY.values())
-    np.savetxt(directory + "train_indices.csv", classificationIndices[0], delimiter=",")
     logging.debug("Done:\t Benchmark initialization")
+    return resultsMonoview, labelsNames
+
+
+def execOneBenchmark(coreIndex=-1, LABELS_DICTIONARY=None, directory=None, classificationIndices=None, args=None,
+                     kFolds=None, randomState=None, hyperParamSearch=None, metrics=None, argumentDictionaries=None,
+                     benchmark=None, views=None, viewsIndices=None, flag=None, labels=None,
+                     ExecMonoview_multicore=ExecMonoview_multicore, ExecMultiview_multicore=ExecMultiview_multicore,
+                     initMultiviewArguments=initMultiviewArguments):
+    """Used to run a benchmark using one core. ExecMonoview_multicore, initMultiviewArguments and
+     ExecMultiview_multicore args are only used for tests"""
+
+    resultsMonoview, labelsNames = benchmarkInit(directory, classificationIndices, labels, LABELS_DICTIONARY, kFolds)
+
 
     logging.debug("Start:\t Monoview benchmark")
     resultsMonoview += [ExecMonoview_multicore(directory, args.name, labelsNames, classificationIndices, kFolds,
@@ -197,20 +213,7 @@ def execOneBenchmark_multicore(nbCores=-1, LABELS_DICTIONARY=None, directory=Non
     """Used to run a benchmark using multiple cores. ExecMonoview_multicore, initMultiviewArguments and
      ExecMultiview_multicore args are only used for tests"""
 
-    logging.debug("Start:\t Benchmark initialization")
-    if not os.path.exists(os.path.dirname(directory + "train_labels.csv")):
-        try:
-            os.makedirs(os.path.dirname(directory + "train_labels.csv"))
-        except OSError as exc:
-            if exc.errno != errno.EEXIST:
-                raise
-    trainIndices = classificationIndices[0]
-    trainLabels = labels[trainIndices]
-    np.savetxt(directory + "train_labels.csv", trainLabels, delimiter=",")
-    np.savetxt(directory + "train_indices.csv", classificationIndices[0], delimiter=",")
-    resultsMonoview = []
-    labelsNames = list(LABELS_DICTIONARY.values())
-    logging.debug("Done:\t Benchmark initialization")
+    resultsMonoview, labelsNames = benchmarkInit(directory, classificationIndices, labels, LABELS_DICTIONARY, kFolds)
 
     logging.debug("Start:\t Monoview benchmark")
     nbExperiments = len(argumentDictionaries["Monoview"])
@@ -252,20 +255,7 @@ def execOneBenchmarkMonoCore(DATASET=None, LABELS_DICTIONARY=None, directory=Non
                              ExecMonoview_multicore=ExecMonoview_multicore, ExecMultiview_multicore=ExecMultiview_multicore,
                              initMultiviewArguments=initMultiviewArguments):
 
-    logging.debug("Start:\t Benchmark initialization")
-    if not os.path.exists(os.path.dirname(directory + "train_labels.csv")):
-        try:
-            os.makedirs(os.path.dirname(directory + "train_labels.csv"))
-        except OSError as exc:
-            if exc.errno != errno.EEXIST:
-                raise
-    trainIndices = classificationIndices[0]
-    trainLabels = labels[trainIndices]
-    np.savetxt(directory + "train_labels.csv", trainLabels, delimiter=",")
-    resultsMonoview = []
-    labelsNames = list(LABELS_DICTIONARY.values())
-    np.savetxt(directory + "train_indices.csv", classificationIndices[0], delimiter=",")
-    logging.debug("Done:\t Benchmark initialization")
+    resultsMonoview, labelsNames = benchmarkInit(directory, classificationIndices, labels, LABELS_DICTIONARY, kFolds)
 
     logging.debug("Start:\t Monoview benchmark")
     for arguments in argumentDictionaries["Monoview"]:
diff --git a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/DisagreeFusion/DisagreeFusionModule.py b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/DisagreeFusion/DisagreeFusionModule.py
index 4c9af9ac56868b8fc71aa95a8ee44fabfa54e97f..ba1c96ad16a456eb2bc9e59a802cb47353325d3d 100644
--- a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/DisagreeFusion/DisagreeFusionModule.py
+++ b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/DisagreeFusion/DisagreeFusionModule.py
@@ -1,8 +1,6 @@
 import numpy as np
-import math
-import itertools
 
-from ...utils.Multiclass import isBiclass, genMulticlassMonoviewDecision
+from .. import diversity_utils
 
 
 def genName(config):
@@ -14,129 +12,30 @@ def getBenchmark(benchmark, args=None):
     return benchmark
 
 
-def getClassifiersDecisions(allClassifersNames, viewsIndices, resultsMonoview):
-    nbViews = len(viewsIndices)
-    nbClassifiers = len(allClassifersNames)
-    nbFolds = len(resultsMonoview[0][1][6])
-    foldsLen = len(resultsMonoview[0][1][6][0])
-    classifiersNames = [[] for _ in viewsIndices]
-    classifiersDecisions = np.zeros((nbViews, nbClassifiers, nbFolds, foldsLen))
-
-    for resultMonoview in resultsMonoview:
-        if resultMonoview[1][0] in classifiersNames[viewsIndices.index(resultMonoview[0])]:
-            pass
-        else:
-            classifiersNames[viewsIndices.index(resultMonoview[0])].append(resultMonoview[1][0])
-        classifierIndex = classifiersNames[viewsIndices.index(resultMonoview[0])].index(resultMonoview[1][0])
-        classifiersDecisions[viewsIndices.index(resultMonoview[0]), classifierIndex] = resultMonoview[1][6]
-    return classifiersDecisions, classifiersNames
-
-
-def disagree(allClassifersNames, viewsIndices, resultsMonoview):
-
-    classifiersDecisions, classifiersNames = getClassifiersDecisions(allClassifersNames, viewsIndices, resultsMonoview)
-
-    foldsLen = len(resultsMonoview[0][1][6][0])
-    nbViews = len(viewsIndices)
-    nbClassifiers = len(allClassifersNames)
-    combinations = itertools.combinations_with_replacement(range(nbClassifiers), nbViews)
-    nbCombinations = math.factorial(nbClassifiers+nbViews-1) / math.factorial(nbViews) / math.factorial(nbClassifiers-1)
-    disagreements = np.zeros(nbCombinations)
-    combis = np.zeros((nbCombinations, nbViews), dtype=int)
-
-    for combinationsIndex, combination in enumerate(combinations):
-        combis[combinationsIndex] = combination
-        combiWithView = [(viewIndex,combiIndex) for viewIndex, combiIndex in enumerate(combination)]
-        binomes = itertools.combinations(combiWithView, 2)
-        nbBinomes = math.factorial(nbViews) / 2 / math.factorial(nbViews-2)
-        disagreement = np.zeros(nbBinomes)
-        for binomeIndex, binome in enumerate(binomes):
-            (viewIndex1, classifierIndex1), (viewIndex2, classifierIndex2) = binome
-            nbDisagree = np.sum(np.logical_xor(classifiersDecisions[viewIndex1, classifierIndex1],
-                                               classifiersDecisions[viewIndex2, classifierIndex2])
-                                , axis=1)/float(foldsLen)
-            disagreement[binomeIndex] = np.mean(nbDisagree)
-        disagreements[combinationsIndex] = np.mean(disagreement)
-    bestCombiIndex = np.argmax(disagreements)
-    bestCombination = combis[bestCombiIndex]
-
-    return [classifiersNames[viewIndex][index] for viewIndex, index in enumerate(bestCombination)], disagreements[bestCombiIndex]
+def disagree(classifierDecision1, classifierDecision2, ground_truth):
+    return np.logical_xor(classifierDecision1, classifierDecision2)
 
 
 def getArgs(args, benchmark, views, viewsIndices, randomState, directory, resultsMonoview, classificationIndices):
-    monoviewClassifierModulesNames = benchmark["Monoview"]
-    classifiersNames, disagreement = disagree(monoviewClassifierModulesNames,
-                                        viewsIndices, resultsMonoview)
-    multiclass_preds = [monoviewResult[1][5] for monoviewResult in resultsMonoview]
-    if isBiclass(multiclass_preds):
-        monoviewDecisions = np.array([monoviewResult[1][3] for monoviewResult in resultsMonoview
-                                      if classifiersNames[viewsIndices.index(monoviewResult[0])] ==
-                                                          monoviewResult[1][0]])
-    else:
-        monoviewDecisions = np.array(
-            [genMulticlassMonoviewDecision(monoviewResult, classificationIndices) for monoviewResult in
-             resultsMonoview if classifiersNames[viewsIndices.index(monoviewResult[0])] == monoviewResult[1][0]])
-    argumentsList = []
-    arguments = {"CL_type": "DisagreeFusion",
-                 "views": views,
-                 "NB_VIEW": len(views),
-                 "viewsIndices": viewsIndices,
-                 "NB_CLASS": len(args.CL_classes),
-                 "LABELS_NAMES": args.CL_classes,
-                 "DisagreeFusionKWARGS": {
-                     "weights": args.DGF_weights,
-                     "classifiersNames": classifiersNames,
-                     "monoviewDecisions": monoviewDecisions,
-                     "nbCLass":len(args.CL_classes),
-                     "disagreement":disagreement
-                 }
-                 }
-    argumentsList.append(arguments)
-    return argumentsList
+    return diversity_utils.getArgs(args, benchmark, views, viewsIndices,
+                                   randomState, directory, resultsMonoview,
+                                   classificationIndices, disagree, "DisagreeFusion")
 
 
 def genParamsSets(classificationKWARGS, randomState, nIter=1):
-    """Used to generate parameters sets for the random hyper parameters optimization function"""
-    weights = [randomState.random_sample(len(classificationKWARGS["classifiersNames"])) for _ in range(nIter)]
-    nomralizedWeights = [[weightVector/np.sum(weightVector)] for weightVector in weights]
-    return nomralizedWeights
+    return diversity_utils.genParamsSets(classificationKWARGS, randomState, nIter=nIter)
+    # """Used to generate parameters sets for the random hyper parameters optimization function"""
+    # weights = [randomState.random_sample(len(classificationKWARGS["classifiersNames"])) for _ in range(nIter)]
+    # nomralizedWeights = [[weightVector/np.sum(weightVector)] for weightVector in weights]
+    # return nomralizedWeights
 
 
-class DisagreeFusionClass:
+class DisagreeFusionClass(diversity_utils.DiversityFusionClass):
 
     def __init__(self, randomState, NB_CORES=1, **kwargs):
-        if kwargs["weights"] == []:
-            self.weights = [1.0/len(["classifiersNames"]) for _ in range(len(["classifiersNames"]))]
-        else:
-            self.weights = np.array(kwargs["weights"])/np.sum(np.array(kwargs["weights"]))
-        self.monoviewDecisions = kwargs["monoviewDecisions"]
-        self.classifiersNames = kwargs["classifiersNames"]
-        self.nbClass = kwargs["nbCLass"]
-        self.disagreement = kwargs["disagreement"]
-
-    def setParams(self, paramsSet):
-        self.weights = paramsSet[0]
-
-    def fit_hdf5(self, DATASET, labels, trainIndices=None, viewsIndices=None, metric=["f1_score", None]):
-        pass
-
-    def predict_hdf5(self, DATASET, usedIndices=None, viewsIndices=None):
-        if usedIndices is None:
-            usedIndices = range(DATASET.get("Metadata").attrs["datasetLength"])
-        votes = np.zeros((len(usedIndices), self.nbClass), dtype=float)
-        for usedIndex, exampleIndex in enumerate(usedIndices):
-            for monoviewDecisionIndex, monoviewDecision in enumerate(self.monoviewDecisions):
-                votes[usedIndex, monoviewDecision[exampleIndex]] += self.weights[monoviewDecisionIndex]
-        predictedLabels = np.argmax(votes, axis=1)
-        return predictedLabels
-
-    def predict_probas_hdf5(self, DATASET, usedIndices=None):
-        pass
-
-    def getConfigString(self, classificationKWARGS):
-        return "weights : "+", ".join(map(str, list(self.weights)))
+        diversity_utils.DiversityFusionClass.__init__(self, randomState, NB_CORES=1, **kwargs)
 
     def getSpecificAnalysis(self, classificationKWARGS):
         stringAnalysis = "Classifiers used for each view : "+ ', '.join(self.classifiersNames)+\
-                         ', with a disagreement of '+str(self.disagreement)
+                         ', with a disagreement of '+str(self.div_measure)
         return stringAnalysis
diff --git a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusion.py b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusion.py
index 9f3d15f3bd4a271fc4bcbb6ca61bb322cd15be17..71f4a80a246c91c4918f6c0089300d1ef47f0e05 100644
--- a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusion.py
+++ b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/Fusion/Methods/LateFusion.py
@@ -73,66 +73,6 @@ def intersect(allClassifersNames, directory, viewsIndices, resultsMonoview, clas
     return [classifiersNames[viewIndex][index] for viewIndex, index in enumerate(bestCombination)]
 
 
-# def getClassifiersDecisions(allClassifersNames, viewsIndices, resultsMonoview):
-#     nbViews = len(viewsIndices)
-#     nbClassifiers = len(allClassifersNames)
-#     nbFolds = len(resultsMonoview[0][1][6])
-#     foldsLen = len(resultsMonoview[0][1][6][0])
-#     classifiersNames = [[] for _ in viewsIndices]
-#     classifiersDecisions = np.zeros((nbViews, nbClassifiers, nbFolds, foldsLen))
-#
-#     for resultMonoview in resultsMonoview:
-#         if resultMonoview[1][0] in classifiersNames[viewsIndices.index(resultMonoview[0])]:
-#             pass
-#         else:
-#             classifiersNames[viewsIndices.index(resultMonoview[0])].append(resultMonoview[1][0])
-#         classifierIndex = classifiersNames[viewsIndices.index(resultMonoview[0])].index(resultMonoview[1][0])
-#         classifiersDecisions[viewsIndices.index(resultMonoview[0]), classifierIndex] = resultMonoview[1][6]
-#     return classifiersDecisions, classifiersNames
-#
-#
-# def disagreement(allClassifersNames, directory, viewsIndices, resultsMonoview, classificationIndices):
-#
-#     classifiersDecisions, classifiersNames = getClassifiersDecisions(allClassifersNames, viewsIndices, resultsMonoview)
-#
-#     foldsLen = len(resultsMonoview[0][1][6][0])
-#     nbViews = len(viewsIndices)
-#     nbClassifiers = len(allClassifersNames)
-#     combinations = itertools.combinations_with_replacement(range(nbClassifiers), nbViews)
-#     nbCombinations = math.factorial(nbClassifiers+nbViews-1) / math.factorial(nbViews) / math.factorial(nbClassifiers-1)
-#     disagreements = np.zeros(nbCombinations)
-#     combis = np.zeros((nbCombinations, nbViews), dtype=int)
-#
-#     for combinationsIndex, combination in enumerate(combinations):
-#         combis[combinationsIndex] = combination
-#         combiWithView = [(viewIndex,combiIndex) for viewIndex, combiIndex in enumerate(combination)]
-#         binomes = itertools.combinations(combiWithView, 2)
-#         nbBinomes = math.factorial(nbViews) / 2 / math.factorial(nbViews-2)
-#         disagreement = np.zeros(nbBinomes)
-#         for binomeIndex, binome in enumerate(binomes):
-#             (viewIndex1, classifierIndex1), (viewIndex2, classifierIndex2) = binome
-#             nbDisagree = np.sum(np.logical_xor(classifiersDecisions[viewIndex1, classifierIndex1],
-#                                                classifiersDecisions[viewIndex2, classifierIndex2])
-#                                 , axis=1)/foldsLen
-#             disagreement[binomeIndex] = np.mean(nbDisagree)
-#         disagreements[combinationsIndex] = np.mean(disagreement)
-#     print(disagreements)
-#     bestCombiIndex = np.argmax(disagreements)
-#     bestCombination = combis[bestCombiIndex]
-#
-#     return [classifiersNames[viewIndex][index] for viewIndex, index in enumerate(bestCombination)]
-
-
-
-
-
-
-
-
-# def allMonoviewClassifiers(allClassifersNames, directory, viewsIndices, resultsMonoview, classificationIndices):
-#     return allClassifersNames
-
-
 def bestScore(allClassifersNames, directory, viewsIndices, resultsMonoview, classificationIndices):
     nbViews = len(viewsIndices)
     nbClassifiers = len(allClassifersNames)
diff --git a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/__init__.py b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/__init__.py
index 2f08d4c626a5f86381ca7217f6320107a4f9d53c..b11dddce3ff1a7ba59cf40c10043bc7a6878c973 100644
--- a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/__init__.py
+++ b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/__init__.py
@@ -1,5 +1,5 @@
 import os
-
+import diversity_utils
 for module in os.listdir(os.path.dirname(os.path.realpath(__file__))):
     if module == '__init__.py' or module[-3:] == '.py' or module[-4:] == '.pyc' or module == '__pycache__' :
         continue
diff --git a/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/diversity_utils.py b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/diversity_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..937549c86db03984669ae268ec3c3ece831d37b9
--- /dev/null
+++ b/multiview_platform/MonoMultiViewClassifiers/MultiviewClassifiers/diversity_utils.py
@@ -0,0 +1,145 @@
+import numpy as np
+import math
+import itertools
+import os
+
+from ..utils.Multiclass import isBiclass, genMulticlassMonoviewDecision
+
+
+def getClassifiersDecisions(allClassifersNames, viewsIndices, resultsMonoview):
+    nbViews = len(viewsIndices)
+    nbClassifiers = len(allClassifersNames)
+    nbFolds = len(resultsMonoview[0][1][6])
+    foldsLen = len(resultsMonoview[0][1][6][0])
+    classifiersNames = [[] for _ in viewsIndices]
+    classifiersDecisions = np.zeros((nbViews, nbClassifiers, nbFolds, foldsLen))
+
+    for resultMonoview in resultsMonoview:
+        if resultMonoview[1][0] in classifiersNames[viewsIndices.index(resultMonoview[0])]:
+            pass
+        else:
+            classifiersNames[viewsIndices.index(resultMonoview[0])].append(resultMonoview[1][0])
+        classifierIndex = classifiersNames[viewsIndices.index(resultMonoview[0])].index(resultMonoview[1][0])
+        classifiersDecisions[viewsIndices.index(resultMonoview[0]), classifierIndex] = resultMonoview[1][6]
+    return classifiersDecisions, classifiersNames
+
+
+def couple_div_measure(allClassifersNames, viewsIndices, resultsMonoview, measurement):
+
+    classifiersDecisions, classifiersNames = getClassifiersDecisions(allClassifersNames,
+                                                                                     viewsIndices,
+                                                                                     resultsMonoview)
+
+    foldsLen = len(resultsMonoview[0][1][6][0])
+    nbViews = len(viewsIndices)
+    nbClassifiers = len(allClassifersNames)
+    combinations = itertools.combinations_with_replacement(range(nbClassifiers), nbViews)
+    nbCombinations = math.factorial(nbClassifiers+nbViews-1) / math.factorial(nbViews) / math.factorial(nbClassifiers-1)
+    div_measure = np.zeros(nbCombinations)
+    combis = np.zeros((nbCombinations, nbViews), dtype=int)
+
+    for combinationsIndex, combination in enumerate(combinations):
+        combis[combinationsIndex] = combination
+        combiWithView = [(viewIndex,combiIndex) for viewIndex, combiIndex in enumerate(combination)]
+        binomes = itertools.combinations(combiWithView, 2)
+        nbBinomes = math.factorial(nbViews) / 2 / math.factorial(nbViews-2)
+        disagreement = np.zeros(nbBinomes)
+        for binomeIndex, binome in enumerate(binomes):
+            (viewIndex1, classifierIndex1), (viewIndex2, classifierIndex2) = binome
+            nbDisagree = np.sum(measurement(classifiersDecisions[viewIndex1, classifierIndex1],
+                                               classifiersDecisions[viewIndex2, classifierIndex2])
+                                , axis=1)/float(foldsLen)
+            disagreement[binomeIndex] = np.mean(nbDisagree)
+        div_measure[combinationsIndex] = np.mean(disagreement)
+    bestCombiIndex = np.argmax(div_measure)
+    bestCombination = combis[bestCombiIndex]
+
+    return [classifiersNames[viewIndex][index] for viewIndex, index in enumerate(bestCombination)], div_measure[bestCombiIndex]
+
+
+def getFoldsGroundTruth(directory):
+    foldsFilesNames = os.listdir(directory+"folds/")
+    folds
+    for fileName in os.listdir(directory+"folds/"):
+        foldIndex = int(fileName[-5])
+
+
+
+
+def getArgs(args, benchmark, views, viewsIndices, randomState,
+            directory, resultsMonoview, classificationIndices, measurement, name):
+    foldsGroundTruth = getFoldsGroundTruth(directory)
+    monoviewClassifierModulesNames = benchmark["Monoview"]
+    classifiersNames, div_measure = couple_div_measure(monoviewClassifierModulesNames,
+                                        viewsIndices, resultsMonoview, measurement)
+    multiclass_preds = [monoviewResult[1][5] for monoviewResult in resultsMonoview]
+    if isBiclass(multiclass_preds):
+        monoviewDecisions = np.array([monoviewResult[1][3] for monoviewResult in resultsMonoview
+                                      if classifiersNames[viewsIndices.index(monoviewResult[0])] ==
+                                                          monoviewResult[1][0]])
+    else:
+        monoviewDecisions = np.array(
+            [genMulticlassMonoviewDecision(monoviewResult, classificationIndices) for monoviewResult in
+             resultsMonoview if classifiersNames[viewsIndices.index(monoviewResult[0])] == monoviewResult[1][0]])
+    argumentsList = []
+    arguments = {"CL_type": name,
+                 "views": views,
+                 "NB_VIEW": len(views),
+                 "viewsIndices": viewsIndices,
+                 "NB_CLASS": len(args.CL_classes),
+                 "LABELS_NAMES": args.CL_classes,
+                 name+"KWARGS": {
+                     "weights": args.DGF_weights,
+                     "classifiersNames": classifiersNames,
+                     "monoviewDecisions": monoviewDecisions,
+                     "nbCLass":len(args.CL_classes),
+                     "div_measure":div_measure
+                 }
+                 }
+    argumentsList.append(arguments)
+    return argumentsList
+
+def genParamsSets(classificationKWARGS, randomState, nIter=1):
+    """Used to generate parameters sets for the random hyper parameters optimization function"""
+    weights = [randomState.random_sample(len(classificationKWARGS["classifiersNames"])) for _ in range(nIter)]
+    nomralizedWeights = [[weightVector/np.sum(weightVector)] for weightVector in weights]
+    return nomralizedWeights
+
+class DiversityFusionClass:
+
+    def __init__(self, randomState, NB_CORES=1, **kwargs):
+        if kwargs["weights"] == []:
+            self.weights = [1.0/len(kwargs["classifiersNames"]) for _ in range(len(kwargs["classifiersNames"]))]
+        else:
+            self.weights = np.array(kwargs["weights"])/np.sum(np.array(kwargs["weights"]))
+        self.monoviewDecisions = kwargs["monoviewDecisions"]
+        self.classifiersNames = kwargs["classifiersNames"]
+        self.nbClass = kwargs["nbCLass"]
+        self.div_measure = kwargs["div_measure"]
+
+    def setParams(self, paramsSet):
+        self.weights = paramsSet[0]
+
+    def fit_hdf5(self, DATASET, labels, trainIndices=None, viewsIndices=None, metric=["f1_score", None]):
+        pass
+
+    def predict_hdf5(self, DATASET, usedIndices=None, viewsIndices=None):
+        if usedIndices is None:
+            usedIndices = range(DATASET.get("Metadata").attrs["datasetLength"])
+        votes = np.zeros((len(usedIndices), self.nbClass), dtype=float)
+        for usedIndex, exampleIndex in enumerate(usedIndices):
+            for monoviewDecisionIndex, monoviewDecision in enumerate(self.monoviewDecisions):
+                votes[usedIndex, monoviewDecision[exampleIndex]] += self.weights[monoviewDecisionIndex]
+        predictedLabels = np.argmax(votes, axis=1)
+        return predictedLabels
+
+    def predict_probas_hdf5(self, DATASET, usedIndices=None):
+        pass
+
+    def getConfigString(self, classificationKWARGS):
+        return "weights : "+", ".join(map(str, list(self.weights)))
+
+    def getSpecificAnalysis(self, classificationKWARGS):
+        stringAnalysis = "Classifiers used for each view : " + ', '.join(self.classifiersNames)
+        return stringAnalysis
+