Skip to content

Commit

Permalink
WIP step 9
Browse files Browse the repository at this point in the history
NEWKWDataGridOptimizer
- vérification de l'utilisation de IsOptimizationNeeded
- ajout de quelques tests sur TaskProgression::IsInterruptionRequested()
  • Loading branch information
marcboulle committed Oct 25, 2023
1 parent ba21aad commit 7addf9e
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 60 deletions.
117 changes: 58 additions & 59 deletions src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri
bIsOptimizationNeeded = IsOptimizationNeeded(initialDataGrid);

// Cas ou la grille terminale est ameliorable
if (bIsOptimizationNeeded)
if (bIsOptimizationNeeded and not TaskProgression::IsInterruptionRequested())
{
// Calcul de la granularite max a explorer
nMaxExploredGranularity = ComputeMaxExploredGranularity(initialDataGrid);
Expand Down Expand Up @@ -207,6 +207,8 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri
bIsGranularitySelected = false;
if (granularizedDataGrid.GetInformativeAttributeNumber() > 1)
{
assert(IsOptimizationNeeded(&granularizedDataGrid));

// 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
Expand Down Expand Up @@ -270,6 +272,10 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri
<< dGranularityBestCost << endl;
}

// Arret si interruption utilisateur
if (TaskProgression::IsInterruptionRequested())
break;

// Parametrage du profiling
sSuffix = "";
if (bIsLastGranularity)
Expand All @@ -292,6 +298,8 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri
else
dGranularityBestCost = OptimizeGranularizedDataGrid(
&granularizedDataGrid, granularizedOptimizedDataGrid);

// Fin du parametrage du profiling
NEWKWDataGridOptimizer::GetProfiler()->EndMethod("Optimize granularity" + sSuffix);
if (bDisplayResults)
{
Expand Down Expand Up @@ -534,12 +542,12 @@ double NEWKWDataGridOptimizer::OptimizeGranularizedDataGrid(const KWDataGrid* in
KWDataGrid* optimizedDataGrid) const
{
boolean bDisplayResults = false;
boolean bIsOptimizationNeeded;
double dBestCost;
ALString sTmp;

require(initialDataGrid != NULL);
require(initialDataGrid->Check());
require(IsOptimizationNeeded(initialDataGrid));
require(optimizedDataGrid != NULL);

// Initialisation du meilleur cout
Expand All @@ -555,22 +563,21 @@ double NEWKWDataGridOptimizer::OptimizeGranularizedDataGrid(const KWDataGrid* in
cout << " Cout grille optimale a la granularite courante " << dBestCost << endl;
}

// On determine si on peut potentiellement faire mieux que la grille terminale
bIsOptimizationNeeded = IsOptimizationNeeded(initialDataGrid);

// Optimisation univariee
if (bIsOptimizationNeeded and optimizationParameters.GetUnivariateInitialization() and
if (optimizationParameters.GetUnivariateInitialization() and
initialDataGrid->GetTargetValueNumber() > 0
// on ne fait pas d'univarie si un seul attribut
and initialDataGrid->GetAttributeNumber() > 1)
{
// Rcherche d'une amelioration univariee avec prise en compte de la granularite
dBestCost =
OptimizeWithBestUnivariatePartitionForCurrentGranularity(initialDataGrid, optimizedDataGrid);
// Recherche d'une amelioration univariee avec prise en compte de la granularite
if (not TaskProgression::IsInterruptionRequested())
dBestCost = OptimizeWithBestUnivariatePartitionForCurrentGranularity(initialDataGrid,
optimizedDataGrid);

// Recherche d'une amelioration par croisement des partitions univariees
// Integre la granularite
dBestCost = OptimizeWithMultipleUnivariatePartitions(initialDataGrid, optimizedDataGrid);
if (not TaskProgression::IsInterruptionRequested())
dBestCost = OptimizeWithMultipleUnivariatePartitions(initialDataGrid, optimizedDataGrid);
}

// Affichage
Expand All @@ -581,15 +588,15 @@ double NEWKWDataGridOptimizer::OptimizeGranularizedDataGrid(const KWDataGrid* in
}

// Optimisation a partir d'une grille initiale complete si algorithme glouton
if (bIsOptimizationNeeded)
if (not TaskProgression::IsInterruptionRequested())
dBestCost = IterativeVNSOptimizeDataGrid(initialDataGrid, optimizedDataGrid);

// Tri des parties par attribut, pour preparer les affichages de resultats
// ainsi que les resultats de preparation des donnees
optimizedDataGrid->SortAttributeParts();

// Affichage de la grille finale avec ses couts
if (optimizationParameters.GetDisplayDetails() and bDisplayResults)
if (bDisplayResults)
{
// Grille optimisee
cout << "Optimized grid\n";
Expand Down Expand Up @@ -618,13 +625,13 @@ double NEWKWDataGridOptimizer::SlightOptimizeGranularizedDataGrid(const KWDataGr
{
boolean bDisplayResults = false;
KWDataGridMerger neighbourDataGrid;
boolean bIsOptimizationNeeded;
double dBestCost;
double dCost;
ALString sTmp;

require(initialDataGrid != NULL);
require(initialDataGrid->Check());
require(IsOptimizationNeeded(initialDataGrid));
require(not IsSupervisedDataGrid(initialDataGrid));
require(initialDataGrid->GetGranularity() < ComputeMaxExploredGranularity(initialDataGrid));
require(optimizedDataGrid != NULL);
Expand All @@ -642,59 +649,52 @@ double NEWKWDataGridOptimizer::SlightOptimizeGranularizedDataGrid(const KWDataGr
cout << " Cout grille optimale a la granularite courante " << dBestCost << endl;
}

// On determine si on peut potentiellement faire mieux que la grille terminale
bIsOptimizationNeeded = IsOptimizationNeeded(initialDataGrid);
// Parametrage des couts
neighbourDataGrid.SetDataGridCosts(GetDataGridCosts());

// Optimisation a partir d'une grille initiale complete si algorithme glouton
if (bIsOptimizationNeeded)
{
// Parametrage des couts
neighbourDataGrid.SetDataGridCosts(GetDataGridCosts());
// Generation d'une solution dans un voisinnage de la meilleure solution
NEWKWDataGridOptimizer::GetProfiler()->BeginMethod("Generate neighbour solution");
NEWKWDataGridOptimizer::GetProfiler()->WriteKeyString("Neighbourhood size", "1");
GenerateNeighbourSolution(initialDataGrid, optimizedDataGrid, 1, &neighbourDataGrid);
NEWKWDataGridOptimizer::GetProfiler()->EndMethod("Generate neighbour solution");

// Generation d'une solution dans un voisinnage de la meilleure solution
NEWKWDataGridOptimizer::GetProfiler()->BeginMethod("Generate neighbour solution");
NEWKWDataGridOptimizer::GetProfiler()->WriteKeyString("Neighbourhood size", "1");
GenerateNeighbourSolution(initialDataGrid, optimizedDataGrid, 1, &neighbourDataGrid);
NEWKWDataGridOptimizer::GetProfiler()->EndMethod("Generate neighbour solution");
// Optimisation de cette solution
NEWKWDataGridOptimizer::GetProfiler()->BeginMethod("Slight optimize solution");
dCost = OptimizeSolution(initialDataGrid, &neighbourDataGrid, false);
NEWKWDataGridOptimizer::GetProfiler()->EndMethod("Slight optimize solution");

// Optimisation de cette solution
NEWKWDataGridOptimizer::GetProfiler()->BeginMethod("Slight optimize solution");
dCost = OptimizeSolution(initialDataGrid, &neighbourDataGrid, false);
NEWKWDataGridOptimizer::GetProfiler()->EndMethod("Slight optimize solution");
// Si amelioration: on la memorise
if (dCost < dBestCost - dEpsilon)
{
dBestCost = dCost;
SaveDataGrid(&neighbourDataGrid, optimizedDataGrid);

// Si amelioration: on la memorise
if (dCost < dBestCost - dEpsilon)
{
dBestCost = dCost;
SaveDataGrid(&neighbourDataGrid, optimizedDataGrid);
// Gestion de la meilleure solution
HandleOptimizationStep(optimizedDataGrid, initialDataGrid, false);
}

// Gestion de la meilleure solution
HandleOptimizationStep(optimizedDataGrid, initialDataGrid, false);
}
// Tri des parties par attribut, pour preparer les affichages de resultats
// ainsi que les resultats de preparation des donnees
optimizedDataGrid->SortAttributeParts();

// Tri des parties par attribut, pour preparer les affichages de resultats
// ainsi que les resultats de preparation des donnees
optimizedDataGrid->SortAttributeParts();
// Affichage de la grille finale avec ses couts
if (bDisplayResults)
{
// Grille optimisee
cout << "Optimized grid\n";
if (optimizedDataGrid->GetAttributeNumber() == 2)
optimizedDataGrid->WriteCrossTableStats(cout, 0);
dataGridCosts->WriteDataGridAllCosts(optimizedDataGrid, cout);
cout << endl;

// Affichage de la grille finale avec ses couts
if (optimizationParameters.GetDisplayDetails() and bDisplayResults)
{
// Grille optimisee
cout << "Optimized grid\n";
if (optimizedDataGrid->GetAttributeNumber() == 2)
optimizedDataGrid->WriteCrossTableStats(cout, 0);
dataGridCosts->WriteDataGridAllCosts(optimizedDataGrid, cout);
cout << endl;

// Grille finale
cout << *optimizedDataGrid << endl;
}
// Grille finale
if (bDisplayResults)
{
cout << "Granularite courante \t " << optimizedDataGrid->GetGranularity() << endl;
cout << " Cout meilleure grille " << dBestCost << endl;
}
cout << *optimizedDataGrid << endl;
}
// Grille finale
if (bDisplayResults)
{
cout << "Granularite courante \t " << optimizedDataGrid->GetGranularity() << endl;
cout << " Cout meilleure grille " << dBestCost << endl;
}

// Retour du meilleur cout de codage
Expand Down Expand Up @@ -1074,7 +1074,6 @@ double NEWKWDataGridOptimizer::OptimizeWithMultipleUnivariatePartitions(const KW
dataGridManager.SetSourceDataGrid(initialDataGrid);
multivariateDataGrid.SetDataGridCosts(dataGridCosts);
dataGridPostOptimizer.SetDataGridCosts(dataGridCosts);

if (bDisplayResults)
{
cout << "OptimizeWithMultipleUnivariatePartitions: dBestCost initial " << dBestCost << endl;
Expand Down
2 changes: 1 addition & 1 deletion src/Learning/MODL/MODL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ int main(int argc, char** argv)

// Choix du repertoire de lancement pour le debugage sous Windows (a commenter apres fin du debug)
// SetWindowsDebugDir("Standard", "IrisLight");
SetWindowsDebugDir("Standard", "Iris2D");
// SetWindowsDebugDir("Standard", "Iris2D");

// Parametrage des logs memoires depuis les variables d'environnement, pris en compte dans KWLearningProject
// KhiopsMemStatsLogFileName, KhiopsMemStatsLogFrequency, KhiopsMemStatsLogToCollect
Expand Down

0 comments on commit 7addf9e

Please sign in to comment.