Skip to content

Commit 4f9dc40

Browse files
authored
fix few bugs in progressbar and verbosity (dotnet#374)
* fix few bugs in progressbar and verbosity * removed unused name space
1 parent 9b6adcd commit 4f9dc40

File tree

5 files changed

+58
-33
lines changed

5 files changed

+58
-33
lines changed

src/mlnet/AutoML/IAutoMLEngine.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ internal interface IAutoMLEngine
1313
{
1414
ColumnInferenceResults InferColumns(MLContext context, ColumnInformation columnInformation);
1515

16-
IEnumerable<RunDetail<BinaryClassificationMetrics>> ExploreBinaryClassificationModels(MLContext context, IDataView trainData, IDataView validationData, ColumnInformation columnInformation, BinaryClassificationMetric optimizationMetric, ProgressBar progressBar);
16+
IEnumerable<RunDetail<BinaryClassificationMetrics>> ExploreBinaryClassificationModels(MLContext context, IDataView trainData, IDataView validationData, ColumnInformation columnInformation, BinaryClassificationMetric optimizationMetric, ProgressBar progressBar = null);
1717

18-
IEnumerable<RunDetail<MulticlassClassificationMetrics>> ExploreMultiClassificationModels(MLContext context, IDataView trainData, IDataView validationData, ColumnInformation columnInformation, MulticlassClassificationMetric optimizationMetric, ProgressBar progressBar);
18+
IEnumerable<RunDetail<MulticlassClassificationMetrics>> ExploreMultiClassificationModels(MLContext context, IDataView trainData, IDataView validationData, ColumnInformation columnInformation, MulticlassClassificationMetric optimizationMetric, ProgressBar progressBar = null);
1919

20-
IEnumerable<RunDetail<RegressionMetrics>> ExploreRegressionModels(MLContext context, IDataView trainData, IDataView validationData, ColumnInformation columnInformation, RegressionMetric optimizationMetric, ProgressBar progressBar);
20+
IEnumerable<RunDetail<RegressionMetrics>> ExploreRegressionModels(MLContext context, IDataView trainData, IDataView validationData, ColumnInformation columnInformation, RegressionMetric optimizationMetric, ProgressBar progressBar = null);
2121

2222
}
2323
}

src/mlnet/CodeGenerator/CodeGenerationHelper.cs

+47-24
Original file line numberDiff line numberDiff line change
@@ -91,45 +91,68 @@ public void GenerateCode()
9191
BackgroundCharacter = '─',
9292
};
9393
var wait = TimeSpan.FromSeconds(settings.MaxExplorationTime);
94-
using (var pbar = new FixedDurationBar(wait, "", options))
94+
var verboseLevel = Utils.GetVerbosity(settings.Verbosity);
95+
if (verboseLevel > LogLevel.Trace && !Console.IsOutputRedirected)
96+
{
97+
using (var pbar = new FixedDurationBar(wait, "", options))
98+
{
99+
Thread t = default;
100+
switch (taskKind)
101+
{
102+
case TaskKind.BinaryClassification:
103+
t = new Thread(() => binaryRunDetails = automlEngine.ExploreBinaryClassificationModels(context, trainData, validationData, columnInformation, new BinaryExperimentSettings().OptimizingMetric, pbar));
104+
t.Start();
105+
break;
106+
case TaskKind.Regression:
107+
t = new Thread(() => regressionRunDetails = automlEngine.ExploreRegressionModels(context, trainData, validationData, columnInformation, new RegressionExperimentSettings().OptimizingMetric, pbar));
108+
t.Start();
109+
break;
110+
case TaskKind.MulticlassClassification:
111+
t = new Thread(() => multiRunDetails = automlEngine.ExploreMultiClassificationModels(context, trainData, validationData, columnInformation, new MulticlassExperimentSettings().OptimizingMetric, pbar));
112+
t.Start();
113+
break;
114+
default:
115+
logger.Log(LogLevel.Error, Strings.UnsupportedMlTask);
116+
break;
117+
}
118+
119+
if (!pbar.CompletedHandle.WaitOne(wait))
120+
pbar.Message = $"{nameof(FixedDurationBar)} did not signal {nameof(FixedDurationBar.CompletedHandle)} after {wait}";
121+
122+
if (t.IsAlive == true)
123+
{
124+
string waitingMessage = "Waiting for the last iteration to complete ...";
125+
string originalMessage = pbar.Message;
126+
pbar.Message = waitingMessage;
127+
t.Join();
128+
if (waitingMessage.Equals(pbar.Message))
129+
{
130+
// Corner cases where thread was alive but has completed all iterations.
131+
pbar.Message = originalMessage;
132+
}
133+
}
134+
}
135+
}
136+
else
95137
{
96-
Thread t = default;
97138
switch (taskKind)
98139
{
99140
case TaskKind.BinaryClassification:
100-
t = new Thread(() => binaryRunDetails = automlEngine.ExploreBinaryClassificationModels(context, trainData, validationData, columnInformation, new BinaryExperimentSettings().OptimizingMetric, pbar));
101-
t.Start();
141+
binaryRunDetails = automlEngine.ExploreBinaryClassificationModels(context, trainData, validationData, columnInformation, new BinaryExperimentSettings().OptimizingMetric);
102142
break;
103143
case TaskKind.Regression:
104-
t = new Thread(() => regressionRunDetails = automlEngine.ExploreRegressionModels(context, trainData, validationData, columnInformation, new RegressionExperimentSettings().OptimizingMetric, pbar));
105-
t.Start();
144+
regressionRunDetails = automlEngine.ExploreRegressionModels(context, trainData, validationData, columnInformation, new RegressionExperimentSettings().OptimizingMetric);
106145
break;
107146
case TaskKind.MulticlassClassification:
108-
t = new Thread(() => multiRunDetails = automlEngine.ExploreMultiClassificationModels(context, trainData, validationData, columnInformation, new MulticlassExperimentSettings().OptimizingMetric, pbar));
109-
t.Start();
147+
multiRunDetails = automlEngine.ExploreMultiClassificationModels(context, trainData, validationData, columnInformation, new MulticlassExperimentSettings().OptimizingMetric);
110148
break;
111149
default:
112150
logger.Log(LogLevel.Error, Strings.UnsupportedMlTask);
113151
break;
114152
}
115-
116-
if (!pbar.CompletedHandle.WaitOne(wait))
117-
pbar.Message = $"{nameof(FixedDurationBar)} did not signal {nameof(FixedDurationBar.CompletedHandle)} after {wait}";
118-
119-
if (t.IsAlive == true)
120-
{
121-
string waitingMessage = "Waiting for the last iteration to complete ...";
122-
string originalMessage = pbar.Message;
123-
pbar.Message = waitingMessage;
124-
t.Join();
125-
if (waitingMessage.Equals(pbar.Message))
126-
{
127-
// Corner cases where thread was alive but has completed all iterations.
128-
pbar.Message = originalMessage;
129-
}
130-
}
131153
}
132154

155+
133156
}
134157
catch (Exception e)
135158
{

src/mlnet/ProgressBar/ProgressBar.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public ProgressBar(int maxTicks, string message, ProgressBarOptions options = nu
3434
: base(maxTicks, message, options)
3535
{
3636
Console.WriteLine();
37-
Console.SetCursorPosition(Console.CursorLeft, Console.CursorTop - 1);
37+
Console.SetCursorPosition(Console.CursorLeft, Math.Max(0, Console.CursorTop - 1));
3838
_originalCursorTop = Console.CursorTop;
3939
_originalWindowTop = Console.WindowTop;
4040
_originalColor = Console.ForegroundColor;

src/mlnet/Utilities/ProgressHandlers.cs

+6-3
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ public void Report(RunDetail<RegressionMetrics> iterationResult)
3939
{
4040
iterationIndex++;
4141
UpdateBestResult(iterationResult);
42-
progressBar.Message = $"Best {this.optimizationMetric}: {GetScore(bestResult):F4}, Best Algorithm: {bestResult?.TrainerName}, Last Algorithm: {iterationResult?.TrainerName}";
42+
if (progressBar != null)
43+
progressBar.Message = $"Best {this.optimizationMetric}: {GetScore(bestResult):F4}, Best Algorithm: {bestResult?.TrainerName}, Last Algorithm: {iterationResult?.TrainerName}";
4344
ConsolePrinter.PrintMetrics(iterationIndex, iterationResult?.TrainerName, iterationResult?.ValidationMetrics, GetScore(bestResult), iterationResult?.RuntimeInSeconds, LogLevel.Trace);
4445
if (iterationResult.Exception != null)
4546
{
@@ -78,7 +79,8 @@ public void Report(RunDetail<BinaryClassificationMetrics> iterationResult)
7879
{
7980
iterationIndex++;
8081
UpdateBestResult(iterationResult);
81-
progressBar.Message = $"Best {this.optimizationMetric}: {GetScore(bestResult):F4}, Best Algorithm: {bestResult?.TrainerName}, Last Algorithm: {iterationResult?.TrainerName}";
82+
if (progressBar != null)
83+
progressBar.Message = $"Best {this.optimizationMetric}: {GetScore(bestResult):F4}, Best Algorithm: {bestResult?.TrainerName}, Last Algorithm: {iterationResult?.TrainerName}";
8284
ConsolePrinter.PrintMetrics(iterationIndex, iterationResult?.TrainerName, iterationResult?.ValidationMetrics, GetScore(bestResult), iterationResult?.RuntimeInSeconds, LogLevel.Trace);
8385
if (iterationResult.Exception != null)
8486
{
@@ -117,7 +119,8 @@ public void Report(RunDetail<MulticlassClassificationMetrics> iterationResult)
117119
{
118120
iterationIndex++;
119121
UpdateBestResult(iterationResult);
120-
progressBar.Message = $"Best {this.optimizationMetric}: {GetScore(bestResult):F4}, Best Algorithm: {bestResult?.TrainerName}, Last Algorithm: {iterationResult?.TrainerName}";
122+
if (progressBar != null)
123+
progressBar.Message = $"Best {this.optimizationMetric}: {GetScore(bestResult):F4}, Best Algorithm: {bestResult?.TrainerName}, Last Algorithm: {iterationResult?.TrainerName}";
121124
ConsolePrinter.PrintMetrics(iterationIndex, iterationResult?.TrainerName, iterationResult?.ValidationMetrics, GetScore(bestResult), iterationResult?.RuntimeInSeconds, LogLevel.Trace);
122125
if (iterationResult.Exception != null)
123126
{

src/mlnet/Utilities/Utils.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
// See the LICENSE file in the project root for more information.
44

55
using System;
6-
using System.Collections.Generic;
76
using System.IO;
87
using System.Linq;
98
using Microsoft.CodeAnalysis;
@@ -26,7 +25,7 @@ internal static LogLevel GetVerbosity(string verbosity)
2625
case "m":
2726
return LogLevel.Info;
2827
case "diag":
29-
return LogLevel.Debug;
28+
return LogLevel.Trace;
3029
default:
3130
return LogLevel.Info;
3231
}

0 commit comments

Comments
 (0)