Skip to content

Commit c7d68a1

Browse files
srsaggamDmitry-A
authored andcommitted
change command name and add pbar message (dotnet#380)
* change command name and add pbar message * fix tests * added aliases * duplicate alias * added another alias for task
1 parent b3bb193 commit c7d68a1

File tree

6 files changed

+64
-41
lines changed

6 files changed

+64
-41
lines changed

src/mlnet.Test/CommandLineTests.cs

+21-21
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public void TestMinimumCommandLineArgs()
3131

3232
var parser = new CommandLineBuilder()
3333
// Parser
34-
.AddCommand(CommandDefinitions.New(handler))
34+
.AddCommand(CommandDefinitions.AutoTrain(handler))
3535
.UseDefaults()
3636
.UseExceptionHandler((e, ctx) =>
3737
{
@@ -41,7 +41,7 @@ public void TestMinimumCommandLineArgs()
4141

4242
var trainDataset = Path.GetTempFileName();
4343
var testDataset = Path.GetTempFileName();
44-
string[] args = new[] { "new", "--ml-task", "binary-classification", "--dataset", trainDataset, "--label-column-name", "Label" };
44+
string[] args = new[] { "auto-train", "--ml-task", "binary-classification", "--dataset", trainDataset, "--label-column-name", "Label" };
4545
parser.InvokeAsync(args).Wait();
4646
File.Delete(trainDataset);
4747
File.Delete(testDataset);
@@ -63,7 +63,7 @@ public void TestCommandLineArgsFailTest()
6363

6464
var parser = new CommandLineBuilder()
6565
// parser
66-
.AddCommand(CommandDefinitions.New(handler))
66+
.AddCommand(CommandDefinitions.AutoTrain(handler))
6767
.UseDefaults()
6868
.UseExceptionHandler((e, ctx) =>
6969
{
@@ -76,22 +76,22 @@ public void TestCommandLineArgsFailTest()
7676
var testDataset = Path.GetTempFileName();
7777

7878
//wrong value to ml-task
79-
string[] args = new[] { "new", "--ml-task", "bad-value", "--train-dataset", trainDataset, "--label-column-name", "Label" };
79+
string[] args = new[] { "auto-train", "--ml-task", "bad-value", "--train-dataset", trainDataset, "--label-column-name", "Label" };
8080
parser.InvokeAsync(args).Wait();
8181
Assert.IsFalse(parsingSuccessful);
8282

8383
// Incorrect invocation
84-
args = new[] { "new", "binary-classification", "--train-dataset", trainDataset, "--label-column-name", "Label" };
84+
args = new[] { "auto-train", "binary-classification", "--train-dataset", trainDataset, "--label-column-name", "Label" };
8585
parser.InvokeAsync(args).Wait();
8686
Assert.IsFalse(parsingSuccessful);
8787

8888
// Non-existent file test
89-
args = new[] { "new", "--ml-task", "binary-classification", "--train-dataset", "nonexistentfile.csv", "--label-column-name", "Label" };
89+
args = new[] { "auto-train", "--ml-task", "binary-classification", "--train-dataset", "nonexistentfile.csv", "--label-column-name", "Label" };
9090
parser.InvokeAsync(args).Wait();
9191
Assert.IsFalse(parsingSuccessful);
9292

9393
// No label column or index test
94-
args = new[] { "new", "--ml-task", "binary-classification", "--train-dataset", trainDataset, "--test-dataset", testDataset };
94+
args = new[] { "auto-train", "--ml-task", "binary-classification", "--train-dataset", trainDataset, "--test-dataset", testDataset };
9595
parser.InvokeAsync(args).Wait();
9696
File.Delete(trainDataset);
9797
File.Delete(testDataset);
@@ -128,7 +128,7 @@ public void TestCommandLineArgsValuesTest()
128128

129129
var parser = new CommandLineBuilder()
130130
// Parser
131-
.AddCommand(CommandDefinitions.New(handler))
131+
.AddCommand(CommandDefinitions.AutoTrain(handler))
132132
.UseDefaults()
133133
.UseExceptionHandler((e, ctx) =>
134134
{
@@ -137,7 +137,7 @@ public void TestCommandLineArgsValuesTest()
137137
.Build();
138138

139139
// Incorrect mltask test
140-
string[] args = new[] { "new", "--ml-task", "binary-classification", "--dataset", trainDataset, "--label-column-name", labelName, "--validation-dataset", validDataset, "--test-dataset", testDataset, "--max-exploration-time", "5", "--name", name, "--output-path", outputPath, "--has-header", falseString };
140+
string[] args = new[] { "auto-train", "--ml-task", "binary-classification", "--dataset", trainDataset, "--label-column-name", labelName, "--validation-dataset", validDataset, "--test-dataset", testDataset, "--max-exploration-time", "5", "--name", name, "--output-path", outputPath, "--has-header", falseString };
141141
parser.InvokeAsync(args).Wait();
142142
File.Delete(trainDataset);
143143
File.Delete(testDataset);
@@ -164,7 +164,7 @@ public void TestCommandLineArgsMutuallyExclusiveArgsTest()
164164

165165
var parser = new CommandLineBuilder()
166166
// Parser
167-
.AddCommand(CommandDefinitions.New(handler))
167+
.AddCommand(CommandDefinitions.AutoTrain(handler))
168168
.UseDefaults()
169169
.UseExceptionHandler((e, ctx) =>
170170
{
@@ -173,17 +173,17 @@ public void TestCommandLineArgsMutuallyExclusiveArgsTest()
173173
.Build();
174174

175175
// Incorrect arguments : specifying dataset and train-dataset
176-
string[] args = new[] { "new", "--ml-task", "BinaryClassification", "--dataset", dataset, "--train-dataset", trainDataset, "--label-column-name", labelName, "--test-dataset", testDataset, "--max-exploration-time", "5" };
176+
string[] args = new[] { "auto-train", "--ml-task", "BinaryClassification", "--dataset", dataset, "--train-dataset", trainDataset, "--label-column-name", labelName, "--test-dataset", testDataset, "--max-exploration-time", "5" };
177177
parser.InvokeAsync(args).Wait();
178178
Assert.IsFalse(parsingSuccessful);
179179

180180
// Incorrect arguments : specifying train-dataset and not specifying test-dataset
181-
args = new[] { "new", "--ml-task", "BinaryClassification", "--train-dataset", trainDataset, "--label-column-name", labelName, "--max-exploration-time", "5" };
181+
args = new[] { "auto-train", "--ml-task", "BinaryClassification", "--train-dataset", trainDataset, "--label-column-name", labelName, "--max-exploration-time", "5" };
182182
parser.InvokeAsync(args).Wait();
183183
Assert.IsFalse(parsingSuccessful);
184184

185185
// Incorrect arguments : specifying label column name and index
186-
args = new[] { "new", "--ml-task", "BinaryClassification", "--train-dataset", trainDataset, "--label-column-name", labelName, "--label-column-index", "0", "--test-dataset", testDataset, "--max-exploration-time", "5" };
186+
args = new[] { "auto-train", "--ml-task", "BinaryClassification", "--train-dataset", trainDataset, "--label-column-name", labelName, "--label-column-index", "0", "--test-dataset", testDataset, "--max-exploration-time", "5" };
187187
parser.InvokeAsync(args).Wait();
188188
File.Delete(trainDataset);
189189
File.Delete(testDataset);
@@ -214,7 +214,7 @@ public void CacheArgumentTest()
214214

215215
var parser = new CommandLineBuilder()
216216
// Parser
217-
.AddCommand(CommandDefinitions.New(handler))
217+
.AddCommand(CommandDefinitions.AutoTrain(handler))
218218
.UseDefaults()
219219
.UseExceptionHandler((e, ctx) =>
220220
{
@@ -223,30 +223,30 @@ public void CacheArgumentTest()
223223
.Build();
224224

225225
// valid cache test
226-
string[] args = new[] { "new", "--ml-task", "binary-classification", "--dataset", trainDataset, "--label-column-name", labelName, "--cache", cache };
226+
string[] args = new[] { "auto-train", "--ml-task", "binary-classification", "--dataset", trainDataset, "--label-column-name", labelName, "--cache", cache };
227227
parser.InvokeAsync(args).Wait();
228228
Assert.IsTrue(parsingSuccessful);
229229

230230
parsingSuccessful = false;
231231

232232
cache = "off";
233233
// valid cache test
234-
args = new[] { "new", "--ml-task", "binary-classification", "--dataset", trainDataset, "--label-column-name", labelName, "--cache", cache };
234+
args = new[] { "auto-train", "--ml-task", "binary-classification", "--dataset", trainDataset, "--label-column-name", labelName, "--cache", cache };
235235
parser.InvokeAsync(args).Wait();
236236
Assert.IsTrue(parsingSuccessful);
237237

238238
parsingSuccessful = false;
239239

240240
cache = "auto";
241241
// valid cache test
242-
args = new[] { "new", "--ml-task", "binary-classification", "--dataset", trainDataset, "--label-column-name", labelName, "--cache", cache };
242+
args = new[] { "auto-train", "--ml-task", "binary-classification", "--dataset", trainDataset, "--label-column-name", labelName, "--cache", cache };
243243
parser.InvokeAsync(args).Wait();
244244
Assert.IsTrue(parsingSuccessful);
245245

246246
parsingSuccessful = false;
247247

248248
// invalid cache test
249-
args = new[] { "new", "--ml-task", "binary-classification", "--dataset", trainDataset, "--label-column-name", labelName, "--cache", "blah" };
249+
args = new[] { "auto-train", "--ml-task", "binary-classification", "--dataset", trainDataset, "--label-column-name", labelName, "--cache", "blah" };
250250
parser.InvokeAsync(args).Wait();
251251
Assert.IsFalse(parsingSuccessful);
252252

@@ -276,7 +276,7 @@ public void IgnoreColumnsArgumentTest()
276276

277277
var parser = new CommandLineBuilder()
278278
// Parser
279-
.AddCommand(CommandDefinitions.New(handler))
279+
.AddCommand(CommandDefinitions.AutoTrain(handler))
280280
.UseDefaults()
281281
.UseExceptionHandler((e, ctx) =>
282282
{
@@ -285,13 +285,13 @@ public void IgnoreColumnsArgumentTest()
285285
.Build();
286286

287287
// valid cache test
288-
string[] args = new[] { "new", "--ml-task", "binary-classification", "--dataset", trainDataset, "--label-column-name", labelName, "--ignore-columns", ignoreColumns };
288+
string[] args = new[] { "auto-train", "--ml-task", "binary-classification", "--dataset", trainDataset, "--label-column-name", labelName, "--ignore-columns", ignoreColumns };
289289
parser.InvokeAsync(args).Wait();
290290
Assert.IsTrue(parsingSuccessful);
291291

292292
parsingSuccessful = false;
293293

294-
args = new[] { "new", "--ml-task", "binary-classification", "--dataset", trainDataset, "--label-column-name", labelName, "--ignore-columns", "a b c" };
294+
args = new[] { "auto-train", "--ml-task", "binary-classification", "--dataset", trainDataset, "--label-column-name", labelName, "--ignore-columns", "a b c" };
295295
parser.InvokeAsync(args).Wait();
296296
Assert.IsFalse(parsingSuccessful);
297297

src/mlnet/CodeGenerator/CodeGenerationHelper.cs

+3-4
Original file line numberDiff line numberDiff line change
@@ -99,32 +99,31 @@ public void GenerateCode()
9999
{
100100
using (var pbar = new FixedDurationBar(wait, "", options))
101101
{
102+
pbar.Message = Strings.WaitingForFirstIteration;
102103
Thread t = default;
103104
switch (taskKind)
104105
{
105106
case TaskKind.BinaryClassification:
106107
t = new Thread(() => binaryRunDetails = automlEngine.ExploreBinaryClassificationModels(context, trainData, validationData, columnInformation, new BinaryExperimentSettings().OptimizingMetric, pbar));
107-
t.Start();
108108
break;
109109
case TaskKind.Regression:
110110
t = new Thread(() => regressionRunDetails = automlEngine.ExploreRegressionModels(context, trainData, validationData, columnInformation, new RegressionExperimentSettings().OptimizingMetric, pbar));
111-
t.Start();
112111
break;
113112
case TaskKind.MulticlassClassification:
114113
t = new Thread(() => multiRunDetails = automlEngine.ExploreMultiClassificationModels(context, trainData, validationData, columnInformation, new MulticlassExperimentSettings().OptimizingMetric, pbar));
115-
t.Start();
116114
break;
117115
default:
118116
logger.Log(LogLevel.Error, Strings.UnsupportedMlTask);
119117
break;
120118
}
119+
t.Start();
121120

122121
if (!pbar.CompletedHandle.WaitOne(wait))
123122
pbar.Message = $"{nameof(FixedDurationBar)} did not signal {nameof(FixedDurationBar.CompletedHandle)} after {wait}";
124123

125124
if (t.IsAlive == true)
126125
{
127-
string waitingMessage = "Waiting for the last iteration to complete ...";
126+
string waitingMessage = Strings.WaitingForLastIteration;
128127
string originalMessage = pbar.Message;
129128
pbar.Message = waitingMessage;
130129
t.Join();

src/mlnet/Commands/CommandDefinitions.cs

+15-15
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ namespace Microsoft.ML.CLI.Commands
1414
{
1515
internal static class CommandDefinitions
1616
{
17-
internal static System.CommandLine.Command New(ICommandHandler handler)
17+
internal static System.CommandLine.Command AutoTrain(ICommandHandler handler)
1818
{
19-
var newCommand = new System.CommandLine.Command("new", "Create a new .NET project using ML.NET to train and run a model", handler: handler)
19+
var newCommand = new System.CommandLine.Command("auto-train", "Create a new .NET project using ML.NET to train and run a model", handler: handler)
2020
{
2121
Dataset(),
2222
ValidationDataset(),
@@ -62,56 +62,56 @@ internal static System.CommandLine.Command New(ICommandHandler handler)
6262
return newCommand;
6363

6464
Option Dataset() =>
65-
new Option("--dataset", "File path to either a single dataset or a training dataset for train/test split approaches.",
65+
new Option(new List<string>() { "--dataset", "-d" }, "File path to either a single dataset or a training dataset for train/test split approaches.",
6666
new Argument<FileInfo>().ExistingOnly());
6767

6868
Option ValidationDataset() =>
69-
new Option("--validation-dataset", "File path for the validation dataset in train/validation/test split approaches.",
69+
new Option(new List<string>() { "--validation-dataset", "-v" }, "File path for the validation dataset in train/validation/test split approaches.",
7070
new Argument<FileInfo>(defaultValue: default(FileInfo)).ExistingOnly());
7171

7272
Option TestDataset() =>
73-
new Option("--test-dataset", "File path for the test dataset in train/test approaches.",
73+
new Option(new List<string>() { "--test-dataset", "-t" }, "File path for the test dataset in train/test approaches.",
7474
new Argument<FileInfo>(defaultValue: default(FileInfo)).ExistingOnly());
7575

7676
Option MlTask() =>
77-
new Option("--ml-task", "Type of ML task to perform. Current supported tasks: regression, binary-classification, multiclass-classification.",
77+
new Option(new List<string>() { "--ml-task", "--mltask", "--task", "-T" }, "Type of ML task to perform. Current supported tasks: regression, binary-classification, multiclass-classification.",
7878
new Argument<string>().FromAmong(GetMlTaskSuggestions()));
7979

8080
Option LabelName() =>
81-
new Option("--label-column-name", "Name of the label (target) column to predict.",
81+
new Option(new List<string>() { "--label-column-name", "-n" }, "Name of the label (target) column to predict.",
8282
new Argument<string>());
8383

8484
Option LabelColumnIndex() =>
85-
new Option("--label-column-index", "Index of the label (target) column to predict.",
85+
new Option(new List<string>() { "--label-column-index", "-i" }, "Index of the label (target) column to predict.",
8686
new Argument<uint>());
8787

8888
Option MaxExplorationTime() =>
89-
new Option("--max-exploration-time", "Maximum time in seconds for exploring models with best configuration.",
89+
new Option(new List<string>() { "--max-exploration-time", "-x" }, "Maximum time in seconds for exploring models with best configuration.",
9090
new Argument<uint>(defaultValue: 10));
9191

9292
Option Verbosity() =>
93-
new Option(new List<string>() { "--verbosity" }, "Output verbosity choices: q[uiet], m[inimal] (by default) and diag[nostic].",
93+
new Option(new List<string>() { "--verbosity", "-V" }, "Output verbosity choices: q[uiet], m[inimal] (by default) and diag[nostic].",
9494
new Argument<string>(defaultValue: "m").FromAmong(GetVerbositySuggestions()));
9595

9696
Option Name() =>
97-
new Option(new List<string>() { "--name" }, "Name for the output project or solution to create. ",
97+
new Option(new List<string>() { "--name", "-N" }, "Name for the output project or solution to create. ",
9898
new Argument<string>());
9999

100100
Option OutputPath() =>
101-
new Option(new List<string>() { "--output-path" }, "Location folder to place the generated output. The default is the current directory.",
101+
new Option(new List<string>() { "--output-path", "-o" }, "Location folder to place the generated output. The default is the current directory.",
102102
new Argument<DirectoryInfo>(defaultValue: new DirectoryInfo(".")));
103103

104104
Option HasHeader() =>
105-
new Option(new List<string>() { "--has-header" }, "Specify true/false depending if the dataset file(s) have a header row.",
105+
new Option(new List<string>() { "--has-header", "-h" }, "Specify true/false depending if the dataset file(s) have a header row.",
106106
new Argument<bool>(defaultValue: true));
107107

108108
Option Cache() =>
109-
new Option(new List<string>() { "--cache" }, "Specify on/off/auto if you want cache to be turned on, off or auto determined.",
109+
new Option(new List<string>() { "--cache", "-c" }, "Specify on/off/auto if you want cache to be turned on, off or auto determined.",
110110
new Argument<string>(defaultValue: "auto").FromAmong(GetCacheSuggestions()));
111111

112112
// This is a temporary hack to work around having comma separated values for argument. This feature needs to be enabled in the parser itself.
113113
Option IgnoreColumns() =>
114-
new Option(new List<string>() { "--ignore-columns" }, "Specify the columns that needs to be ignored in the given dataset.",
114+
new Option(new List<string>() { "--ignore-columns", "-I" }, "Specify the columns that needs to be ignored in the given dataset.",
115115
new Argument<List<string>>(symbolResult =>
116116
{
117117
try

src/mlnet/Program.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public static void Main(string[] args)
6161

6262
var parser = new CommandLineBuilder()
6363
// parser
64-
.AddCommand(CommandDefinitions.New(handler))
64+
.AddCommand(CommandDefinitions.AutoTrain(handler))
6565
.UseDefaults()
6666
.Build();
6767

src/mlnet/Strings.resx

+6
Original file line numberDiff line numberDiff line change
@@ -177,4 +177,10 @@
177177
<data name="LearningHttpLink" xml:space="preserve">
178178
<value>https://aka.ms/mlnet-cli</value>
179179
</data>
180+
<data name="WaitingForFirstIteration" xml:space="preserve">
181+
<value>Waiting for the first iteration to complete ...</value>
182+
</data>
183+
<data name="WaitingForLastIteration" xml:space="preserve">
184+
<value>Waiting for the last iteration to complete ...</value>
185+
</data>
180186
</root>

0 commit comments

Comments
 (0)