From 733721b86e6195978dd4529aa89b453b0fdde593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Mon, 16 Oct 2023 10:55:59 +0200 Subject: [PATCH] WIP step 4 NEWKWDataGridOptimizer - IsOptimizationNeeded: nouvelle methode, encapsulant les tests de verification si une optimisation est necessaire - utilise dans les methodes OptimizeDataGrid et OptimizeGranularizedDataGrid - InitializeWithTerminalDataGrid - ajout du tri des partie en fin de methode (SortAttributeParts) - permet d'avoir une grille initiale prete a l'emploi directement - evite le else 300 lignes plus loin que le if dans la methode principale OptimizeDataGrid --- .../NEWKWDataGridOptimizer.cpp | 55 ++++++++++--------- .../NEWKWDataGridOptimizer.h | 4 ++ 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.cpp b/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.cpp index 93bcf9294..79299e02d 100644 --- a/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.cpp +++ b/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.cpp @@ -80,7 +80,7 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri double dGranularityBestCost; double dBestCost; Timer timerOptimization; - boolean bOptimizationNeeded; + boolean bIsOptimizationNeeded; ObjectDictionary odQuantileBuilders; IntVector ivMaxPartNumbers; IntVector ivPreviousPartNumber; @@ -118,16 +118,10 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri } // On determine si on peut potentiellement faire mieux que la grille terminale - bOptimizationNeeded = true; - if ((initialDataGrid->GetTargetAttribute() == NULL and initialDataGrid->GetTargetValueNumber() == 1) or - (initialDataGrid->GetTargetAttribute() == NULL and initialDataGrid->GetInformativeAttributeNumber() == 0) or - (initialDataGrid->GetTargetAttribute() != NULL and - initialDataGrid->GetTargetAttribute()->GetPartNumber() <= 1) or - (initialDataGrid->GetTargetAttribute() != NULL and initialDataGrid->GetInformativeAttributeNumber() <= 1)) - bOptimizationNeeded = false; + bIsOptimizationNeeded = IsOptimizationNeeded(initialDataGrid); // Cas ou la grille terminale est ameliorable - if (bOptimizationNeeded) + if (bIsOptimizationNeeded) { // Calcul de la granularite max a explorer nMaxExploredGranularity = ComputeMaxExploredGranularity(initialDataGrid); @@ -468,13 +462,8 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri // Nettoyage odQuantileBuilders.DeleteAll(); } - // Cas ou la grille terminale n'est pas ameliorable - else - { - // Tri des parties par attribut, pour preparer les affichages de resultats - // ainsi que les resultats de preparation des donnees - optimizedDataGrid->SortAttributeParts(); - } + ensure(optimizedDataGrid->AreAttributePartsSorted()); + ensure(fabs(dBestCost - GetDataGridCosts()->ComputeDataGridTotalCost(optimizedDataGrid)) < dEpsilon); return dBestCost; } @@ -515,6 +504,22 @@ double NEWKWDataGridOptimizer::SimplifyDataGrid(KWDataGrid* optimizedDataGrid) c return dSimplifiedGridCost; } +boolean NEWKWDataGridOptimizer::IsOptimizationNeeded(const KWDataGrid* initialDataGrid) const +{ + boolean bIsOptimizationNeeded; + + require(initialDataGrid != NULL); + + bIsOptimizationNeeded = true; + if ((initialDataGrid->GetTargetAttribute() == NULL and initialDataGrid->GetTargetValueNumber() == 1) or + (initialDataGrid->GetTargetAttribute() == NULL and initialDataGrid->GetInformativeAttributeNumber() == 0) or + (initialDataGrid->GetTargetAttribute() != NULL and + initialDataGrid->GetTargetAttribute()->GetPartNumber() <= 1) or + (initialDataGrid->GetTargetAttribute() != NULL and initialDataGrid->GetInformativeAttributeNumber() <= 1)) + bIsOptimizationNeeded = false; + return bIsOptimizationNeeded; +} + int NEWKWDataGridOptimizer::ComputeMaxExploredGranularity(const KWDataGrid* initialDataGrid) const { int nMaxExploredGranularity; @@ -564,7 +569,7 @@ double NEWKWDataGridOptimizer::OptimizeGranularizedDataGrid(const KWDataGrid* in KWDataGridManager dataGridManager; KWDataGridMerger dataGridMerger; KWDataGridPostOptimizer dataGridPostOptimizer; - boolean bOptimizationNeeded; + boolean bIsOptimizationNeeded; double dBestCost; ALString sTmp; @@ -600,16 +605,10 @@ double NEWKWDataGridOptimizer::OptimizeGranularizedDataGrid(const KWDataGrid* in } // On determine si on peut potentiellement faire mieux que la grille terminale - bOptimizationNeeded = true; - if ((initialDataGrid->GetTargetAttribute() == NULL and initialDataGrid->GetTargetValueNumber() == 1) or - (initialDataGrid->GetTargetAttribute() == NULL and initialDataGrid->GetInformativeAttributeNumber() == 0) or - (initialDataGrid->GetTargetAttribute() != NULL and - initialDataGrid->GetTargetAttribute()->GetPartNumber() <= 1) or - (initialDataGrid->GetTargetAttribute() != NULL and initialDataGrid->GetInformativeAttributeNumber() <= 1)) - bOptimizationNeeded = false; + bIsOptimizationNeeded = IsOptimizationNeeded(initialDataGrid); // Initialisation univariee - if (bOptimizationNeeded and optimizationParameters.GetUnivariateInitialization() and + if (bIsOptimizationNeeded and optimizationParameters.GetUnivariateInitialization() and initialDataGrid->GetTargetValueNumber() > 0 // on ne fait pas d'univarie si un seul attribut and initialDataGrid->GetAttributeNumber() > 1) @@ -631,7 +630,7 @@ double NEWKWDataGridOptimizer::OptimizeGranularizedDataGrid(const KWDataGrid* in } // Optimisation a partir d'une grille initiale complete si algorithme glouton - if (bOptimizationNeeded) + if (bIsOptimizationNeeded) { // Optimisation avec algorithme greedy if (optimizationParameters.GetOptimizationAlgorithm() == "Greedy") @@ -926,6 +925,10 @@ double NEWKWDataGridOptimizer::InitializeWithTerminalDataGrid(const KWDataGrid* else dataGridManager.CopyDataGrid(&terminalDataGrid, optimizedDataGrid); + // Tri des parties par attribut, pour preparer les affichages de resultats + // ainsi que les resultats de preparation des donnees + optimizedDataGrid->SortAttributeParts(); + // Affichage du resulat (ici: grilles initiale et optimisee sont confondues) DisplayOptimizationDetails(optimizedDataGrid, false); DisplayOptimizationDetails(optimizedDataGrid, true); diff --git a/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.h b/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.h index f78544cce..320f1193a 100644 --- a/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.h +++ b/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.h @@ -107,6 +107,10 @@ class NEWKWDataGridOptimizer : public Object // CH IV Refactoring: a supprimer friend class KWDataGridOptimizer; + // Test si l'optimisation est necessaire pour une grille + // Au moins deux parties par attribut source et cible + boolean IsOptimizationNeeded(const KWDataGrid* initialDataGrid) const; + // Calcul de la granularite max a explorer // Celle-ci depend du nombre de valeurs, mais est egalement tronquee de facon heuristique // dans certains cas (ex: regression) pour reduire les temps de calcul