diff --git a/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.cpp b/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.cpp index 38c1badb5..c9db2be95 100644 --- a/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.cpp +++ b/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.cpp @@ -74,25 +74,23 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri { boolean bDisplayResults = false; - boolean bDisplayGranularities = false; KWDataGrid granularizedDataGrid; KWDataGrid* granularizedOptimizedDataGrid; KWDataGridManager dataGridManager; double dGranularityBestCost; double dBestCost; double dTotalTime; - int nGranularityIndex; - boolean bIsLastGranularity; boolean bOptimizationNeeded; - boolean bWithMemoryMode; ObjectDictionary odQuantileBuilders; + IntVector ivMaxPartNumbers; IntVector ivPreviousPartNumber; IntVector ivCurrentPartNumber; - int nAttribute; - boolean bIsGranularitySelected; - double dRequiredIncreasingCoefficient; - IntVector ivMaxPartNumbers; + const double dMinimalGranularityIncreasingCoefficient = 2; int nMaxExploredGranularity; + int nGranularityIndex; + boolean bIsLastGranularity; + boolean bIsGranularitySelected; + int nAttribute; double dBestMergedCost; double dMergedCost; KWDataGrid granularizedPostMergedOptimizedDataGrid; @@ -106,20 +104,16 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri dGranularityBestCost = DBL_MAX; dBestMergedCost = dGranularityBestCost; dTotalTime = 0; - bWithMemoryMode = false; // Controle de la graine aleatoire pour avoir des resultats reproductibles SetRandomSeed(1); // Construction d'une grille terminale pour la solution initiale dBestCost = InitializeWithTerminalDataGrid(initialDataGrid, optimizedDataGrid); - - if (bDisplayResults) - cout << "KWOptimize : Cout grille terminale independant de la granularite " << dBestCost << endl; - if (bDisplayResults) { - cout << "KWOptimize :Grille initiale avant optimisation" << endl; + cout << "KWOptimize : Cout grille terminale independant de la granularite " << dBestCost << endl; + cout << "KWOptimize : Grille initiale avant optimisation" << endl; initialDataGrid->Write(cout); } @@ -138,17 +132,9 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri // Calcul de la granularite max a explorer nMaxExploredGranularity = ComputeMaxExploredGranularity(initialDataGrid); - // Initialisation - nGranularityIndex = 1; - bIsLastGranularity = false; - - // Initialisation du facteur d'accroissement requis entre deux partitions traitees - dRequiredIncreasingCoefficient = 2; - // Initialisation des quantiles builders a partir de la grille source dataGridManager.SetSourceDataGrid(initialDataGrid); dataGridManager.InitializeQuantileBuilders(&odQuantileBuilders, &ivMaxPartNumbers); - if (bDisplayResults) cout << "ivMaxPartNumbers Granularisation\t" << ivMaxPartNumbers << flush; @@ -161,6 +147,8 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri nLastExploredGranularity = -1; // Parcours des granularites + nGranularityIndex = 1; + bIsLastGranularity = false; while (nGranularityIndex <= nMaxExploredGranularity and not bIsLastGranularity) { // Arret si interruption utilisateur @@ -172,8 +160,13 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri dataGridManager.ExportGranularizedDataGrid(&granularizedDataGrid, nGranularityIndex, &odQuantileBuilders); - // Etude du nombre de parties attribut par attribut pour decider du lancement de l'optimisation - // ou non pour cette granularite Parcours des attributs + ////////////////////////////////////////////////////////////////////////////////////////////// + // On determine si la granularite courante doit etre traitee + // - bIsGranularitySelected: parce qu'elle differe suffisament de la granularite precedente + // et de la granularite max + // - bIsLastGranularity: par ce que c'est la derniere + + // Calcul du nombre de nombre de parties par attribut attribut pour la granularite en cours for (nAttribute = 0; nAttribute < granularizedDataGrid.GetAttributeNumber(); nAttribute++) { // Memorisation du nombre de parties de l'attribut granularise @@ -181,16 +174,16 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri nAttribute, cast(KWDGAttribute*, granularizedDataGrid.GetAttributeAt(nAttribute)) ->GetPartNumber()); } - bIsLastGranularity = true; - // Si on n'a pas encore atteint la granularite max + // On determine si on a atteint la granularite max + bIsLastGranularity = true; if (nGranularityIndex < nMaxExploredGranularity) { for (nAttribute = 0; nAttribute < granularizedDataGrid.GetAttributeNumber(); nAttribute++) { - // Cas ou le nombre de parties de l'attribut courant est inferieur au nombre max - // de parties de l'attribut + // La granularite n'est pas max si le nombre de parties courant est inferieur + // au nombre max de parties pour au moins un attribut if (ivCurrentPartNumber.GetAt(nAttribute) < ivMaxPartNumbers.GetAt(nAttribute)) { bIsLastGranularity = false; @@ -199,39 +192,47 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri } } - // Cas ou cette granularite sera la derniere traitee + // Dans le cas de la granularite max, on positionne l'index de granularite au maximum + // pour des raisons d'affichage, if (bIsLastGranularity) - // On positionne l'index de granularite au maximum afin que l'affichage soit adapte a ce - // cas granularizedDataGrid.SetGranularity(nMaxExploredGranularity); + // Test si on doit traiter la granularite bIsGranularitySelected = false; - for (nAttribute = 0; nAttribute < granularizedDataGrid.GetAttributeNumber(); nAttribute++) + if (granularizedDataGrid.GetInformativeAttributeNumber() > 1) { - // Cas d'accroissement suffisant du nombre de parties - if ((ivCurrentPartNumber.GetAt(nAttribute) >= - ivPreviousPartNumber.GetAt(nAttribute) * dRequiredIncreasingCoefficient) and - (ivCurrentPartNumber.GetAt(nAttribute) * dRequiredIncreasingCoefficient <= - ivMaxPartNumbers.GetAt(nAttribute))) + // On ne traite pas les grilles avec un seul attribut informatif + // + // Dans le cas d'une grille avec un attribut instances et un attribut VarPart, tant que + // l'attribut instances ne contient qu'une seule partie, la granularite n'est pas selectionnee. + // La granularisation de l'attribut instances est reduite au fourre-tout (1 seule partie) + // tant que le nombre d'observations par instances n'est pas superieur a l'effectif minimal N/2^G + // Pour un nombre d'observations egal au nombre de variables pour toutes les instances, + // il faut atteindre G tel que G > Gmax - log(K) / log(2) + // + // On ne traite cette granularite que si elle est differe suffisament de la precedente et de la + for (nAttribute = 0; nAttribute < granularizedDataGrid.GetAttributeNumber(); + nAttribute++) { - bIsGranularitySelected = true; - break; + // Cas d'accroissement suffisant du nombre de parties + if ((ivCurrentPartNumber.GetAt(nAttribute) >= + ivPreviousPartNumber.GetAt(nAttribute) * + dMinimalGranularityIncreasingCoefficient) and + (ivCurrentPartNumber.GetAt(nAttribute) * + dMinimalGranularityIncreasingCoefficient <= + ivMaxPartNumbers.GetAt(nAttribute))) + { + bIsGranularitySelected = true; + break; + } } } - // On ne traite pas les grilles avec un seul attribut informatif - // Dans le cas d'une grille avec un attribut instances et un attribut VarPart, tant que - // l'attribut instances ne contient qu'une seule partie, la granularite n'est pas selectionnee. - // La granularisation de l'attribut instances est reduite au fourre-tout (1 seule partie) - // tant que le nombre d'observations par instances n'est pas superieur a l'effectif minimal N/2^G - // Pour un nombre d'observations egal au nombre de variables pour toutes les instances, - // il faut atteindre G tel que G > Gmax - log(K) / log(2) - if (granularizedDataGrid.GetInformativeAttributeNumber() <= 1) - bIsGranularitySelected = false; - - // Cas du traitement de la granularite courante + // Exploration de la granularite courante if (bIsGranularitySelected or bIsLastGranularity) { + assert(bIsGranularitySelected or bIsLastGranularity); + // Memorisation des granularites exploitees nLastExploredGranularity = nCurrentExploredGranularity; nCurrentExploredGranularity = nGranularityIndex; @@ -240,7 +241,6 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri granularizedOptimizedDataGrid = new KWDataGrid; dGranularityBestCost = InitializeWithTerminalDataGrid(&granularizedDataGrid, granularizedOptimizedDataGrid); - if (bDisplayResults) { cout << "KWOptimize :Cout Grille initiale granularisee pour granularite = " @@ -253,12 +253,6 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri << dGranularityBestCost << endl; } - // Cas avec memoire (pas par defaut) : on part a la granularite courante de la meilleure - // grille rencontree aux granularites precedentes, si elle est meilleure que la grille - // initiale a cette granularite - if (bWithMemoryMode and dBestCost < dGranularityBestCost) - dataGridManager.CopyDataGrid(optimizedDataGrid, granularizedOptimizedDataGrid); - // Parametrage du profiling if (bIsLastGranularity) NEWKWDataGridOptimizer::GetProfiler()->BeginMethod("Optimize last granularity"); @@ -407,9 +401,6 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri } } - // Nettoyage de la grille granularisee - granularizedDataGrid.DeleteAll(); - // Nettoyage de la grille optimisee pour cette granularite delete granularizedOptimizedDataGrid; granularizedOptimizedDataGrid = NULL; @@ -453,15 +444,11 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri // Memorisation du nombre de parties par attribut pour comparaison a l'etape suivante ivPreviousPartNumber.CopyFrom(&ivCurrentPartNumber); } - else - { - if (bDisplayGranularities) - cout << "KWOptimize :Granularite " << nGranularityIndex - << " non traitee car identique a la precedente" << endl; - // Nettoyage de la grille granularisee - granularizedDataGrid.DeleteAll(); - } + // Nettoyage de la grille granularisee + granularizedDataGrid.DeleteAll(); + + // Granularite suivante nGranularityIndex++; } // CH IV Begin