From 9c0714abef13e6583106966e85befe30da9c8d25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Tue, 19 Mar 2024 09:21:43 +0100 Subject: [PATCH 1/3] Fix bugs LearningTest scripts, kht_export and detection of computing type - Bug in copy files that are in suite dirs but do not belong to any test dir Example: \LearningTest\TestKhiops\CrashTests\README.txt - Bug get_context_computing_type: now return "sequential" if process_number is None or is equal to 1 --- .../py/_kht_results_management.py | 2 +- test/LearningTestTool/py/kht_export.py | 43 ++++++++++--------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/test/LearningTestTool/py/_kht_results_management.py b/test/LearningTestTool/py/_kht_results_management.py index 4db2e1f46..ae92d1194 100644 --- a/test/LearningTestTool/py/_kht_results_management.py +++ b/test/LearningTestTool/py/_kht_results_management.py @@ -112,7 +112,7 @@ def get_context_computing_type(log_file=None, show=False): Base sur la variable process_number Une trace est ecrite dans un fichier de log et affichees sur la console si besoin """ - if process_number is None: + if process_number is None or process_number == 1: computing_type = "sequential" else: computing_type = "parallel" diff --git a/test/LearningTestTool/py/kht_export.py b/test/LearningTestTool/py/kht_export.py index a5ca40b32..9cbef5e11 100644 --- a/test/LearningTestTool/py/kht_export.py +++ b/test/LearningTestTool/py/kht_export.py @@ -137,28 +137,20 @@ def export_learning_test_tree( # Parcours des repertoires de test de la suite for test_dir_name in test_dir_names: source_test_dir = os.path.join(source_suite_dir, test_dir_name) - # Gestion des fichiers de la suite (ex: readme), a conserver - if os.path.isfile(source_test_dir): - if export_test_dirs: - source_file_name = source_test_dir - target_file_name = os.path.join( - target_suite_dir, test_dir_name + # Export du contenu de la suite si necessaire + if export_test_dirs: + # Creation du repertoire de l'outil uniquement si necessaire + if not target_tool_dir_created: + utils.make_dir(target_tool_dir) + target_tool_dir_created = os.path.isdir(target_tool_dir) + # Creation du repertoire de suite uniquement si necessaire + if not target_suite_dir_created: + utils.make_dir(target_suite_dir) + target_suite_dir_created = os.path.isdir( + target_suite_dir ) - utils.copy_file(source_file_name, target_file_name) - # Gestion des repertoires de la suite: a exporter ou analyser - if os.path.isdir(source_test_dir): - # Export du repertoire de test si necessaire - if export_test_dirs: - # Creation du repertoire de l'outil uniquement si necessaire - if not target_tool_dir_created: - utils.make_dir(target_tool_dir) - target_tool_dir_created = os.path.isdir(target_tool_dir) - # Creation du repertoire de suite uniquement si necessaire - if not target_suite_dir_created: - utils.make_dir(target_suite_dir) - target_suite_dir_created = os.path.isdir( - target_suite_dir - ) + # Cas d'un repertoire + if os.path.isdir(source_test_dir): # Copie du repertoire de test target_test_dir = os.path.join( target_suite_dir, test_dir_name @@ -169,6 +161,15 @@ def export_learning_test_tree( target_test_dir, ignore_list=forbidden_names, ) + # Cas d'un fichier de la suite (ex: readme), a conserver + if os.path.isfile(source_test_dir): + source_file_name = source_test_dir + target_file_name = os.path.join( + target_suite_dir, test_dir_name + ) + utils.copy_file(source_file_name, target_file_name) + # Gestion des repertoires de la suite a analyser + if os.path.isdir(source_test_dir): # Analyse du scenario pour detecter les jeux de donnees utilises test_prm_path = os.path.join(source_test_dir, kht.TEST_PRM) if os.path.isfile(test_prm_path): From 0779790bc50551f8b6aac8e79d9c173ed8e760de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Tue, 19 Mar 2024 16:01:22 +0100 Subject: [PATCH 2/3] Optimize management of user interruptions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Besoins - amelioration de la gestion des interruptions utilisateurs - mieux gerer la degradation des performances - evaluer l'utilisation actuelle de TaskProgression::IsInterruptionRequested et periodicTestInterruption::IsTestAllowed - evaluer la possibilite des desactiver la gestion des interuption utilisateurs en mode batch Audit rapide du code - Stats de nombre d'utilisation de methodes critiques - TaskProgression::IsInterruptionRequested: 269 - TaskProgression::DisplayTaskProgesssion: 85 - PeriodicTest::IsTestAllowed: 47 (dont dont 17 fois IsTestAllowed(0)) - classe TaskProgression - DisplayTaskProgesssion - les affichages effectifs sont bufferises avec un timer interne (toutes les 0.3 s) - IsInterruptionRequested - les test effectifs sont effectues - immediatement si TaskProgressionManager::IsInterruptionResponsive vaut true - bufferises avec un timer interne sinon - classe TaskProgressionManager - IsInterruptionResponsive: methode virtuelle - FileTaskProgressionManager: responsive=True (et IsInterruptionRequested renvoie toujours false) - UITaskProgression: responsive = false - coherent avec l'interface java - PLMPISlaveProgressionManager: IsInterruptionResponsive = true - non coherent avec l'utilisation des probe dans MPI - PeriodicTest::IsTestAllowed - temporise - par un modulo - et un timer - utilise pour diminuer - le nombre de test d'interruption: redondant avec IsInterruptionRequested dans le cas protege par un timer - le nombre de DisplayTaskProgesssion: redondant avec IsInteDisplayTaskProgesssion toujours protege par un timer - le nombre de construction de message construire pour l'appel a DisplayTaskProgesssion Evolution - TaskProgressionManager::IsInterruptionResponsive: supression de la methode - on considere desormais que le test d'interruption n'est jamais "responsive", et on protege toujours par une timer - TaskProgression::IsRefreshNecessary: nouvelle methode - permet de bufferiser la fabrication des messages pour DisplayTaskProgesssion et le test d'interruption utilisateur - utilise un modulo et les timers deja existant dans TaskProgression - remplace l'utilisation de PeriodicTest::IsTestAllowed - PeriodicTest: supression de la classe et de tous ses usages - une cinquantaine d'impcat un peu partout, remplace par des appels a TaskProgression::IsRefreshNecessary, plus simples - TaskProgression::Set|GetInterruptible - si GetInterruptible vaut false, la methode TaskProgression::IsInterruptionRequested renvoie systematiquement false - sauf si une interruption a ete forcee par programme par la methode ForceInterruptionRequested (utilisee dans les CrashTests et dans les tests unitaires de la librairie Parallel) - parametrage - quand on lance les outils en mode batch (cf. UIObject::SetUIMode) Tests: - validation prealable de tout LearningTest V10.5.0-a1, en mode sequentiel comme en parallele - une vingtaine de jeux de test sont concernes par une version parallel - archivage de la version de reference LearningTest V10.5.0-a1 - apres prise en compte de l'évolution - verification des tests (de non regression (family=full)) en batch sur tout LearningTest, en sequentiel, en parallel - verification que les interruption utilisateurs sont testees dans les CrashTests, meme en batch - verification qu'aucune interruption 'est prise en compte en mode batch, sequentiel et parallele - verification que les interruptions utilisateurs sont prises en compte en mode iunterface graphique, en sequentiel et parallele - tests manuels sur Adult --- .../DTForest/DTGrouperMODLOptimization.cpp | 14 +++--- .../KDTextTokenSampleCollectionTask.cpp | 3 +- .../KWData/KWDataTableDriverTextFile.cpp | 2 +- .../KWData/KWDataTableDriverTextFile.h | 3 -- src/Learning/KWData/KWDatabase.cpp | 10 ++-- src/Learning/KWData/KWDatabase.h | 4 -- src/Learning/KWData/KWMTDatabase.cpp | 4 +- .../KWAttributeSubsetStats.cpp | 6 +-- .../KWAttributeSubsetStats.h | 6 +-- .../KWDataPreparationUnivariateTask.cpp | 3 +- .../KWDataPreparation/KWDiscretizerMODL.cpp | 6 +-- .../KWGrouperMODLOptimization.cpp | 21 ++++---- .../KWDataUtils/KWDataTableSliceSet.cpp | 8 ++-- src/Learning/KWDataUtils/KWDatabaseTask.cpp | 4 +- .../KWDataUtils/KWFileKeyExtractorTask.cpp | 6 +-- .../KWDataUtils/KWKeyPositionFinderTask.cpp | 4 +- .../KWKeyPositionSampleExtractorTask.cpp | 4 +- .../KWDataUtils/KWKeySampleExtractorTask.cpp | 3 +- .../KWDataUtils/KWSortedChunkBuilderTask.cpp | 4 +- .../KWModeling/KWClassifierPostOptimizer.cpp | 3 +- .../CCCoclusteringBuilder.cpp | 12 ++--- .../SNBDataTableBinarySliceSet.cpp | 3 +- src/Norm/base/TaskProgression.cpp | 39 +++++++-------- src/Norm/base/TaskProgression.h | 33 +++++++++++++ src/Norm/base/TaskProgressionManager.cpp | 5 -- src/Norm/base/TaskProgressionManager.h | 5 -- src/Norm/base/Timer.h | 48 ------------------- src/Norm/base/UIObject.cpp | 5 ++ src/Norm/base/UITaskProgression.cpp | 5 -- src/Norm/base/UserInterface.h | 2 +- .../PLMPI/PLMPISlaveProgressionManager.cpp | 5 -- .../PLMPI/PLMPISlaveProgressionManager.h | 1 - src/Parallel/PLSamples/PEFileSearchTask.cpp | 4 +- 33 files changed, 106 insertions(+), 179 deletions(-) diff --git a/src/Learning/DTForest/DTGrouperMODLOptimization.cpp b/src/Learning/DTForest/DTGrouperMODLOptimization.cpp index 0dedc8b7d..0c6966173 100644 --- a/src/Learning/DTForest/DTGrouperMODLOptimization.cpp +++ b/src/Learning/DTForest/DTGrouperMODLOptimization.cpp @@ -1341,7 +1341,6 @@ void DTGrouperMODL::FastPostOptimizeGroups(KWFrequencyTable* kwftSource, KWFrequ double dBestDeltaCost; double dBestInDeltaCost; int nBestInGroup; - PeriodicTest periodicTestOptimize; require(kwftSource != NULL); require(kwftTarget != NULL); @@ -1388,7 +1387,7 @@ void DTGrouperMODL::FastPostOptimizeGroups(KWFrequencyTable* kwftSource, KWFrequ nStepNumber++; // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and TaskProgression::IsInterruptionRequested()) + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; // Perturbation aleatoire des index de modalites et de groupes @@ -1420,7 +1419,7 @@ void DTGrouperMODL::FastPostOptimizeGroups(KWFrequencyTable* kwftSource, KWFrequ nInGroup = ivGroupIndexes.GetAt((nStart + n2) % nGroupNumber); // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; @@ -1454,7 +1453,7 @@ void DTGrouperMODL::FastPostOptimizeGroups(KWFrequencyTable* kwftSource, KWFrequ } // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and TaskProgression::IsInterruptionRequested()) + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; // On effectue si necessaire le meilleur transfert de groupe @@ -1529,7 +1528,6 @@ void DTGrouperMODL::FastPostOptimizeGroupsWithGarbage(KWFrequencyTable* kwftSour double dBestDeltaCost; double dBestInDeltaCost; int nBestInGroup; - PeriodicTest periodicTestOptimize; POSITION position; KWFrequencyVector* frequencyVector; int nGarbageModalityNumber; @@ -1603,7 +1601,7 @@ void DTGrouperMODL::FastPostOptimizeGroupsWithGarbage(KWFrequencyTable* kwftSour nStepNumber++; // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and TaskProgression::IsInterruptionRequested()) + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; // Perturbation aleatoire des index de modalites et de groupes @@ -1641,7 +1639,7 @@ void DTGrouperMODL::FastPostOptimizeGroupsWithGarbage(KWFrequencyTable* kwftSour nInGroup = ivGroupIndexes.GetAt((nStart + n2) % nGroupNumber); // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; @@ -1806,7 +1804,7 @@ void DTGrouperMODL::FastPostOptimizeGroupsWithGarbage(KWFrequencyTable* kwftSour } // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and TaskProgression::IsInterruptionRequested()) + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; // On effectue si necessaire le meilleur transfert de groupe diff --git a/src/Learning/KDDomainKnowledge/KDTextTokenSampleCollectionTask.cpp b/src/Learning/KDDomainKnowledge/KDTextTokenSampleCollectionTask.cpp index 0b6a04f8d..b96be0a6a 100644 --- a/src/Learning/KDDomainKnowledge/KDTextTokenSampleCollectionTask.cpp +++ b/src/Learning/KDDomainKnowledge/KDTextTokenSampleCollectionTask.cpp @@ -297,7 +297,6 @@ boolean KDTextTokenSampleCollectionTask::SequentialCollectTokenSamples(const KWD boolean KDTextTokenSampleCollectionTask::AnalyseDatabase(KWDatabase* database, ObjectArray* oaTextTokenizers) { boolean bOk = true; - PeriodicTest periodicTestInterruption; KWObject* kwoObject; longint lObjectNumber; longint lRecordNumber; @@ -356,7 +355,7 @@ boolean KDTextTokenSampleCollectionTask::AnalyseDatabase(KWDatabase* database, O } // Suivi de la tache - if (periodicTestInterruption.IsTestAllowed(lRecordNumber)) + if (TaskProgression::IsRefreshNecessary()) TaskProgression::DisplayProgression((int)(100 * database->GetReadPercentage())); } Global::DesactivateErrorFlowControl(); diff --git a/src/Learning/KWData/KWDataTableDriverTextFile.cpp b/src/Learning/KWData/KWDataTableDriverTextFile.cpp index 6ba5b2cf8..5e06a34b4 100644 --- a/src/Learning/KWData/KWDataTableDriverTextFile.cpp +++ b/src/Learning/KWData/KWDataTableDriverTextFile.cpp @@ -318,7 +318,7 @@ KWObject* KWDataTableDriverTextFile::Read() require(not inputBuffer->IsBufferEnd()); // On retourne NULL, sans message, si interruption utilisateur - if (periodicTestInterruption.IsTestAllowed(lRecordIndex)) + if (TaskProgression::IsRefreshNecessary()) { if (TaskProgression::IsInterruptionRequested()) return NULL; diff --git a/src/Learning/KWData/KWDataTableDriverTextFile.h b/src/Learning/KWData/KWDataTableDriverTextFile.h index 0442ed94a..b82c5dc03 100644 --- a/src/Learning/KWData/KWDataTableDriverTextFile.h +++ b/src/Learning/KWData/KWDataTableDriverTextFile.h @@ -162,9 +162,6 @@ class KWDataTableDriverTextFile : public KWDataTableDriver // coherente des flags internes de gestion du fichier virtual void ResetDatabaseFile(); - // Memorisation de l'etat de suivi des taches - PeriodicTest periodicTestInterruption; - // Utilisation d'une ligne d'en-tete boolean bHeaderLineUsed; diff --git a/src/Learning/KWData/KWDatabase.cpp b/src/Learning/KWData/KWDatabase.cpp index 3159f7965..d1c94bda9 100644 --- a/src/Learning/KWData/KWDatabase.cpp +++ b/src/Learning/KWData/KWDatabase.cpp @@ -364,7 +364,7 @@ KWClass* KWDatabase::ComputeClass() } // Suivi de la tache - if (periodicTestDisplay.IsTestAllowed(lRecordNumber)) + if (TaskProgression::IsRefreshNecessary()) { TaskProgression::DisplayProgression((int)(100 * GetReadPercentage())); if (TaskProgression::IsInterruptionRequested()) @@ -774,7 +774,7 @@ boolean KWDatabase::ReadAll() } // Suivi de la tache - if (periodicTestInterruption.IsTestAllowed(lRecordNumber)) + if (TaskProgression::IsRefreshNecessary()) { TaskProgression::DisplayProgression((int)(100 * GetReadPercentage())); DisplayReadTaskProgressionLabel(lRecordNumber, lObjectNumber); @@ -850,7 +850,7 @@ void KWDatabase::DeleteAll() delete oaAllObjects.GetAt(nObject); // Suivi de la tache (sans test d'interruption: il faut detruire tous les objets) - if (periodicTestDisplay.IsTestAllowed(nObject)) + if (TaskProgression::IsRefreshNecessary()) TaskProgression::DisplayProgression((int)(nObject * 100.0 / oaAllObjects.GetSize())); if (bDisplay) { @@ -917,14 +917,12 @@ boolean KWDatabase::WriteAll(KWDatabase* sourceObjects) } // Suivi de la tache - if (periodicTestDisplay.IsTestAllowed(lObjectNumber)) + if (TaskProgression::IsRefreshNecessary()) { TaskProgression::DisplayProgression( (int)(nObject * 100.0 / sourceObjects->GetObjects()->GetSize())); if (TaskProgression::IsInterruptionRequested()) - { break; - } } } Global::DesactivateErrorFlowControl(); diff --git a/src/Learning/KWData/KWDatabase.h b/src/Learning/KWData/KWDatabase.h index f4bf06288..7fa06bf0e 100644 --- a/src/Learning/KWData/KWDatabase.h +++ b/src/Learning/KWData/KWDatabase.h @@ -574,10 +574,6 @@ class KWDatabase : public Object Continuous cSelectionContinuous; IntVector ivMarkedInstances; - // Memorisation de l'etat de suivi des taches - PeriodicTest periodicTestInterruption; - PeriodicTest periodicTestDisplay; - // Formats par defaut des types complexes, pour gerer les conversions vers les chaines de caracteres KWDateFormat dateDefaultConverter; KWTimeFormat timeDefaultConverter; diff --git a/src/Learning/KWData/KWMTDatabase.cpp b/src/Learning/KWData/KWMTDatabase.cpp index 527081767..8f6ecd9f8 100644 --- a/src/Learning/KWData/KWMTDatabase.cpp +++ b/src/Learning/KWData/KWMTDatabase.cpp @@ -1670,7 +1670,7 @@ boolean KWMTDatabase::PhysicalReadAllReferenceObjects(double dSamplePercentage) break; // Suivi de la tache - if (bIsInTask and periodicTestInterruption.IsTestAllowed(lRecordNumber)) + if (bIsInTask and TaskProgression::IsRefreshNecessary()) { TaskProgression::DisplayLabel(sMessage + ": " + LongintToReadableString(lObjectNumber) + @@ -1753,7 +1753,7 @@ boolean KWMTDatabase::PhysicalReadAllReferenceObjects(double dSamplePercentage) // Suivi de la tache lRecordNumber++; - if (bIsInTask and periodicTestInterruption.IsTestAllowed(lRecordNumber)) + if (bIsInTask and TaskProgression::IsRefreshNecessary()) { if (TaskProgression::IsInterruptionRequested()) { diff --git a/src/Learning/KWDataPreparation/KWAttributeSubsetStats.cpp b/src/Learning/KWDataPreparation/KWAttributeSubsetStats.cpp index f9355982e..d741471e6 100644 --- a/src/Learning/KWDataPreparation/KWAttributeSubsetStats.cpp +++ b/src/Learning/KWDataPreparation/KWAttributeSubsetStats.cpp @@ -690,7 +690,7 @@ boolean KWAttributeSubsetStats::CreateAttributeIntervals(const KWTupleTable* tup tuple = attributeTupleTable.GetAt(nTuple); // Progression - if (periodicTestDisplay.IsTestAllowed(nTuple)) + if (TaskProgression::IsRefreshNecessary()) { // CH IV Begin // Cas d'un attribut de grille, qui n'est pas un attribut interne d'un attribut VarPart @@ -786,7 +786,7 @@ boolean KWAttributeSubsetStats::CreateAttributeValueSets(const KWTupleTable* tup attributeTupleTable.GetAt(nTuple - 1)->GetSymbolAt(0).CompareValue(tuple->GetSymbolAt(0)) < 0); // Progression - if (periodicTestDisplay.IsTestAllowed(nTuple)) + if (TaskProgression::IsRefreshNecessary()) { // CH IV Begin // Cas d'un attribut de grille, qui n'est pas un attribut interne d'un attribut VarPart @@ -965,7 +965,7 @@ boolean KWAttributeSubsetStats::CreateDataGridCells(const KWTupleTable* tupleTab tuple = tupleTable->GetAt(nTuple); // Progression - if (periodicTestDisplay.IsTestAllowed(nTuple)) + if (TaskProgression::IsRefreshNecessary()) { TaskProgression::DisplayProgression((int)(50 + nTuple * 50.0 / tupleTable->GetSize())); if (TaskProgression::IsInterruptionRequested()) diff --git a/src/Learning/KWDataPreparation/KWAttributeSubsetStats.h b/src/Learning/KWDataPreparation/KWAttributeSubsetStats.h index 1466ae575..9bf29de7b 100644 --- a/src/Learning/KWDataPreparation/KWAttributeSubsetStats.h +++ b/src/Learning/KWDataPreparation/KWAttributeSubsetStats.h @@ -171,13 +171,11 @@ class KWAttributeSubsetStats : public KWDataPreparationStats // Parametre avance. Par defaut: 0 signifie qu'il n'y a pas de contrainte int nMaxCellNumberConstraint; - // Gestion des tests pour le suivi des taches - PeriodicTest periodicTestDisplay; - friend class PLShared_AttributeSubsetStats; - // Pre-granularisation des attributs numeriques cible (regression) et des attributs numeriques explicatifs en // analyse non supervisee (co-clustering) static boolean bPregranularizedNumericalAttributes; + + friend class PLShared_AttributeSubsetStats; }; /////////////////////////////////////////////////////// diff --git a/src/Learning/KWDataPreparation/KWDataPreparationUnivariateTask.cpp b/src/Learning/KWDataPreparation/KWDataPreparationUnivariateTask.cpp index b67576aa2..ee792683e 100644 --- a/src/Learning/KWDataPreparation/KWDataPreparationUnivariateTask.cpp +++ b/src/Learning/KWDataPreparation/KWDataPreparationUnivariateTask.cpp @@ -1111,7 +1111,6 @@ boolean KWDataPreparationUnivariateTask::SplitSlice(KWDataTableSlice* slice, int int nSubSliceBlockIndex; int nSliceDenseSymbolAttributeIndex; int nSubSliceDenseAttributeIndex; - PeriodicTest periodicTestInterruption; KWObject* kwoObject; longint lRecordNumber; ALString sSliceBaseName; @@ -1239,7 +1238,7 @@ boolean KWDataPreparationUnivariateTask::SplitSlice(KWDataTableSlice* slice, int } // Suivi de la tache - if (periodicTestInterruption.IsTestAllowed(lRecordNumber)) + if (TaskProgression::IsRefreshNecessary()) TaskProgression::DisplayProgression( (int)(100 * slice->GetReadPercentage())); } diff --git a/src/Learning/KWDataPreparation/KWDiscretizerMODL.cpp b/src/Learning/KWDataPreparation/KWDiscretizerMODL.cpp index aa4d7225b..561c2ab66 100644 --- a/src/Learning/KWDataPreparation/KWDiscretizerMODL.cpp +++ b/src/Learning/KWDataPreparation/KWDiscretizerMODL.cpp @@ -1547,7 +1547,6 @@ void KWDiscretizerMODL::IntervalListPostOptimization(const KWFrequencyTable* kwf int nIntervalNumber; int nSurnumerousIntervalNumber; int nStepNumber; - PeriodicTest periodicTestOptimize; require(kwftSource != NULL); require(headInterval != NULL); @@ -1590,7 +1589,7 @@ void KWDiscretizerMODL::IntervalListPostOptimization(const KWFrequencyTable* kwf nStepNumber++; // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and TaskProgression::IsInterruptionRequested()) + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; // Calcul du nombre d'inetrvalles surnumeraires pour la prise en compte de @@ -1763,7 +1762,6 @@ void KWDiscretizerMODL::IntervalListBoundaryPostOptimization(const KWFrequencyTa double dBestDeltaCost; int nIntervalNumber; int nStepNumber; - PeriodicTest periodicTestOptimize; require(kwftSource != NULL); require(headInterval != NULL); @@ -1801,7 +1799,7 @@ void KWDiscretizerMODL::IntervalListBoundaryPostOptimization(const KWFrequencyTa nStepNumber++; // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and TaskProgression::IsInterruptionRequested()) + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; // Recherche du meilleur MergeSplit et de son cout diff --git a/src/Learning/KWDataPreparation/KWGrouperMODLOptimization.cpp b/src/Learning/KWDataPreparation/KWGrouperMODLOptimization.cpp index ae1723fe0..b682af1fb 100644 --- a/src/Learning/KWDataPreparation/KWGrouperMODLOptimization.cpp +++ b/src/Learning/KWDataPreparation/KWGrouperMODLOptimization.cpp @@ -1342,7 +1342,6 @@ void KWGrouperMODL::FastPostOptimizeGroups(KWFrequencyTable* kwftSource, KWFrequ double dBestDeltaCost; double dBestInDeltaCost; int nBestInGroup; - PeriodicTest periodicTestOptimize; require(kwftSource != NULL); require(kwftTarget != NULL); @@ -1388,7 +1387,7 @@ void KWGrouperMODL::FastPostOptimizeGroups(KWFrequencyTable* kwftSource, KWFrequ nStepNumber++; // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and TaskProgression::IsInterruptionRequested()) + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; // Perturbation aleatoire des index de modalites et de groupes @@ -1420,7 +1419,7 @@ void KWGrouperMODL::FastPostOptimizeGroups(KWFrequencyTable* kwftSource, KWFrequ nInGroup = ivGroupIndexes.GetAt((nStart + n2) % nGroupNumber); // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; @@ -1454,7 +1453,7 @@ void KWGrouperMODL::FastPostOptimizeGroups(KWFrequencyTable* kwftSource, KWFrequ } // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and TaskProgression::IsInterruptionRequested()) + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; // On effectue si necessaire le meilleur transfert de groupe @@ -1528,7 +1527,6 @@ void KWGrouperMODL::FastPostOptimizeGroupsWithGarbage(KWFrequencyTable* kwftSour double dBestDeltaCost; double dBestInDeltaCost; int nBestInGroup; - PeriodicTest periodicTestOptimize; POSITION position; KWFrequencyVector* frequencyVector; int nGarbageModalityNumber; @@ -1602,7 +1600,7 @@ void KWGrouperMODL::FastPostOptimizeGroupsWithGarbage(KWFrequencyTable* kwftSour nStepNumber++; // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and TaskProgression::IsInterruptionRequested()) + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; // Perturbation aleatoire des index de modalites et de groupes @@ -1640,7 +1638,7 @@ void KWGrouperMODL::FastPostOptimizeGroupsWithGarbage(KWFrequencyTable* kwftSour nInGroup = ivGroupIndexes.GetAt((nStart + n2) % nGroupNumber); // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; @@ -1805,7 +1803,7 @@ void KWGrouperMODL::FastPostOptimizeGroupsWithGarbage(KWFrequencyTable* kwftSour } // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and TaskProgression::IsInterruptionRequested()) + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; // On effectue si necessaire le meilleur transfert de groupe @@ -1913,7 +1911,6 @@ void KWGrouperMODL::EMPostOptimizeGroupsWithGarbage(KWFrequencyTable* kwftSource double dBestDeltaCost; double dBestInDeltaCost; int nBestInGroup; - PeriodicTest periodicTestOptimize; POSITION position; KWFrequencyTable kwftImproved; SortedList improvedFrequencyList(KWFrequencyVectorModalityNumberCompare); @@ -1993,7 +1990,7 @@ void KWGrouperMODL::EMPostOptimizeGroupsWithGarbage(KWFrequencyTable* kwftSource nStepNumber++; // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and TaskProgression::IsInterruptionRequested()) + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; // Parcours de toutes les modalites @@ -2026,7 +2023,7 @@ void KWGrouperMODL::EMPostOptimizeGroupsWithGarbage(KWFrequencyTable* kwftSource for (nInGroup = 0; nInGroup < nGroupNumber; nInGroup++) { // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; @@ -2179,7 +2176,7 @@ void KWGrouperMODL::EMPostOptimizeGroupsWithGarbage(KWFrequencyTable* kwftSource } // Test si arret de tache demandee - if (periodicTestOptimize.IsTestAllowed(0) and TaskProgression::IsInterruptionRequested()) + if (TaskProgression::IsRefreshNecessary() and TaskProgression::IsInterruptionRequested()) break; // On memorise le meilleur transfert de la modalite courante vers un nouveau groupe s'il existe diff --git a/src/Learning/KWDataUtils/KWDataTableSliceSet.cpp b/src/Learning/KWDataUtils/KWDataTableSliceSet.cpp index b7fb6d829..8831c90cb 100644 --- a/src/Learning/KWDataUtils/KWDataTableSliceSet.cpp +++ b/src/Learning/KWDataUtils/KWDataTableSliceSet.cpp @@ -1285,7 +1285,6 @@ boolean KWDataTableSliceSet::Close() boolean KWDataTableSliceSet::ReadAllObjectsWithClass(const KWClass* kwcInputClass, ObjectArray* oaReadObjects) { boolean bOk = true; - PeriodicTest periodicTestInterruption; KWObject* kwoObject; longint lRecordNumber; ALString sTmp; @@ -1332,7 +1331,7 @@ boolean KWDataTableSliceSet::ReadAllObjectsWithClass(const KWClass* kwcInputClas } // Suivi de la tache - if (periodicTestInterruption.IsTestAllowed(lRecordNumber)) + if (TaskProgression::IsRefreshNecessary()) TaskProgression::DisplayProgression((int)(100 * GetReadPercentage())); } Global::DesactivateErrorFlowControl(); @@ -3136,7 +3135,6 @@ boolean KWDataTableSlice::Close() boolean KWDataTableSlice::ReadAll() { boolean bOk = true; - PeriodicTest periodicTestInterruption; KWObject* kwoObject; longint lRecordNumber; @@ -3173,7 +3171,7 @@ boolean KWDataTableSlice::ReadAll() } // Suivi de la tache - if (periodicTestInterruption.IsTestAllowed(lRecordNumber)) + if (TaskProgression::IsRefreshNecessary()) TaskProgression::DisplayProgression((int)(100 * GetReadPercentage())); } Global::DesactivateErrorFlowControl(); @@ -3916,7 +3914,7 @@ boolean KWDataTableDriverSlice::ReadObject(KWObject* kwoObject) require(kwoObject->GetClass() == GetClass()); // On retourne NULL, sans message, si interruption utilisateur - if (periodicTestInterruption.IsTestAllowed(lRecordIndex)) + if (TaskProgression::IsRefreshNecessary()) { if (TaskProgression::IsInterruptionRequested()) return false; diff --git a/src/Learning/KWDataUtils/KWDatabaseTask.cpp b/src/Learning/KWDataUtils/KWDatabaseTask.cpp index 6a43d974b..e16f7a5d9 100644 --- a/src/Learning/KWDataUtils/KWDatabaseTask.cpp +++ b/src/Learning/KWDataUtils/KWDatabaseTask.cpp @@ -758,7 +758,6 @@ boolean KWDatabaseTask::SlaveProcessStartDatabase() ALString sChunkFileName; int nBufferSize; longint lChunkSize; - PeriodicTest periodicTestInterruption; ALString sTmp; // Initialisation des variables de travail @@ -929,7 +928,6 @@ boolean KWDatabaseTask::SlaveProcessExploitDatabase() KWObjectKey lastRootObjectKey; KWObject* kwoObject; ALString sChunkFileName; - PeriodicTest periodicTestInterruption; PLDataTableDriverTextFile* rootDriver; double dProgression; ALString sTmp; @@ -959,7 +957,7 @@ boolean KWDatabaseTask::SlaveProcessExploitDatabase() while (not sourceDatabase->IsEnd()) { // Suivi de la tache - if (periodicTestInterruption.IsTestAllowed(lRecordNumber)) + if (TaskProgression::IsRefreshNecessary()) { // Avancement dProgression = rootDriver->GetReadPercentage(); diff --git a/src/Learning/KWDataUtils/KWFileKeyExtractorTask.cpp b/src/Learning/KWDataUtils/KWFileKeyExtractorTask.cpp index 1bd49f0ed..a65671aa5 100644 --- a/src/Learning/KWDataUtils/KWFileKeyExtractorTask.cpp +++ b/src/Learning/KWDataUtils/KWFileKeyExtractorTask.cpp @@ -523,7 +523,6 @@ boolean KWFileKeyExtractorTask::SlaveProcess() longint lNextLinePos; boolean bLineTooLong; int nCumulatedLineNumber; - PeriodicTest periodicTestInterruption; boolean bIsLineOK; ALString sTmp; @@ -616,8 +615,7 @@ boolean KWFileKeyExtractorTask::SlaveProcess() while (bOk and not inputFile.IsBufferEnd()) { // Gestion de la progresssion - if (periodicTestInterruption.IsTestAllowed(nCumulatedLineNumber + - inputFile.GetCurrentLineIndex())) + if (TaskProgression::IsRefreshNecessary()) { // Calcul de la progression par rapport a la proportion de la portion du fichier // traitee parce que l'on ne sait pas le nombre total de ligne que l'on va @@ -694,7 +692,7 @@ boolean KWFileKeyExtractorTask::SlaveProcess() } } - // On ajoute un test sur l'interruption car pour les petits fichiers IsTestAllowed n'est jamais declenchee dans + // On ajoute un test sur l'interruption car pour les petits fichiers IsRefreshNecessary n'est jamais declenchee dans // la boucle precedente et l'interruption n'est pas detectee, il faut neanmoins detruire les fichiers // temporaires if (TaskProgression::IsInterruptionRequested()) diff --git a/src/Learning/KWDataUtils/KWKeyPositionFinderTask.cpp b/src/Learning/KWDataUtils/KWKeyPositionFinderTask.cpp index 59c9afe1b..0f9f4a726 100644 --- a/src/Learning/KWDataUtils/KWKeyPositionFinderTask.cpp +++ b/src/Learning/KWDataUtils/KWKeyPositionFinderTask.cpp @@ -985,7 +985,6 @@ boolean KWKeyPositionFinderTask::SlaveProcess() KWKey* inputKey; int nInputKeyIndex; longint lLinePosition; - PeriodicTest periodicTestInterruption; double dProgression; longint lBeginPos; longint lMaxEndPos; @@ -1076,8 +1075,7 @@ boolean KWKeyPositionFinderTask::SlaveProcess() lLinePosition = inputFile.GetPositionInFile(); // Gestion de la progresssion - if (periodicTestInterruption.IsTestAllowed(nCumulatedLineNumber + - inputFile.GetCurrentLineIndex())) + if (TaskProgression::IsRefreshNecessary()) { // Calcul de la progression par rapport a la proportion de la portion du fichier // traitee parce que l'on ne sait pas le nombre total de ligne que l'on va diff --git a/src/Learning/KWDataUtils/KWKeyPositionSampleExtractorTask.cpp b/src/Learning/KWDataUtils/KWKeyPositionSampleExtractorTask.cpp index c96d32e14..ad493ac7b 100644 --- a/src/Learning/KWDataUtils/KWKeyPositionSampleExtractorTask.cpp +++ b/src/Learning/KWDataUtils/KWKeyPositionSampleExtractorTask.cpp @@ -575,7 +575,6 @@ boolean KWKeyPositionSampleExtractorTask::SlaveProcess() ObjectArray* oaKeyPositionSample; KWKeyPosition* previousRecordKeyPosition; KWKeyPosition* recordKeyPosition; - PeriodicTest periodicTestInterruption; double dProgression; int nCompareKey; longint lBeginPos; @@ -639,8 +638,7 @@ boolean KWKeyPositionSampleExtractorTask::SlaveProcess() while (bOk and not inputFile.IsBufferEnd()) { // Gestion de la progresssion - if (periodicTestInterruption.IsTestAllowed(nCumulatedLineNumber + - inputFile.GetCurrentLineIndex())) + if (TaskProgression::IsRefreshNecessary()) { // Calcul de la progression par rapport a la proportion de la portion du fichier traitee // parce que l'on ne sait pas le nombre total de ligne que l'on va traiter diff --git a/src/Learning/KWDataUtils/KWKeySampleExtractorTask.cpp b/src/Learning/KWDataUtils/KWKeySampleExtractorTask.cpp index 32265ac76..52de5f043 100644 --- a/src/Learning/KWDataUtils/KWKeySampleExtractorTask.cpp +++ b/src/Learning/KWDataUtils/KWKeySampleExtractorTask.cpp @@ -701,7 +701,6 @@ boolean KWKeySampleExtractorTask::SlaveProcess() { boolean bOk = true; KWKey* recordKey; - PeriodicTest periodicTestInterruption; double dProgression; int nCount; longint lBeginPos; @@ -757,7 +756,7 @@ boolean KWKeySampleExtractorTask::SlaveProcess() { // Gestion de la progesssion nCount++; - if (periodicTestInterruption.IsTestAllowed(nCount)) + if (TaskProgression::IsRefreshNecessary()) { dProgression = inputFile.GetCurrentLineIndex() * 1.0 / inputFile.GetBufferLineNumber(); TaskProgression::DisplayProgression((int)floor(dProgression * 100)); diff --git a/src/Learning/KWDataUtils/KWSortedChunkBuilderTask.cpp b/src/Learning/KWDataUtils/KWSortedChunkBuilderTask.cpp index 0b58e62a0..8734ee6d1 100644 --- a/src/Learning/KWDataUtils/KWSortedChunkBuilderTask.cpp +++ b/src/Learning/KWDataUtils/KWSortedChunkBuilderTask.cpp @@ -611,7 +611,6 @@ boolean KWSortedChunkBuilderTask::SlaveProcess() longint lNextLinePos; boolean bLineTooLong; int nCumulatedLineNumber; - PeriodicTest periodicTestInterruption; boolean bIsLineOk; if (not input_bLastRound) @@ -681,8 +680,7 @@ boolean KWSortedChunkBuilderTask::SlaveProcess() while (bOk and not inputFile.IsBufferEnd()) { // Gestion de la progresssion - if (periodicTestInterruption.IsTestAllowed(nCumulatedLineNumber + - inputFile.GetCurrentLineIndex())) + if (TaskProgression::IsRefreshNecessary()) { // Calcul de la progression par rapport a la proportion de la portion du // fichier traitee parce que l'on ne sait pas le nombre total de ligne diff --git a/src/Learning/KWModeling/KWClassifierPostOptimizer.cpp b/src/Learning/KWModeling/KWClassifierPostOptimizer.cpp index c1b45fc1d..e98bfde93 100644 --- a/src/Learning/KWModeling/KWClassifierPostOptimizer.cpp +++ b/src/Learning/KWModeling/KWClassifierPostOptimizer.cpp @@ -534,7 +534,6 @@ boolean KWClassifierPostOptimizer::LoadWorkingData(KWPredictor* predictor, KWTra KWLoadIndex liTargetAttributeLoadIndex; KWLoadIndexVector livProbAttributeLoadIndexes; KWLoadIndex liProbAttributeLoadIndex; - PeriodicTest periodicTestInterruption; require(predictor->GetTrainParameters()->GetClassifierCriterion() != "None"); require(trainedClassifier->GetTargetValueNumber() > 1); @@ -652,7 +651,7 @@ boolean KWClassifierPostOptimizer::LoadWorkingData(KWPredictor* predictor, KWTra } // Suivi de la tache - if (periodicTestInterruption.IsTestAllowed(lRecordNumber)) + if (TaskProgression::IsRefreshNecessary()) { TaskProgression::DisplayProgression( (int)(100 * evaluationDatabase->GetReadPercentage())); diff --git a/src/Learning/MODL_Coclustering/CCCoclusteringBuilder.cpp b/src/Learning/MODL_Coclustering/CCCoclusteringBuilder.cpp index 25da3a535..70a70668f 100644 --- a/src/Learning/MODL_Coclustering/CCCoclusteringBuilder.cpp +++ b/src/Learning/MODL_Coclustering/CCCoclusteringBuilder.cpp @@ -1725,7 +1725,7 @@ boolean CCCoclusteringBuilder::CreateVarPartDataGridCells(const KWTupleTable* tu tuple = tupleTable->GetAt(nTuple); // Progression - if (periodicTestDisplay.IsTestAllowed(nTuple)) + if (TaskProgression::IsRefreshNecessary()) { TaskProgression::DisplayProgression((int)(50 + nTuple * 50.0 / tupleTable->GetSize())); if (TaskProgression::IsInterruptionRequested()) @@ -2230,7 +2230,6 @@ boolean CCCoclusteringBuilder::FillTupleTableFromDatabase(KWDatabase* database, longint lRecordNumber; int nObjectFrequency; longint lTotalFrequency; - PeriodicTest periodicTestInterruption; ALString sTmp; require(not GetVarPartCoclustering()); @@ -2366,7 +2365,7 @@ boolean CCCoclusteringBuilder::FillTupleTableFromDatabase(KWDatabase* database, } // Suivi de la tache - if (periodicTestInterruption.IsTestAllowed(lRecordNumber)) + if (TaskProgression::IsRefreshNecessary()) { TaskProgression::DisplayProgression((int)(100 * database->GetReadPercentage())); database->DisplayReadTaskProgressionLabel(lRecordNumber, lObjectNumber); @@ -2434,7 +2433,6 @@ boolean CCCoclusteringBuilder::FillVarPartTupleTableFromDatabase(KWDatabase* dat longint lRecordNumber; int nObjectFrequency; longint lTotalFrequency; - PeriodicTest periodicTestInterruption; int nObjectObservationNumber; IntObject* ioObservationNumber; ALString sTmp; @@ -2623,7 +2621,7 @@ boolean CCCoclusteringBuilder::FillVarPartTupleTableFromDatabase(KWDatabase* dat } // Suivi de la tache - if (periodicTestInterruption.IsTestAllowed(lRecordNumber)) + if (TaskProgression::IsRefreshNecessary()) { TaskProgression::DisplayProgression((int)(100 * database->GetReadPercentage())); database->DisplayReadTaskProgressionLabel(lRecordNumber, lObjectNumber); @@ -2747,7 +2745,7 @@ boolean CCCoclusteringBuilder::CreateIdentifierAttributeIntervals(const KWTupleT tuple = attributeTupleTable.GetAt(nTuple); // Progression - if (periodicTestDisplay.IsTestAllowed(nTuple)) + if (TaskProgression::IsRefreshNecessary()) { // Cas d'un attribut de grille standard, non interne dans un attribut VarPart if (not dgAttribute->IsInnerAttribute()) @@ -2870,7 +2868,7 @@ boolean CCCoclusteringBuilder::CreateIdentifierAttributeValueSets(const KWTupleT attributeTupleTable.GetAt(nTuple - 1)->GetSymbolAt(0).CompareValue(tuple->GetSymbolAt(0)) < 0); // Progression - if (periodicTestDisplay.IsTestAllowed(nTuple)) + if (TaskProgression::IsRefreshNecessary()) { // Cas d'un attribut de grille standard, non interne dans un attribut VarPart // Sinon GetDataGrid() n'est pas defini diff --git a/src/Learning/SNBPredictor/SNBDataTableBinarySliceSet.cpp b/src/Learning/SNBPredictor/SNBDataTableBinarySliceSet.cpp index ffe39c18b..981028cd2 100644 --- a/src/Learning/SNBPredictor/SNBDataTableBinarySliceSet.cpp +++ b/src/Learning/SNBPredictor/SNBDataTableBinarySliceSet.cpp @@ -1291,7 +1291,6 @@ boolean SNBDataTableBinarySliceSetBuffer::LoadBlockFromSliceSetAt(int nChunk, in int nAttribute; IntVector* ivAttributeIndexes; Continuous cIndex; - PeriodicTest periodicTestInterruption; // Chargement des attributs de la slice dans le dictionnaire de recodage LoadRecodedAttributesAtSlice(nSlice, recoderClass, schema, &livLoadedRecodedAttributeIndexes); @@ -1332,7 +1331,7 @@ boolean SNBDataTableBinarySliceSetBuffer::LoadBlockFromSliceSetAt(int nChunk, in // chunk. Moralement, l'ecriture du fichier devrait etre aussi suivi mais cela entrainarait utiliser des // etats en plus, des calculs plus tordus et une perte de localite de cette partie du code. La lecture // du bloc depuis le fichier binaire est tres rapide et n'a pas besoin de suivi. - if (TaskProgression::IsInTask() and periodicTestInterruption.IsTestAllowed(nInstance)) + if (TaskProgression::IsInTask() and TaskProgression::IsRefreshNecessary()) { // Mise-a-jour de la barre d'avancement dProgressPercentSlice = 100.0 * (nInstance + 1) / nChunkInstanceNumber; diff --git a/src/Norm/base/TaskProgression.cpp b/src/Norm/base/TaskProgression.cpp index 9d474c5f4..e503ee8aa 100644 --- a/src/Norm/base/TaskProgression.cpp +++ b/src/Norm/base/TaskProgression.cpp @@ -12,6 +12,7 @@ int TaskProgression::nMaxDisplayedLevelNumber = 20; int TaskProgression::nCurrentLevel = -1; ALString TaskProgression::sTitle = ""; clock_t TaskProgression::tLastDisplayTime = 0; +longint TaskProgression::lDisplayFreshness = 0; StringVector TaskProgression::svLastDisplayedMainLabels; IntVector TaskProgression::ivLastDisplayedProgressions; StringVector TaskProgression::svLastDisplayedLabels; @@ -22,6 +23,7 @@ clock_t TaskProgression::tLastInterruptionTest = 0; boolean TaskProgression::bIsInterruptionRequested = false; longint TaskProgression::lInterruptionRequestNumber = 0; longint TaskProgression::lInterruptionRequestIndex = 0; +boolean TaskProgression::bInterruptible = true; clock_t TaskProgression::tStartRequested = 0; const double TaskProgression::dMinElapsedTime = 0.3; boolean TaskProgression::bIsManagerStarted = false; @@ -75,6 +77,11 @@ boolean TaskProgression::IsInterruptionRequested() clock_t tTime; double dElapsedTime; + // On renvoie false tout de suite si les taches ne sont pas interruptibles + // Sauf si une interruption a ete forcee par la methode ForceInterruptionRequested + if (not bInterruptible and not bIsInterruptionRequested) + return false; + // Incrementation du nombre de demandes d'interruptions lInterruptionRequestNumber++; @@ -100,33 +107,23 @@ boolean TaskProgression::IsInterruptionRequested() } // Test d'interruption utilisateur - // Si le TaskProgressionManager courant est reactif, on test immediatement si il - // y a interruption. Dans le cas contraire (i.e. java), on temporise pour ne pas tester - // trop souvent. - if (currentManager->IsInterruptionResponsive()) - { - bIsInterruptionRequested = currentManager->IsInterruptionRequested(); - return bIsInterruptionRequested; - } - else + // Comme le TaskProgressionManager peut ne pas etre reactif, on temporise pour ne pas tester trop souvent + DifferedStart(); + if (bIsManagerStarted) { - DifferedStart(); - if (bIsManagerStarted) + tTime = clock(); + dElapsedTime = ((double)(tTime - tLastInterruptionTest)) / CLOCKS_PER_SEC; + if (tLastInterruptionTest == 0 or dElapsedTime > dMinElapsedTime) { - tTime = clock(); - dElapsedTime = ((double)(tTime - tLastInterruptionTest)) / CLOCKS_PER_SEC; - if (tLastInterruptionTest == 0 or dElapsedTime > dMinElapsedTime) - { - tLastInterruptionTest = tTime; - bIsInterruptionRequested = currentManager->IsInterruptionRequested(); - return bIsInterruptionRequested; - } - else - return false; + tLastInterruptionTest = tTime; + bIsInterruptionRequested = currentManager->IsInterruptionRequested(); + return bIsInterruptionRequested; } else return false; } + else + return false; } else return false; diff --git a/src/Norm/base/TaskProgression.h b/src/Norm/base/TaskProgression.h index 40f7a270e..62aeb0bd7 100644 --- a/src/Norm/base/TaskProgression.h +++ b/src/Norm/base/TaskProgression.h @@ -113,6 +113,11 @@ class TaskProgression : public Object // Cette methode peut etre appelee meme hors des taches (sans effet dans ce cas) static boolean IsInterruptionRequested(); + // Parametrage d'un comportement ou les taches ne sont interruptible ou non (defaut: true) + // Dans le cas non interruptible, IsInterruptionRequested renvoie false systematiquement + static void SetInterruptible(boolean bValue); + static boolean GetInterruptible(); + // Libelle principal static void DisplayMainLabel(const ALString& sValue); @@ -125,6 +130,12 @@ class TaskProgression : public Object // Remise a vide des libelles MainLabel, Label et de la progression static void CleanLabels(); + // Test si un rafraichissement est necessaire + // A chaque appel, un compteur est incremente, et on ne repond true qu'environ une fois sur 100 + // Permet de conditionner la fabrication des libelle a afficher et les test d'interruption + // dans les boucle de traitement intensifs, pour limiter la charge de traitement d'avancement des taches + static boolean IsRefreshNecessary(); + /////////////////////////////////////////////////////////// // Parametrage avance de la gestion des taches // Methodes appelables hors suivi (avant un Start) @@ -235,6 +246,9 @@ class TaskProgression : public Object // Date du dernier affichage global static clock_t tLastDisplayTime; + // Fraicheur de l'affichage, permettant de controler la methode IsRefreshNecessary + static longint lDisplayFreshness; + // Memorisation des derniers affichages effectue par niveau, pour bufferisation static StringVector svLastDisplayedMainLabels; static IntVector ivLastDisplayedProgressions; @@ -255,6 +269,9 @@ class TaskProgression : public Object // Index de demande d'interruption static longint lInterruptionRequestIndex; + // Indique si les taches sont interruptibles + static boolean bInterruptible; + // Gestion du lancement differe du suivi de progression static clock_t tStartRequested; static boolean bIsManagerStarted; @@ -275,3 +292,19 @@ inline boolean TaskProgression::IsInTask() { return (nCurrentLevel >= 0); } + +inline boolean TaskProgression::IsRefreshNecessary() +{ + lDisplayFreshness++; + return (lDisplayFreshness % 128) == 0; +} + +inline void TaskProgression::SetInterruptible(boolean bValue) +{ + bInterruptible = bValue; +} + +inline boolean TaskProgression::GetInterruptible() +{ + return bInterruptible; +} diff --git a/src/Norm/base/TaskProgressionManager.cpp b/src/Norm/base/TaskProgressionManager.cpp index 27f5c4be6..6474d5dba 100644 --- a/src/Norm/base/TaskProgressionManager.cpp +++ b/src/Norm/base/TaskProgressionManager.cpp @@ -230,11 +230,6 @@ void FileTaskProgressionManager::SetProgression(int nValue) } } -boolean FileTaskProgressionManager::IsInterruptionResponsive() const -{ - return true; -} - void FileTaskProgressionManager::AddCompletedTaskMessage(const ALString& sMessage) { StringObject* soMessage; diff --git a/src/Norm/base/TaskProgressionManager.h b/src/Norm/base/TaskProgressionManager.h index 63b249c2b..921f1563f 100644 --- a/src/Norm/base/TaskProgressionManager.h +++ b/src/Norm/base/TaskProgressionManager.h @@ -33,10 +33,6 @@ class TaskProgressionManager : public Object virtual void SetMainLabel(const ALString& sValue) = 0; virtual void SetLabel(const ALString& sValue) = 0; virtual void SetProgression(int nValue) = 0; - - // Doit renvoyer true ou false sans aucun calcul pour indiquer si on doit - // temporiser ou non le test des interruptions (false pour temporiser). - virtual boolean IsInterruptionResponsive() const = 0; }; ///////////////////////////////////////////////////////////////////////// @@ -67,7 +63,6 @@ class FileTaskProgressionManager : public TaskProgressionManager void SetMainLabel(const ALString& sValue) override; void SetLabel(const ALString& sValue) override; void SetProgression(int nValue) override; - boolean IsInterruptionResponsive() const override; ///////////////////////////////////////////////////////////// ///// Implementation diff --git a/src/Norm/base/Timer.h b/src/Norm/base/Timer.h index c9382c443..9695cc5d9 100644 --- a/src/Norm/base/Timer.h +++ b/src/Norm/base/Timer.h @@ -12,7 +12,6 @@ #endif class Timer; -class PeriodicTest; ////////////////////////////////////////////////////////// // Classe Timer @@ -76,27 +75,6 @@ class Timer : public Object #endif // __C11__ }; -////////////////////////////////////////////////////////// -// Classe PeriodicTest -// Utilitaire pour effectuer des test selon une frequence d'evenement et de temps controlee -class PeriodicTest : public Object -{ -public: - // Constructeur - PeriodicTest(); - ~PeriodicTest(); - - // Indique si on peut effectuer un test, pour un nombre d'evenement donne - // Les tests sont effectues au plus selon une periodicite en nombre d'evenements et en secondes - boolean IsTestAllowed(longint lEventNumber) const; - - //////////////////////////////////////////////////////// - ///// Implementation -protected: - // Timer pour gerer la periodicite - mutable Timer timer; -}; - ////////////////////////////////// // Implementation inline de Timer @@ -213,29 +191,3 @@ inline double Timer::GetElapsedTime() const return ((double)tElapsedTime) / 1e6; } #endif // __C11__ - -///////////////////////////////////////// -// Implementation inline de PeriodicTest - -inline PeriodicTest::PeriodicTest() -{ - timer.Start(); -} - -inline PeriodicTest::~PeriodicTest() -{ - timer.Stop(); -} - -inline boolean PeriodicTest::IsTestAllowed(longint lEventNumber) const -{ - if (lEventNumber % 128 == 0 and timer.GetElapsedTime() > 0.25) - { - // On reinitialise le timer - timer.Reset(); - timer.Start(); - return true; - } - else - return false; -} diff --git a/src/Norm/base/UIObject.cpp b/src/Norm/base/UIObject.cpp index 62e00d66b..3afe51e65 100644 --- a/src/Norm/base/UIObject.cpp +++ b/src/Norm/base/UIObject.cpp @@ -348,6 +348,11 @@ boolean UIObject::SetUIMode(int nValue) boolean bOk = true; require(nValue == Textual or nValue == Graphic); + // On parametre la gestion des taches comme interruptible par l'utilisateur uniquement en mode Graphic + // Cela permet d'optimiser les temps de traitement en mode batch en evitant l'overhead + // de gestion des interruptions utilisateurs + TaskProgression::SetInterruptible(nValue == Graphic); + // En mode Graphic, on verifie qu'on peut instancier une JVM correctement // Sinon on force le mode Textual et on renvoie false if (nValue == Graphic) diff --git a/src/Norm/base/UITaskProgression.cpp b/src/Norm/base/UITaskProgression.cpp index 3ed707e7d..6f36a6a91 100644 --- a/src/Norm/base/UITaskProgression.cpp +++ b/src/Norm/base/UITaskProgression.cpp @@ -285,11 +285,6 @@ void UITaskProgression::SetProgression(int nValue) } } -boolean UITaskProgression::IsInterruptionResponsive() const -{ - return false; -} - jobject UITaskProgression::GetGuiTaskProgressionManager() { JNIEnv* env; diff --git a/src/Norm/base/UserInterface.h b/src/Norm/base/UserInterface.h index d611ce0e8..37b395335 100644 --- a/src/Norm/base/UserInterface.h +++ b/src/Norm/base/UserInterface.h @@ -206,6 +206,7 @@ class UIObject : public Object // Si on echoue a passer en mode Graphic (probleme java), on passe // inconditionnellement en Textual et on renvoie false + // Les taches sont interruptible par l'utilisateur uniquement en mode Graphic static boolean SetUIMode(int nValue); static int GetUIMode(); @@ -500,7 +501,6 @@ class UITaskProgression : public TaskProgressionManager void SetMainLabel(const ALString& sValue) override; void SetLabel(const ALString& sValue) override; void SetProgression(int nValue) override; - boolean IsInterruptionResponsive() const override; // Acces au gestion de suivi global static UITaskProgression* GetManager(); diff --git a/src/Parallel/PLMPI/PLMPISlaveProgressionManager.cpp b/src/Parallel/PLMPI/PLMPISlaveProgressionManager.cpp index d88a78042..3cac9c6fd 100644 --- a/src/Parallel/PLMPI/PLMPISlaveProgressionManager.cpp +++ b/src/Parallel/PLMPI/PLMPISlaveProgressionManager.cpp @@ -69,11 +69,6 @@ void PLMPISlaveProgressionManager::SetProgression(int nValue) } } -boolean PLMPISlaveProgressionManager::IsInterruptionResponsive() const -{ - return true; -} - void PLMPISlaveProgressionManager::SetSlaveState(State nState) { nSlaveState = nState; diff --git a/src/Parallel/PLMPI/PLMPISlaveProgressionManager.h b/src/Parallel/PLMPI/PLMPISlaveProgressionManager.h index 30fc68950..460c7695e 100644 --- a/src/Parallel/PLMPI/PLMPISlaveProgressionManager.h +++ b/src/Parallel/PLMPI/PLMPISlaveProgressionManager.h @@ -31,7 +31,6 @@ class PLMPISlaveProgressionManager : public TaskProgressionManager void SetMainLabel(const ALString& sValue) override; void SetLabel(const ALString& sValue) override; void SetProgression(int nValue) override; - boolean IsInterruptionResponsive() const override; // Etat de l'esclave (VOID,PROCESS,FINALIZE) void SetSlaveState(State nState); diff --git a/src/Parallel/PLSamples/PEFileSearchTask.cpp b/src/Parallel/PLSamples/PEFileSearchTask.cpp index b6b2e26b2..12f3af411 100644 --- a/src/Parallel/PLSamples/PEFileSearchTask.cpp +++ b/src/Parallel/PLSamples/PEFileSearchTask.cpp @@ -178,7 +178,6 @@ boolean PEFileSearchTask::SlaveProcess() boolean bIsOpen; boolean bTrace = false; longint lLinePosition; - PeriodicTest periodicTestInterruption; longint lBeginPos; longint lMaxEndPos; longint lNextLinePos; @@ -257,8 +256,7 @@ boolean PEFileSearchTask::SlaveProcess() lLinePosition = inputBuffer.GetPositionInFile(); // Gestion de la progresssion - if (periodicTestInterruption.IsTestAllowed(nCumulatedLineNumber + - inputBuffer.GetCurrentLineIndex())) + if (TaskProgression::IsRefreshNecessary()) { // Calcul de la progression par rapport a la proportion de la portion du fichier traitee // parce que l'on ne sait pas le nombre total de ligne que l'on va traiter From 5148dd5347f55e02ace1fa2faf291e69cb6eb74e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Tue, 19 Mar 2024 17:10:37 +0100 Subject: [PATCH 3/3] Fix compiler warnings in Parallel library Mainly: - add variable initializasation in class constructors - cast int operands in arithmetic operations when the result is a longint - plus some minor formating errors detected during pre-commit --- src/Parallel/PLMPI/PLMPIMaster.cpp | 20 ++++++++++++++----- src/Parallel/PLMPI/PLMPIMessageManager.cpp | 4 ++-- .../PLMPI/PLMPISlaveProgressionManager.cpp | 2 ++ .../PLParallelTask/PLFileConcatenater.cpp | 6 +++--- .../PLParallelTask/PLParallelTask.cpp | 2 +- .../PLParallelTask/PLSharedVector.cpp | 4 ++-- .../RMParallelResourceManager.cpp | 2 +- src/Parallel/PLSamples/PEFileSearchTask.cpp | 1 + .../PLSamples/PEIOParallelTestTask.cpp | 1 + src/Parallel/PLSamples/PELullaby.cpp | 6 +++++- src/Parallel/PLSamples/PEProgressionTask.cpp | 3 ++- .../PLSamples/PESerializerLongTestTask.cpp | 1 + .../PLSamples/PESerializerTestTask.cpp | 2 ++ test/LearningTestTool/py/kht_export.py | 4 +--- 14 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/Parallel/PLMPI/PLMPIMaster.cpp b/src/Parallel/PLMPI/PLMPIMaster.cpp index 2d84668d9..9972a2641 100644 --- a/src/Parallel/PLMPI/PLMPIMaster.cpp +++ b/src/Parallel/PLMPI/PLMPIMaster.cpp @@ -7,15 +7,25 @@ PLMPIMaster::PLMPIMaster(PLParallelTask* t) { ALString sTmp; - bInterruptionRequested = false; - bIsMaxErrorReached = 0; - bIsMaxWarningReached = 0; - bIsMaxMessageReached = 0; nWorkingSlaves = 0; task = t; + bNewMessage = false; bSpawnedDone = false; + bStopOrderDone = false; + bInterruptionRequested = false; + bSlaveError = false; + bMasterError = false; + bIsMaxErrorReached = false; + bIsMaxWarningReached = false; + bIsMaxMessageReached = false; + dGlobalProgression = 0; + nOldProgression = 0; + bIsProcessing = false; + nInitialisationCount = 0; + nFinalisationCount = 0; nFirstSlaveInitializeMessageRank = -1; nFirstSlaveFinalizeMessageRank = -1; + sBufferDischarge[0] = '\0'; } PLMPIMaster::~PLMPIMaster() @@ -223,7 +233,7 @@ boolean PLMPIMaster::Run() slave->SetRank(context.GetRank()); slave->SetHostName(sHostName); slave->SetProgression(0); - slave->SetTaskPercent(1 / task->nWorkingProcessNumber); // Pour l'initialisation + slave->SetTaskPercent(1.0 / task->nWorkingProcessNumber); // Pour l'initialisation GetTask()->oaSlaves.Add(slave); // Ajout de l'esclave dans le dictionaire hsostName / liste des esclaves diff --git a/src/Parallel/PLMPI/PLMPIMessageManager.cpp b/src/Parallel/PLMPI/PLMPIMessageManager.cpp index 3d0461035..f1bb9e72d 100644 --- a/src/Parallel/PLMPI/PLMPIMessageManager.cpp +++ b/src/Parallel/PLMPI/PLMPIMessageManager.cpp @@ -17,12 +17,12 @@ int MessageWithTaskIndexCompare(const void* elem1, const void* elem2) message2 = cast(MessageWithTaskIndex*, *(Object**)elem2); // Comparaison sur le TaskIndex puis sur le numero de ligne, puis sur l'ordre de reception - lIndexComp = message1->GetTaskIndex() - message2->GetTaskIndex(); + lIndexComp = (longint)message1->GetTaskIndex() - message2->GetTaskIndex(); if (lIndexComp == 0) { lIndexComp = message1->GetMessage()->GetIndex() - message2->GetMessage()->GetIndex(); if (lIndexComp == 0) - lIndexComp = message1->GetAddIndex() - message2->GetAddIndex(); + lIndexComp = (longint)message1->GetAddIndex() - message2->GetAddIndex(); } return (int)((lIndexComp > 0) - (lIndexComp < 0)); // 1 si > 0; -1 si >0; 0 sinon } diff --git a/src/Parallel/PLMPI/PLMPISlaveProgressionManager.cpp b/src/Parallel/PLMPI/PLMPISlaveProgressionManager.cpp index 3cac9c6fd..b439eb607 100644 --- a/src/Parallel/PLMPI/PLMPISlaveProgressionManager.cpp +++ b/src/Parallel/PLMPI/PLMPISlaveProgressionManager.cpp @@ -16,6 +16,8 @@ PLMPISlaveProgressionManager::PLMPISlaveProgressionManager(void) nOldProgression = 0; sendRequest = MPI_REQUEST_NULL; ivMaxErrorReached = NULL; + nSlaveState = State::VOID; + sBuffer[0] = '\0'; } PLMPISlaveProgressionManager::~PLMPISlaveProgressionManager(void) diff --git a/src/Parallel/PLParallelTask/PLFileConcatenater.cpp b/src/Parallel/PLParallelTask/PLFileConcatenater.cpp index a0c983bea..ceeae3c6b 100644 --- a/src/Parallel/PLParallelTask/PLFileConcatenater.cpp +++ b/src/Parallel/PLParallelTask/PLFileConcatenater.cpp @@ -170,7 +170,7 @@ boolean PLFileConcatenater::Concatenate(const StringVector* svChunkURIs, const O nInputPreferredSize = SystemFile::nMinPreferredBufferSize; nOutputPreferredSize = PLRemoteFileService::GetPreferredBufferSize(sOutputFileName); - if (lRemainingMemory >= nInputPreferredSize + nOutputPreferredSize) + if (lRemainingMemory >= (longint)nInputPreferredSize + nOutputPreferredSize) { nOutputBufferSize = nOutputPreferredSize; lInputBufferSize = lRemainingMemory - nOutputBufferSize; @@ -180,8 +180,8 @@ boolean PLFileConcatenater::Concatenate(const StringVector* svChunkURIs, const O lInputBufferSize = (lInputBufferSize / nInputPreferredSize) * nInputPreferredSize; // On n'utilise pas plus de 8 preferred size - if (lInputBufferSize > 8 * nOutputPreferredSize) - lInputBufferSize = 8 * nOutputPreferredSize; + if (lInputBufferSize > 8 * (longint)nOutputPreferredSize) + lInputBufferSize = 8 * (longint)nOutputPreferredSize; } else { diff --git a/src/Parallel/PLParallelTask/PLParallelTask.cpp b/src/Parallel/PLParallelTask/PLParallelTask.cpp index 9bcd8bc49..2e45ea544 100644 --- a/src/Parallel/PLParallelTask/PLParallelTask.cpp +++ b/src/Parallel/PLParallelTask/PLParallelTask.cpp @@ -2129,7 +2129,7 @@ int PLParallelTask::InternalComputeStairBufferSize(int nBufferSizeMin, int nBuff // Fin de traitement : quand il n'y a du travail que pour la moitie des esclaves lFileSizeRemaining = lFileSize - lFileProcessed; - if (lFileSizeRemaining < (nProcessNumber / 2) * nComputedBufferSizeMax) + if (lFileSizeRemaining < (nProcessNumber / 2) * (longint)nComputedBufferSizeMax) { bStop = true; } diff --git a/src/Parallel/PLParallelTask/PLSharedVector.cpp b/src/Parallel/PLParallelTask/PLSharedVector.cpp index b388e6475..a938b4324 100644 --- a/src/Parallel/PLParallelTask/PLSharedVector.cpp +++ b/src/Parallel/PLParallelTask/PLSharedVector.cpp @@ -233,10 +233,10 @@ void PLShared_LongintVector::Test() // Initialisation d'une variable partagee en entree for (i = 0; i < 5; i++) - ivInitialValue.Add(i + 1); + ivInitialValue.Add((longint)i + 1); shared_valueIn.GetLongintVector()->CopyFrom(&ivInitialValue); for (i = 0; i < 5; i++) - shared_valueIn.Add(101 + i); + shared_valueIn.Add(101 + (longint)i); // Serialisation serializer.OpenForWrite(NULL); diff --git a/src/Parallel/PLParallelTask/RMParallelResourceManager.cpp b/src/Parallel/PLParallelTask/RMParallelResourceManager.cpp index ce65e3915..276423927 100644 --- a/src/Parallel/PLParallelTask/RMParallelResourceManager.cpp +++ b/src/Parallel/PLParallelTask/RMParallelResourceManager.cpp @@ -2357,7 +2357,7 @@ boolean PLSolution::FitMinimalRequirements(int nRT, longint& lMissingResource, b if (hostClassSolution->GetHostCountPerProcNumber()->GetAt(nProcNumber) != 0) { // Resources necessaires sur ce host - lUsedResource = lMasterSum + (nProcNumber - 1) * lSlaveMin; + lUsedResource = lMasterSum + ((longint)nProcNumber - 1) * lSlaveMin; // Ressources disponibles sur le host lLocalMissingResource = lUsedResource - lAvailableResource; diff --git a/src/Parallel/PLSamples/PEFileSearchTask.cpp b/src/Parallel/PLSamples/PEFileSearchTask.cpp index 12f3af411..a05121171 100644 --- a/src/Parallel/PLSamples/PEFileSearchTask.cpp +++ b/src/Parallel/PLSamples/PEFileSearchTask.cpp @@ -20,6 +20,7 @@ PEFileSearchTask::PEFileSearchTask() // Variables du maitre lInputFileSize = 0; lFoundLineNumber = 0; + lFilePos = 0; } PEFileSearchTask::~PEFileSearchTask() {} diff --git a/src/Parallel/PLSamples/PEIOParallelTestTask.cpp b/src/Parallel/PLSamples/PEIOParallelTestTask.cpp index 1fb748c46..5c835f0c8 100644 --- a/src/Parallel/PLSamples/PEIOParallelTestTask.cpp +++ b/src/Parallel/PLSamples/PEIOParallelTestTask.cpp @@ -15,6 +15,7 @@ PEIOParallelTestTask::PEIOParallelTestTask() lTotalFieldNumber = 0; lTotalLineNumber = 0; lTotalFileSizes = 0; + nFileIndex = 0; } PEIOParallelTestTask::~PEIOParallelTestTask() {} diff --git a/src/Parallel/PLSamples/PELullaby.cpp b/src/Parallel/PLSamples/PELullaby.cpp index ea803ff8c..3d81a0d28 100644 --- a/src/Parallel/PLSamples/PELullaby.cpp +++ b/src/Parallel/PLSamples/PELullaby.cpp @@ -4,7 +4,11 @@ #include "PELullabyTask.h" -PELullabyTask::PELullabyTask() {} +PELullabyTask::PELullabyTask() +{ + nMyTaskIndex = 0; + nStepSize = 0; +} PELullabyTask::~PELullabyTask() {} diff --git a/src/Parallel/PLSamples/PEProgressionTask.cpp b/src/Parallel/PLSamples/PEProgressionTask.cpp index 58254f515..8559eda26 100644 --- a/src/Parallel/PLSamples/PEProgressionTask.cpp +++ b/src/Parallel/PLSamples/PEProgressionTask.cpp @@ -8,6 +8,7 @@ PEProgressionTask::PEProgressionTask() { nMethodToTest = 0; bBoostMode = false; + nIterationNumber = 0; DeclareTaskInput(&input_nIterationNumber); } PEProgressionTask::~PEProgressionTask() {} @@ -74,7 +75,7 @@ boolean PEProgressionTask::Test(int nMethod, boolean bValue) boolean PEProgressionTask::Test() { int nMethod; - int bOk; + boolean bOk; bOk = true; for (nMethod = MASTER_INITIALIZE; nMethod < END; nMethod++) { diff --git a/src/Parallel/PLSamples/PESerializerLongTestTask.cpp b/src/Parallel/PLSamples/PESerializerLongTestTask.cpp index 664e923be..dd196c019 100644 --- a/src/Parallel/PLSamples/PESerializerLongTestTask.cpp +++ b/src/Parallel/PLSamples/PESerializerLongTestTask.cpp @@ -8,6 +8,7 @@ PESerializerLongTestTask::PESerializerLongTestTask() { DeclareTaskInput(&input_sString); DeclareTaskInput(&input_nStringLength); + nMaxStringSize = 0; } PESerializerLongTestTask::~PESerializerLongTestTask() {} diff --git a/src/Parallel/PLSamples/PESerializerTestTask.cpp b/src/Parallel/PLSamples/PESerializerTestTask.cpp index 9747161ce..78f14dde0 100644 --- a/src/Parallel/PLSamples/PESerializerTestTask.cpp +++ b/src/Parallel/PLSamples/PESerializerTestTask.cpp @@ -18,6 +18,8 @@ PESerializerTestTask::PESerializerTestTask() DeclareSharedParameter(&shared_nLargeCharVectorSize); DeclareSharedParameter(&shared_nLargeStringSize); + nLargeCharVectorSize = 0; + nLargeStringSize = 0; sSimpleStringToSerialize = "A simple string"; sSimpleCharVectorToSerialize = "A simple CharVector !!"; } diff --git a/test/LearningTestTool/py/kht_export.py b/test/LearningTestTool/py/kht_export.py index 9cbef5e11..1759847fd 100644 --- a/test/LearningTestTool/py/kht_export.py +++ b/test/LearningTestTool/py/kht_export.py @@ -146,9 +146,7 @@ def export_learning_test_tree( # Creation du repertoire de suite uniquement si necessaire if not target_suite_dir_created: utils.make_dir(target_suite_dir) - target_suite_dir_created = os.path.isdir( - target_suite_dir - ) + target_suite_dir_created = os.path.isdir(target_suite_dir) # Cas d'un repertoire if os.path.isdir(source_test_dir): # Copie du repertoire de test