Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

69 refactor coclustering iv optimization algorithms #88

Merged

Conversation

marcboulle
Copy link
Collaborator

Fin du refactoring des algorithme de coclustering IV
Changements principaux

  • nouvelle hierarchie de classes KWDGValueSet, avec specialisation Symbol ou VarPart
  • simplification importante du code
  • prise en compte correcte des valeurs manquantes
  • nouveau format des rapport json, complet
  • mise en place de profiling
  • correction de la gestion des typivalites negatives
  • correction de problemes de dimensionnement dans le cas de tres nombreuses variables internes

Preparation à la nouvelle hierarchie de classes
- KWDGPartValues: classe ancetre
  - KWDGInterval
  - KWDGValueSet
    - KWDGSymbolValueSet
    - KWDGVarPartSet

Etape 1 de preparation
- nouvelle classe
  - KWDGPartValues
  - KWDGInterval herite de KWDGPartValues
- nouvelle classes temporaires
  - KWDGGenericValueSet
  - KWDGGenericValue
- nettoyage de KWValueSet
  - supression de la methode GetValueNumber
    - en partie redondante avec GetTRueValueNumber
    - peu utilisee
  - permet de ne garder que GetTrueValueNumber
    - pour unifier avec GetVarPartNumber, en une methode commune GetValueNumber
  - AddValue: incrementation de ValueNumber, sauf si StarValue
  - DeleteValue: decrementation de ValueNumber, sauf si StarValue
  - GetTrueValueNumber: renvoie toujours nValueNumber
  - KWDGPODiscretizer::InitializePartFrequencyVector: supression du parametrage inutile des ValueNumber
  - KWDataGridUnivariateCosts::ComputePartCost: amelioration des commentaires sur l'utilisation du nValueNumber

Rajout de override manquants dans les reimplementations de GetEmulated dans KWDataGridPostOptimizer

Rajout de KWTest dans la compilation, pour garder l'ensemble des sources compilables a tout momment
- ajout dans le CMakeLists.txt
- ajout d'un CMakeLists.txt dans le repertoire KWTest
- ExportGranularizedPartsForSymbolAttribute: mise a jour minimaliste pour que cette classe compile a nouveau
Corrections suites à quelques problème d'assertion, detectes apres lancement de LearningTest en mode debug
- KWDGValueSet::GetTrueValueNumber: tolerance avec ValueNumber a 1 dans le cas d'une partie par defaut
  sans valeurs autre que la StarValue
- KWDGValueSet::Check: assouplissement des controle dans le cas du groupe contenant la StarValue

Mise en place de la hierarchie
- KWDGValueSet
  - KWDGSymbolValueSet
- KWDGValue
  - KWDGSymbolValue

Propagation des impacts sur l'utilisation des nouvelles classes
- nombreux impacts
  - KWDataPreparation
    - KWAttributeSubsetStats
    - KWDataGrid
    - KWDataGridCosts
    - KWDataGridDeployment
    - KWDataGridMerger
    - KWDataGridPostOptimizer
  - MODL_Coclustering
    - CCCoclusteringBuilder
    - CCCoclusteringReport
    - CCHierarchicalDataGrid
    - CCLearningProblem

Hierarchie de classe KWDGSymbolValueSet et KWDGSymbolValue
- finalisation d'une premiere implementation complete
- gestion d'une partie par defaut dans la classe ancetre KWDGValueSet, pour uniformiser l'implementation
  - KWDGValueSet
    - IsDefaultPart
  - KWDGValue
    - IsDefaultValue
- version minimaliste de KWDGSymbolValueSet, qui ne contient plus que des methodes vraiment specifiques
Ratachement des classes KWDGVarPartSet et KWDGVarPartValue a leur nouvelle hierarchie
- KWDGValueSet
  - KWDGVarPartSet
- KWDGValue
  - KWDGVarPartValue

Propagation des impacts sur l'utilisation des nouvelles classes
- nombreux impacts
  - KWDataPreparation
    - KWDataGrid
    - KWDataGridCosts
    - KWDataGridManager
    - KWDataGridMerger
    - KWDataGridPostOptimizer
  - MODL_Coclustering
    - CCCoclusteringReport
    - CCHierarchicalDataGrid
    - CCLearningProblem

Ajustements:
- KWDGValueSet::GetValueNumber
  - reimplementation en une methdoe unique, mais legerement specialisee pour le cas des valeur du type Symbol (cas de la StarValue)
- KWDGValueSet::SortValues
  - definition d'une methode virtuelle, avec implementation dedie
    - SymbolValueSet: KWDGValueCompareDecreasingFrequency, effectif decroissant, puis valeur Symbol
    - VarPartSet: KWDGVarPartValueCompareAttributeNameAndVarPart: attribut, puis partie intervalle (KWDGPartContinuousCompare) ou valueSet (KWDGPartSymbolCompare)
  - necessaire, sinon bug suivant
    - cela ne s'arrete jamais sur LearningTest\TestCoclustering\y_CoclusteringIV_Standard\Iris
      - ce n'est pas une boucle infinir simple
      - CCVarPartDataGridPostOptimizer::PostOptimizeLightVarPartDataGrid trouve sans arret des ameliorations du cout
      - c'est du au tri par effectif puis par valeur, alors que cette précisement a besoin de trier uniquement par valeurs
  - a faire: refactorer la gestion des trus des parties et des valeurs, en distingautn les cas par valeur, et par valeur et effectif decroissant

Tests effectues
- LearningTest\TestCoclustering\y_CoclusteringIV_Standard en release
- LearningTest\TestCoclustering\y_CoclusteringIV_Standard\Iris en debug
…ues (Symbol and VarPart)

Refactoring des methodes de tri et comparaison:
- utilisation au maximum de methode Compare
  - variantes au nom explicite: ex: CompareValue vs CompareFrequency
  - exploitation des hierarchie d'heritage, avec reimplementation des methdoes Compare* virtuelle
- utilisation de methodes de tri au nom explicite, dans les container
  - base sur un nombre minimal de fonction KWDG*Compare, exploitant les methodes Compare et leur reimplementation

Methodes de comparaison
- KWDGPart
  - ComparePart: comparaison de partie, par intervalle croissant si numerique,
    par effectif decroissant puis ensemble de valeurs
  - ComparePartValues: comparaison de partie, par intervalle croissant si numerique, ensemble de valeur si groupe de valeurs
- KWDGPartValues
  - ComparePartValues: methode de comparaison virtuelle a reimplementer
    - dans KWDGInterval:comparaison de deux intervalles
    - dans KWDGValueSet: comparaison de deux ensemble de valeurs sur leur premiere valeur (Symbol ou VarPart selon type de KWDGValue)
- KWDGValue
  - CompareValue: methode virtuelle de comparaison par valeur
    - dans KWDGSymbolValue: valeur du Symbol
    - dans KWDGVarPartValue: attribut, puis ComparePartValues pour la partie
  - CompareFrequency: comparaison par valeur decroissante, puis par valeur

Methodes de tri
- KWDGAttribute
  - SortParts: tri des parties (base sur KWDGPartCompare)
  - KWDGPartCompareValues: fonction de comparaison utiles pour trier des tableaux de parties par valeurs
- KWDGValueSet
  - SortValues: tri des valeurs (base sur KWDGValueCompareValue)
  - SortValueByDecreasingFrequencies: tri des valeurs par effectrif decroissant (base sur KWDGValueCompareFrequency)
- CCHDGSymbolValueSet
  - SortValuesByTypicality (base sur CCHDGValueCompareDecreasingTypicality)

Supression des fonction de comparaison suivantes
- KWDGValueCompareDecreasingFrequency
- KWDGVarPartValueCompareAttributeNameAndVarPart
- KWDGPartSymbolCompareDecreasingFrequency
- KWDGPartVarPartCompareDecreasingFrequency
- KWDGPartContinuousCompare
- KWDGPartSymbolCompare
- KWDGPartVarPartCompare

Impacts
- KWDGPart::GetPartValues: acces generique aux PartValues (interval, valueSet...)
- KWDataGrid: toutes les methdoes concernees
- CCCoclusteringReport::WriteJSONInnerAttributePartition
- KWDataGridManager::BuildPartsOfContinuousAttributeFromFrequencyTable
- KWDataGridManager::CheckParts
- KWDataGridMerger::InitializeAllPartMerges

Résultats ok sur tout LearningTest\TestCoclustering\y_CoclusteringIV_Standard
Pas de probleme observe en debug
KWType
- GetSimpleCoclusteringType -> GetCoclusteringSimpleType
- IsCoclusteringGroupableType: nouvelle methode pour les type Symbol ou VarPart

KWDGPart
- KWDGPartValues* partValues: nouvel attribut de classe generique, remplacant les attributs precedents interval, symbolValueSet, varPartSet
- GetPartType: reimplementation simplifiee
- GetInterval, GetSymbolValueSet, GetVarPartSet: reimplementation des acces specififiques
- GetValueSet, GetPartValues: reimplementation des acces generiques

KWDGPartValues
- GetUsedMemory: nouvelle methodee generique reimplementee dans les sous-classes

KWDGValue
- GetUsedMemory: nouvelle methodee generique reimplementee dans les sous-classes

Etude preliminaire d'impact pour refactoring plus complet
- annotaion de tous les impacts potentiels par //DDDSIMPLIFY
…er methods

KWDGPartValues:
- methodes concernees
  - IsSubPartValues -> IsSubPart
  - CopyFrom
  - Import
  - UpgradeFrom
- remplementation directe dans les sous-classe KWDGInterval et KWDGValueSet
- supression des anciennes methodes specifiques, desormais inutiles
Globalement, au moins une trentaine d'impacts, permettant de traiter les cas des valeurs Symbol et VarPart
de facon unfiee, avec si besoin des cas particulier ponctuels seln le type de valeur traite

Classes imapcst principales ci-dessous, avec zoom sur certaines methodes:
- KWDGAttribute
  - starValuePart -> defaultPart: unification entre Symbol et VarPart
  - nkdVarPartSets: supprime, on reutilise nkdParts a la place, pour les types Symbol et VarPart
  - LookupGroupablePart: nouvelle methode pour un acces generique a une partie depuis une valeur generique KWDGValue
- KWDataGrid
- KWDataGridMerger
- KWDGPOGrouper
  - InitializeGroupIndexes
- KWDataGridUnivariateCosts
- KWDGMPartMergeAction
- KWDGValueSet
  - SetValueNumber: nouvelle methode dans l'implementation pour modifier les nombre de valeur en mode emule
    pour l'utilisation dans KWDataGridUnivariateCosts
- KWSortableObjectComparePartValue: nouvelle fonction comparaison de deux objets KWSortableObject contenant des KWDGValue, par valeur
  - - KWSortableObjectCompareVarPart: suppression de cette methode de comparaion obsolete
- KWDataGridManager
  - SortAttributePartsByTargetGroups: nouvelle methode generique, uniifiant SortAttributeParts et SortVarPartAttributeParts
    - SortAttributeParts: supression de l'ancienne methdoe dediee Symbol
    - SortVarPartAttributeParts: supression  de l'ancienne methdoe dediee VarPart
  - InitialiseAttributeRandomParts, AddAttributeRandomParts: unification des cas Symbol et VarPart
  - InitialiseAttributeGranularizedGroupableParts: nouvelle methode generique, remplacant les methodes precedentes:
    - InitialiseAttributeGranularizedSymbolParts: supression
    - InitialiseAttributeGranularizedVarPartParts: supression
  - CheckCells
- KWDGPart
  - Check
- KWVarPartDataGridClusteringCosts
  - ComputePartCost
  - ComputePartUnionCost
  - ComputePartModelCost
- KWDataGridPostOptimizer
  - PostOptimizeDataGrid

Correction pour plante en debug dans LearningTest\TestCoclustering\y_CoclusteringIV_Standard\SimplifyCoclustering
- le check ne passe pas pour les valeurs des parties des variable internes categorielles,
  car celles-ci ne sont pas triee par effectif decroissant (il n'y a pas d'effectif specifie dans le json)
- correction dans KWDGInnerAttributes::Check()
  - pas de verification du tri si les effectifs des valeurs ne sont pas disponibles
Merge des evolutions de Carine

Cas d'un attribut interne n'ayant que des valeurs manquantes
- LearningTest\TestCoclustering\y_CoclusteringIV_Standard\IrisMissingValues (enrichi a cet effet)
- cet attribut n'a aucune partie alimentee
- on le supprime des attributs internes
- impacts
  - KWDGInnerAttributes::CleanEmptyInnerAttributes: supression des attribut internes vides
  - CCCoclusteringBuilder::CleanVarPartDataGrid: appel de la methode precedente

KWDataGridOptimizer::OptimizeDataGrid
- ajout d'un commentaire pour expliquer pourquoi la DgGranularity est toujours la même dans les log d'optimisation du coclustering

Autre fonctionnalite: possibilite de copier un grille, en clonant les attributs internes de l'attribut VarPart
- besoin en preparation pour le nouveau format json du coclustering IV
- impacts
  - KWDataGridManager
    - CopyDataGridWithInnerAttributesCloned: variante de la methode CopyDataGrid
    - ExportDataGridWithInnerAttributesCloned: variante de la methode CopyDataGrid ExportDataGrid
    - CloneInnerAttributes: nouveau parametre targetDataGrid, pour specialiser la creation des attributs internes
  - KWDataGrid::NewAttribute: passe en public
…n json

Merge des evolutions de Carine

Exporter les valeurs et effectifs des attributs internes categoriels
- necessaire selon le modele, et pour exploiter le côte modele generatif
- prototype implemente dans CCCoclusteringReport::WriteJSONInnerAttributePartition, mais desactive
- format à choisir, entre l'export de toutes les valeurs de l'attribut (comme dans le prototype),
  ou par groupe (comme pour les attributs de grille simples)
- implementer egalement la relecture des fichiers json
- adapter les jeux de test de LearningTest\TestCoclustering\y_CoclusteringIV_Standard

Reutiliser le format utilise dans les "dimensionPartitions" du coclustering standard?
- format complet
  - "-cluster": equivalent des varPartIds, mais avec nommage different
  - "defaultGroupIndex": remplacerait avantageusement la valeur " * "
  - "values" et valuesFrequencies" par groupe: correspond à ce qu'il faut
  - "valueTypicalities": seul champ en trop, mais on pourrait soit ne pas le mettre, soit lui donner un sens
    (dispatcher la valueTypicality au prorata des effectifs)
- pros
 - reutilisation d'un format existant
 - permet de mutualiser le code de lecture et ecriture des json dans le code de Khiops coclustering
   - nouvelle methode WriteJSONAttributePartition(attribute, isInner), plus Read correspondant
   - WriteJSONDimensionPartitions, WriteJSONInnerAttributePartition (plus Read...), reecrits, en reutilisant les methodes precedentes
 - idem dans Khiops covisualization pour Stephane Bouget
- cons
 - plus verbeux
- attention à refaire toutes les references de LearningTest\TestCoclustering\y_CoclusteringIV_Standard
 - et changer les input coclsuetring pour les methodes dont les tests les relisent

Format actuel d'une partion de variable interne                {
    "variable": "Class",
    "type": "Categorical",
    "partition": [["Iris-setosa", "Iris-versicolor"],["Iris-virginica"," * "]],
    "varPartIds": ["Class {Iris-setosa, Iris-versicolor}","Class {Iris-virginica}"]

Format de partition d'une variable de grille
    "name": "Class",
    "type": "Categorical",
    "valueGroups": [
                   {
                    "cluster": "{Iris-setosa, Iris-versicolor}",
                    "values": ["Iris-setosa", "Iris-versicolor"],
                    "valueFrequencies": [50, 50],
                    "valueTypicalities": [1, 0.5]
                   },
                   {
                    "cluster": "{Iris-virginica}",
                    "values": ["Iris-virginica"],
                    "valueFrequencies": [50],
                    "valueTypicalities": [1]
                   }
    ],
    "defaultGroupIndex": 1
                                               }
Format possible pour la partition d'une variable interne
    "name": "Class",
    "type": "Categorical",
    "valueGroups": [
                   {
                    "cluster": "Class {Iris-setosa, Iris-versicolor}",
                    "values": ["Iris-setosa", "Iris-versicolor"],
                    "valueFrequencies": [50, 50],
                   },
                   {
                    "cluster": "Class {Iris-virginica}",
                    "values": ["Iris-virginica"],
                    "valueFrequencies": [50],
                   }
    ],
    "defaultGroupIndex": 1

Impacts dans CCCoclusteringReport
- appel de la methode CopyDataGridWithInnerAttributesCloned de KWDataGridManager qui effectue une copie profonde avec clonage des innerAttributes
  cette methode est appellee lors de la creation de la CCCoclusteringDataGrid ce qui permet de creer des innerAttributes de type CCHDGAttribute
- nouvelle methode WriteJSONVarPartAttributeDimensionSummaries afin de decrire les caracteristiques des innerAttributes avant d'ecrire leur partition
- nouvelle methode WriteJSONAttributePartition(attribute, coclusteringDataGrid) :
  - on a besoin de coclusteringDataGrid pour acceder aux domainBounds dans le cas d'un innerAttribute
  - on a acces a attribute->IsInnerAttribute donc pas besoin de bIsInnerAttribute
- adaptation de WriteJSONDimensionPartitions en utilisant WriteJSONAttributePartition y compris pour les innerAttributes
- adaptation selon la meme organisation pour les methodes Read
Nouvelle classe Profiler ajoutee dans la librairie KWData
- fichier de stats via la collecte des stats par methode tracee (nombre d'appels, duree moyenne)
- ajout optionnel de traces dans un fichier json, pour avoir la dynamique des appels
- declaration d'un pointeur vers le fichier de trace JSONFile plutot qu'un objet directement
  - cet objet est alloue/desalloue le temps d'un session de profiling
  - cela permet de bien controler la memoire, meme si l'on declare des Profiler globaux en statique
  - Attention: il ne faut pas utiliser les JSONFile en statique directement ou indirectement
    - la classe JSONFile utiliser deja une instance en statique pour gerer l'inititialisation de
      des structure globales, et cela ne pose pas de probleme a l'allocateur memoire
    - par contre, une deuxime instance de JSONFile en statique creer des problemes pour l'allocateur,
      qui diagnostique a tor des fuites memoire (les  variable statique snt allouee avant le debut
      et desalloue apres le fin du main()): resoudre ce probleme est long et sans interet

Utilisation du Profiler via des methodes de classe de KWDataGridOptimizer
- uniquement methode GetProfiler
  - Acces au profiler global permettant d'enregistrer toute une session de profiling
    de l'optimisation d'une grille de coclustering
- choix des methodes a profiler et des noms externes pour faciliter leur interpretation
  - Compute coclustering
    - (CCCoclusteringBuilder::ComputeCoclustering)
  - Optimize VarPart prepartition
    - (CCCoclusteringBuilder::OptimizeVarPartDataGrid)
  - Optimize last granularity
    - (KWDataGridOptimizer::OptimizeDataGrid)
  - VNS optimize
    - (KWDataGridVNSOptimizer::IterativeVNSOptimizeDataGrid)
  - Optimize solution
    -(KWDataGridVNSOptimizer::VNSOptimize(VarPart)DataGrid)
  - Pre-optimization
    - (KWDataGridVNSOptimizer::OptimizeSolution)
  - Greedy merge optimization
    - (KWDataGridVNSOptimizer::OptimizeSolution)
  - Post-optimization
    - (KWDataGridVNSOptimizer::OptimizeSolution)
  - Post-optimization IV
    - (KWDataGridVNSOptimizer::VNSOptimizeVarPartDataGrid)
  - Optimize granularity
    - (KWDataGridOptimizer::OptimizeDataGrid)
- pilotage global depuis CCCoclusteringBuilder::ComputeCoclustering
  - lancement ou non du profiling
  - stats sur les donnees de la grille initiale

Tests sur LearningTest\TestCoclustering\y_CoclusteringIV_Standard et LearningTest\TestCoclustering\Standard\Iris
Integration des developements de Carine

Nouveau format de rapport json du coclustering individus x variables
- nettoyage du code de CCCoclusteringReport
  - ReadJSONDimensionPartitionsNew -> ReadJSONDimensionPartitions
  - balises "// CH IV MemBug" ??? : supprimees
- nouveau format actuel, base sur les deux section suivantes  OK
  - innerAttributesDimensionSummaries
  - innerVariables
- une seule section innerVariables, avec deux sous-section identiques à l'existant
  - innerVariables
    - dimensionSummaries
    - dimensionPartitions
- impacts dans KWLearningReport
  - reutiliser aux maximum les methodes existantes
    - ReadJSONDimensionSummaries
    - ReadJSONDimensionPartitions
    - WriteJSONAttributeSummary
    - ReadJSONInnerAttributesDimensionSummaries: toujours utile

Suppression du dictionnaire des bornes de domaine des attribut internes numeriques
	mutable ObjectDictionary odInnerAttributeDomainBounds;
car il est devenu inutile maintenant que les attributs internes de la grille hierarchique sont de type CCHDGAttribute
…G*Value

Extension des classe KWDGValue et KWDGValueSet
- KWGGValueSet
  - SortValuesByDecreasingTypicality
  - Check: ajout de la verification de la typicalite
- KWDGValue
  - CompareTypicality: methodes virtuelle, reimplementee dans les sous-classes
- KWDGValueCompareTypicality: comparaison de deux valeurs par typicalite

Objectif: supression des classes de CCHierarchicalDataGrid, sous-classes de KWDGValueSet et KWDGValue
- classes concernees
  - CCHDGSymbolValueSet, CCHDGVarPartSet, sous classes indirectement de KWDGValueSet
    - ces classes sont quasiment identiques, avec tres peu de methodes ayant la meme implementation
      - Create, SortVarPartsByTypicality, CheckHierarchy
  - CCHDGSymbolValue, CCHDGVarPartValue, sous classes indirectement de KWDGValue
    - ces classes sont quasiment identiques, avec tres peu de methodes ayant la meme implementation
      - SetTypicality, GetTypicality, CheckHierarchy
  - depuis la mise en place de la hierarchie KWDGValyeSet et KWDGValue, ces classes ne sont necessaires
    que parce qu'elles heritent de sous-classes distinctes
- refactoring
  - remonter les methodes de ces classe dans les classe génériques ancetres KWDGValueSet et KWDGValue
  - supprimer les quatres classes spécialisée
  - impact pour factoriser le code existant entre les types Symbol et VarPart
  - permettra de gérer simplement la typicalité dans le cas VarPart

Supression des classes
- CCHDGSymbolValueSet
- CCHDGSymbolValue
- CCHDGVarPartSet
- CCHDGVarPartValue
- CCHDGCell (inutile)

Impacts de la supression sur les methodes existantes
- CCCoclusteringBuilder
  - ComputeValueTypicalitiesAt
  - SortAttributePartsAndValues
- CCCoclusteringReport
  - ReadComposition
  - WriteComposition
  - ReadJSONAttributePartition
  - ReadJSONValueGroup
  - ReadJSONVarPartAttributeValueGroup
  - WriteJSONAttributePartition
- CCLearningProblem
  - WriteSymbolClusters
  - WriteVarPartClusters

CCCoclusteringReport
- WriteJSONInnerAttributes
  - nouvelle methode d'ecriture des attributs internes
- WriteJSONAttributePartition
  - supression du deuxieme parametre inutile de type CCHierarchicalDataGrid
  - WriteJSONAttributePartition: mutualisation des cas Symbol et VarPart
- Supression des methodes suivantes desormais inutiles
  - WriteJSONInnerAttributesDimensionSummaries
  - ReadJSONInnerAttributeIntervals
  - ReadJSONInnerAttributeValueGroups

KWDGSymbolValue::CompareTypicality, KWDGVarPartValue::CompareTypicality
- comparaison a en utilisant une conversion en Continuous pour statbiliser les erreur d'arrondi

CCCoclusteringBuilder::ComputeValueTypicalitiesAt
-Il se peut qu'une modalite ait une typicalite negative, si la post-optimisation des grille
 n'a pas pu aller jusqu'a la convergence. Dans ce cas, on met une typicalite a 0, ce qui
 indique que la modalite n'est pas a sap lace (de justesse) dans son cluster

CCLearningProblem
- WriteGroupableClusters: ajout, en remplacement des deux methodes identiques suivantes
  - WriteSymbolClusters
  - WriteVarPartClusters

Jeux de donnees modifies
- Adult2var
  - echantillonage à 25% pour accelerer les traitements
  - renomme en TooLongAdult2vars: pour executer ce jeu de test en dernier dans les test globaux
- Breast
  - deux typicalites sont passees de negative à 9
- IrisMissingValues
  - CoclusteringIrisAllValuesMissingPetalWidth
  - une typicalite est passee de negative à 9
- ReadInputErroneousJSONCoclustering
  - modification cosmetique des libelles d'erreur dans le err.txt
- ExtractClustersIris
   - le libelle d'entete de ClustersVariables.txt est renommer de VarPart en Value (comme pour les variables categorielles)

Tests sur tout LearningTest\TestCoclustering\y_CoclusteringIV_Standard, y compris en debug
Classe Profiler
- en mode trace, ajout du temps d'execution de methode elementaire

Rajout de collecte de temps pour deux methodes:
- "Generate neighbour solution": appel de GenerateNeighbourSolution depuis KWDataGridVNSOptimizer::VNSOptimizeDataGrid
- "Post VarPart merge" : KWDataGridManager::ExportDataGridWithVarPartMergeOptimization

KWDataGridVNSOptimizer
- debut de refactoring pour isoler lune methdoe de post(optimisation des parties de variables
	// CH IV Refactoring
	// Methode de post-optimisation d'un grille optimisee en redecoupant ses parties de variables
	// Methode temporaire permettant de reutiliser le code de la methode principale VNSOptimizeDataGrid
	// en isolant cette partie de post-optimisation specifique VarPart, et de supprimer l'ancienne
	// methode VNSOptimizeVarPartDataGrid
	// Parametre (a faire evoluer si necessaire):
	// - initialDataGrid: grille initiale
	// - neighbourDataGrid: grille courante en cours d'optimisation
	// - dNeighbourDataGridCost: cout de la grille courante
	// - mergedDataGrid: grille optimisee si amelioration
	// En sortie, on rend la nouvelle version de la grille optimisee (ou courante) integrant la post-ptimisation et on renvoie son cout
	//
	// A terme, il faudra isoler ce service de post-optimisation pour le deplacer en quatrime sous-methode
	// en fin de la methode OptimizeSolution
	// - Pre-optimization
	// - Greedy merge optimization
	// - Post-optimization
	// - Post-optimization IV
	PROTO_VNSDataGridPostOptimizeVarPart
- methodes impactees, non activee encore (reste une bug residuel)
  - PROTO_VNSDataGridPostOptimizeVarPart
  - PROTO_VNSOptimizeVarPartDataGrid

Nettoyage de l'ancienne gestion des Timer (CCTimer*)
- impacts dans KWDataGridOptimizer
- impact dans les jeux de donnees TestCoclustering\y_CoclusteringIV_Standard\AdultEducation
  - seuls change les fichiers de log err.txt, nettoyes pour les utilisateur (les information de profiling sont maintenant gere a part)
- surprise: l'indicateur VarPartGranularity est systematiquement a 0 dans les log
…g" tags

Prise en compte de corretcion de Carine
- nettoyage des balises "CH IV Refactoring"
- impacts
  - KWAttributeSubsetStats
    - CreateDataGridCells: ajout d'un require
  - KWDataGrid
  - KWDataGridManager
    - BuildUnivariateDataGridFromGranularizedPartition: nouvelle methode
    - BuildDataGridFromUnivariateStats -> BuildUnivariateDataGridFromAttributeStats
    - CloneInnerAttributes: correction en recopiant la VarPartGranularity
  - KWDataGridMerger
    - KWDGMPartValueNumberCompare: ajout d'un critere de tri secondaire
  - KWDataGridOptimizer
    - OptimizeWithBestUnivariatePartitionForCurrentGranularity: utilisation de la nouvelle methode BuildDataGridFromGranularizedPartition
  - KWDataGridPostOptimizer
  - KWGrouperMODL
  - KWGrouperMODLOptimization
  - KWHierachicalMultinomialStudy
    - nettoyage massif
  - KWVersion
  - CCCoclusteringBuilder
    - CreateVarPartDataGrid: utilisation directe de la methode dediee CreateVarPartDataGridCells
    - CreateDataGridCells: supression de cette methode, au profit de la methode dediee VarPart CreateVarPartDataGridCells
  - CCCoclusteringReport
  - CCHierarchicalDataGrid
  - CCLearningProblemView
    - simplification de la definition de l'interface

Nettoyage du code, en supprimant les sections DDD de KWDataGridOptimizer

KWDataGridVNSOptimizer
- PROTO_VNSDataGridPostOptimizeVarPart
  - ajout de parametres mergedDataGrid et partitionedReferencePostMergedDataGrid
  - corrige les probleme, en etant tres porche du code actuel
    - gestion des grilles "antecedants"
  - mais la difference avec les entre grille standard et IV reste importante

Nom des fichiers de profiling:
- ajouter le nombre d'individus et de variables dans  le nom du fichier
  - pour distinguer les variantes de scénario avec un meme dictionnaire
- impact dans CCCoclusteringBuilder::ComputeCoclustering: GetProfiler()-> Start(filename)

Profiling:
- ajout d'une categorie de profiling "Save best solution", pour avoir une stats sur le nombre d'ameliorations
- impact dans CCCoclusteringBuilder::HandleOptimizationStep

Gestion de typicalites negatives lors des relectures de rapport de coclustering
- provoque un bug dans LearningTest\TestCoclustering\Bugs\NegativeTypicalities
- ajout d'une tolerance: les typicalites négatives des rapports sont remplacees par 0
- impacts:
 - CCCoclusteringReport::ReadComposition
 - CCCoclusteringReport::ReadJSONTypicalities

Probleme de dimensionnement:
- jeu de test LearningTest\TestCoclustering\y_CoclusteringIV\Isolet
  617 variables, 6238 instances
- malgré 32 Gb RAM, message "Not enough memory to create initial data grid..."
- correction dans CCCoclusteringBuilder
  - CheckMemoryForVarPartDataGridInitialization: nouvelle methode dediee au dimensionnement dans le cas instances x variables
    - attention, les cellules sont dimensionnees par rapport aux nombre de dimensions de la grille, pas par rapport au nombre de variables interne
    - exploite dans ComputeCoclustering, FillVarPartTupleTableFromDatabase
  - CheckMemoryForDataGridOptimization: corrections en se basnt effectivement sur el nombre de dimensions de la grille
  - CreateVarPartDataGridCells: arret si erreur dans la boucle de parcours de variables internes (pour n'avoir qu'une seule fois le message d'erreur)
- test en cours: optimisation tres longue, mais passe desormais l'etape de dimensionnement

Test complets effectues sur LearningTest\TestCoclustering
- Standard, SmallInstabilities, Bugs, NewPriorV9
- y_CoclusteringIV_Standard
Copy link
Member

@folmos-at-orange folmos-at-orange left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Modification des -pre-commit
- fichier .pre-commit-config.yaml
- on exclu le formatage json pour tous les fichier sous test\LearningTest

Micro-correction dans les scripts de test\LearningTest\cmd\python
- attention, le "pretty print" du pre-commit est tres different de clui de pycharm (plus joli)

Mise a jour globales de tous les tests
- supression prealable des arborescence concernees
  - ex: test\LearningTest\TestKhiops\Standard
- copie des arborescences correspondante du LearningTest local a jour avec la version en cours
- nettoyage des sous-repertoires results
  - se placer dans le repertoire local test\LearningTest
  - lancer la commande suivante sur tous les sous-repertorie concernes
    python cmd\python\apply_command clean TestKhiops\standard
    ...
- nettoyage des fichiers comparisonResults.log
  - se placer dans le repertoire local test\LearningTest
    delete comparisonResults.log /s
Principalement, ajout de override pour une bonne vingtaine de methodes

Compilation de KWTest (bac a sable dans Learning)
- CreateLargeFiles.cpp: fseeko|ftello pour MAC
- nettoyage de quelques lignes de code pour ne plus avoir d'erreurs sur Ubuntu
  - notamment, ce qui concerne chrono

Remplacement systematique de tous les sprintf par des snprintf
- sinon, nombreux warning DEPRECATED sur MAC
- supression de la methode SecureStrcpy de standard, desormais inutile
  - ancien usage remplace par snprint

Quelques correction de warning de compilation MAC ou Ubuntu impliquant de vraies erreurs

Confirmation de la gestion en unstable de quelques jeux de test sous LearningTest

Toutes les compilations passent sous Windows, Unutun et MAC, avec un nombre minimal de warning residuels (sur Ubuntu, Release)
Tous les jeux de test LearningTest sont valide sur toutes les plateformes
@marcboulle marcboulle force-pushed the 69-refactor-coclustering-iv-optimization-algorithms branch from 255d161 to a7bc5f6 Compare October 6, 2023 13:40
Changements principaux
- nouvelle hierarchie de classes KWDGValueSet, avec specialisation Symbol ou VarPart
- simplification importante du code
- prise en compte correcte des valeurs manquantes
- nouveau format des rapport json, complet
- mise en place de profiling
- correction de la gestion des typivalites negatives
- correction de problemes de dimensionnement dans le cas de tres nombreuses variables internes

Mise en phase avec les branches dev-v11 et dev
- correction des errors et warnings de compilation sur toutes les plateformes
- mis en place de jeux de test de LearningTest specifique V11, avec nouveaux scenarios et resultats de reference
- supression de la section specifique clang du CMakeLists.txt principal, desormais inutile
@marcboulle marcboulle force-pushed the 69-refactor-coclustering-iv-optimization-algorithms branch from a7bc5f6 to 4154648 Compare October 6, 2023 14:29
@marcboulle marcboulle merged commit 008d8b4 into dev-v11 Oct 6, 2023
25 checks passed
@marcboulle marcboulle deleted the 69-refactor-coclustering-iv-optimization-algorithms branch October 6, 2023 14:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants