Skip to content

Commit

Permalink
WIP step 2
Browse files Browse the repository at this point in the history
NEWKWDataGridOptimizer::OptimizeDataGrid
- simplification
- amelioration des commentaires
- supression de l'option inutilisee bWithMemoryMode
  • Loading branch information
marcboulle committed Oct 13, 2023
1 parent d8db981 commit 85c3826
Showing 1 changed file with 55 additions and 68 deletions.
123 changes: 55 additions & 68 deletions src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
}

Expand All @@ -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;

Expand All @@ -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
Expand All @@ -172,25 +160,30 @@ 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
ivCurrentPartNumber.SetAt(
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;
Expand All @@ -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;
Expand All @@ -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 = "
Expand All @@ -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");
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 85c3826

Please sign in to comment.