Skip to content

Commit

Permalink
WIP step 1
Browse files Browse the repository at this point in the history
Refactoring dans NEWKWDataGridOptimizer
- ComputeMaxExploredGranularity: nouvelle methode encapsulant le calcul de la granularite max a explorer
  - OptimizeDataGrid: simplification en exploitant cette methode
  • Loading branch information
marcboulle committed Oct 13, 2023
1 parent 5f6d838 commit d8db981
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 38 deletions.
2 changes: 1 addition & 1 deletion src/Learning/KWDataPreparation/KWDataGridOptimizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ double KWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGrid,

// CH IV Refactoring : DDDDD
// Test du remplacement de la methode actuelle, par son proto
boolean bNewPROTO = false;
boolean bNewPROTO = true;
if (bNewPROTO)
{
NEWKWDataGridOptimizer newDataGridOptimizer;
Expand Down
86 changes: 49 additions & 37 deletions src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,6 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri
double dBestCost;
double dTotalTime;
int nGranularityIndex;
int nGranularityMax;
int nValueNumber;
boolean bIsLastGranularity;
boolean bOptimizationNeeded;
boolean bWithMemoryMode;
Expand All @@ -94,8 +92,7 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri
boolean bIsGranularitySelected;
double dRequiredIncreasingCoefficient;
IntVector ivMaxPartNumbers;
int nMinValueNumber = 500;
boolean bIsGranularityMaxThresholded;
int nMaxExploredGranularity;
double dBestMergedCost;
double dMergedCost;
KWDataGrid granularizedPostMergedOptimizedDataGrid;
Expand All @@ -105,10 +102,10 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri
int nLastExploredGranularity;
ALString sTmp;

//Initialisations
dGranularityBestCost = DBL_MAX;
dBestMergedCost = dGranularityBestCost;
dTotalTime = 0;
nValueNumber = initialDataGrid->GetGridFrequency();
bWithMemoryMode = false;

// Controle de la graine aleatoire pour avoir des resultats reproductibles
Expand Down Expand Up @@ -138,34 +135,8 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri
// Cas ou la grille terminale est ameliorable
if (bOptimizationNeeded)
{
// On parcourt les differentes granularites

// Initialisation de la granularite maximale avec seuillage eventuel de la granularite max pour reduire
// la complexite algorithmique
bIsGranularityMaxThresholded = false;
// Cas d'une une grille 2D supervise avec un attribut a predire avec groupage de la cible
// (classification avec groupage ou regression) et un attribut explicatif numerique dont le nombre de
// valeurs potentielle (= nombre d'instances) est > nMinValueNumber
if (initialDataGrid->GetTargetAttribute() != NULL and initialDataGrid->GetTargetValueNumber() == 0 and
initialDataGrid->GetAttributeNumber() == 2 and
initialDataGrid->GetAttributeAt(0)->GetAttributeType() == KWType::Continuous and
(nValueNumber > nMinValueNumber))
bIsGranularityMaxThresholded = true;
// Cas d'une classification supervisee simple avec une paire de variables (numerique ou categorielle)
// pour lesquelles le nombre de valeurs potentielles (= nombre d'instances) est > nMinValueNumber
else if (initialDataGrid->GetTargetValueNumber() > 0 and initialDataGrid->GetAttributeNumber() == 2 and
nValueNumber > nMinValueNumber)
bIsGranularityMaxThresholded = true;

// Cas sans seuillage
if (not bIsGranularityMaxThresholded)
nGranularityMax = (int)ceil(log(nValueNumber * 1.0) / log(2.0));
// Sinon seuillage
else
nGranularityMax =
(int)ceil(log(nMinValueNumber + sqrt((nValueNumber - nMinValueNumber) *
log(nValueNumber - nMinValueNumber) / log(2.0))) /
log(2.0));
// Calcul de la granularite max a explorer
nMaxExploredGranularity = ComputeMaxExploredGranularity(initialDataGrid);

// Initialisation
nGranularityIndex = 1;
Expand All @@ -190,7 +161,7 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri
nLastExploredGranularity = -1;

// Parcours des granularites
while (nGranularityIndex <= nGranularityMax and not bIsLastGranularity)
while (nGranularityIndex <= nMaxExploredGranularity and not bIsLastGranularity)
{
// Arret si interruption utilisateur
if (TaskProgression::IsInterruptionRequested())
Expand All @@ -213,7 +184,7 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri
bIsLastGranularity = true;

// Si on n'a pas encore atteint la granularite max
if (nGranularityIndex < nGranularityMax)
if (nGranularityIndex < nMaxExploredGranularity)
{
for (nAttribute = 0; nAttribute < granularizedDataGrid.GetAttributeNumber();
nAttribute++)
Expand All @@ -232,7 +203,7 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri
if (bIsLastGranularity)
// On positionne l'index de granularite au maximum afin que l'affichage soit adapte a ce
// cas
granularizedDataGrid.SetGranularity(nGranularityMax);
granularizedDataGrid.SetGranularity(nMaxExploredGranularity);

bIsGranularitySelected = false;
for (nAttribute = 0; nAttribute < granularizedDataGrid.GetAttributeNumber(); nAttribute++)
Expand Down Expand Up @@ -469,7 +440,7 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri
"All the optimization time has been used but maximum "
"granularity has not been reached:" +
IntToString(nGranularityIndex) + " on " +
IntToString(nGranularityMax) +
IntToString(nMaxExploredGranularity) +
". You could obtain better results with greater "
"optimization time.");
if (bDisplayResults)
Expand Down Expand Up @@ -556,6 +527,47 @@ double NEWKWDataGridOptimizer::SimplifyDataGrid(KWDataGrid* optimizedDataGrid) c
return dSimplifiedGridCost;
}

int NEWKWDataGridOptimizer::ComputeMaxExploredGranularity(const KWDataGrid* initialDataGrid) const
{
int nMaxExploredGranularity;
const int nMinValueNumber = 500;
int nValueNumber;
boolean bIsGranularityMaxThresholded;

require(initialDataGrid != NULL);

// Nombre total de valeurs potentielles, base sur le nombre d'individus de la grille
nValueNumber = initialDataGrid->GetGridFrequency();

// Seuillage eventuel de la granularite max pour reduire la complexite algorithmique,
// (sauf dans le cas des petits nombre de valeurs)
bIsGranularityMaxThresholded = false;
if (nValueNumber > nMinValueNumber)
{
// Cas d'une grille 2D supervise avec un attribut a predire avec groupage de la cible
// (classification avec groupage ou regression) et un attribut explicatif numerique
if (initialDataGrid->GetTargetAttribute() != NULL and initialDataGrid->GetTargetValueNumber() == 0 and
initialDataGrid->GetAttributeNumber() == 2 and
initialDataGrid->GetAttributeAt(0)->GetAttributeType() == KWType::Continuous)
bIsGranularityMaxThresholded = true;
// Cas d'une classification supervisee simple avec une paire de variables (numerique ou categorielle)
else if (initialDataGrid->GetTargetValueNumber() > 0 and initialDataGrid->GetAttributeNumber() >= 2 and
nValueNumber > nMinValueNumber)
bIsGranularityMaxThresholded = true;
}

// Cas sans seuillage
if (not bIsGranularityMaxThresholded)
nMaxExploredGranularity = (int)ceil(log(nValueNumber * 1.0) / log(2.0));
// Sinon seuillage
else
nMaxExploredGranularity =
(int)ceil(log(nMinValueNumber + sqrt((nValueNumber - nMinValueNumber) *
log(nValueNumber - nMinValueNumber) / log(2.0))) /
log(2.0));
return nMaxExploredGranularity;
}

double NEWKWDataGridOptimizer::OptimizeGranularizedDataGrid(const KWDataGrid* initialDataGrid,
KWDataGrid* optimizedDataGrid, boolean bIsLastGranularity,
double& dTotalComputeTime) const
Expand Down
5 changes: 5 additions & 0 deletions src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,11 @@ class NEWKWDataGridOptimizer : public Object
// CH IV Refactoring: a supprimer
friend class KWDataGridOptimizer;

// 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
int ComputeMaxExploredGranularity(const KWDataGrid* initialDataGrid) const;

// Optimisation d'une grille pour la granularite courante
// Ajout arguments bIsLastGranularity et dTotalComputeTime
double OptimizeGranularizedDataGrid(const KWDataGrid* initialDataGrid, KWDataGrid* optimizedDataGrid,
Expand Down

0 comments on commit d8db981

Please sign in to comment.