Skip to content

Commit

Permalink
WIP step 4
Browse files Browse the repository at this point in the history
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
  • Loading branch information
marcboulle committed Oct 16, 2023
1 parent 4afce3e commit 733721b
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 26 deletions.
55 changes: 29 additions & 26 deletions src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -564,7 +569,7 @@ double NEWKWDataGridOptimizer::OptimizeGranularizedDataGrid(const KWDataGrid* in
KWDataGridManager dataGridManager;
KWDataGridMerger dataGridMerger;
KWDataGridPostOptimizer dataGridPostOptimizer;
boolean bOptimizationNeeded;
boolean bIsOptimizationNeeded;
double dBestCost;
ALString sTmp;

Expand Down Expand Up @@ -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)
Expand All @@ -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")
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 4 additions & 0 deletions src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 733721b

Please sign in to comment.