Skip to content

Make array argument names plural #2124

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 18 commits into from
Feb 1, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/samples/Microsoft.ML.Samples/Dynamic/Calibrator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public static void Calibration()
{
Separators = new[] { '\t' },
HasHeader = true,
Column = new[]
Columns = new[]
{
new TextLoader.Column("Sentiment", DataKind.BL, 0),
new TextLoader.Column("SentimentText", DataKind.Text, 1)
Expand Down
9 changes: 5 additions & 4 deletions src/Microsoft.ML.Core/CommandLine/CmdParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -474,9 +474,10 @@ private static ArgumentInfo GetArgumentInfo(Type type, object defaults)
Contracts.Check(!field.IsStatic && !field.IsInitOnly && !field.IsLiteral);
bool isDefault = attr is DefaultArgumentAttribute;
if (isDefault && def != null)
throw Contracts.Except("Duplicate default argument '{0}' vs '{1}'", def.LongName, field.Name);
throw Contracts.Except($"Duplicate default argument '{def.LongName}' vs '{field.Name}'");

string name = ArgCase(attr.Name ?? field.Name);

string name = ArgCase(field.Name);
string[] nicks;
// Semantics of ShortName:
// The string provided represents an array of names separated by commas and spaces, once empty entries are removed.
Expand All @@ -494,13 +495,13 @@ private static ArgumentInfo GetArgumentInfo(Type type, object defaults)
Contracts.Assert(!isDefault || nicks == null);

if (map.ContainsKey(name.ToLowerInvariant()))
throw Contracts.Except("Duplicate name '{0}' in argument type '{1}'", name, type.Name);
throw Contracts.Except($"Duplicate name '{name}' in argument type '{type.Name}'");
if (nicks != null)
{
foreach (var nick in nicks)
{
if (map.ContainsKey(nick.ToLowerInvariant()))
throw Contracts.Except("Duplicate name '{0}' in argument type '{1}'", nick, type.Name);
throw Contracts.Except($"Duplicate name '{nick}' in argument type '{type.Name}'");
}
}

Expand Down
20 changes: 11 additions & 9 deletions src/Microsoft.ML.Data/Commands/CrossValidationCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,9 @@ public sealed class Arguments : DataCommand.ArgumentsBase
[Argument(ArgumentType.LastOccurenceWins, HelpText = "Column to use for stratification", ShortName = "strat", SortOrder = 7)]
public string StratificationColumn;

[Argument(ArgumentType.LastOccurenceWins, HelpText = "Columns with custom kinds declared through key assignments, for example, col[Kind]=Name to assign column named 'Name' kind 'Kind'", ShortName = "col", SortOrder = 10)]
public KeyValuePair<string, string>[] CustomColumn;
[Argument(ArgumentType.LastOccurenceWins, HelpText = "Columns with custom kinds declared through key assignments, for example, col[Kind]=Name to assign column named 'Name' kind 'Kind'",
Name = "CustomColumn", ShortName = "col", SortOrder = 10)]
public KeyValuePair<string, string>[] CustomColumns;

[Argument(ArgumentType.LastOccurenceWins, HelpText = "Number of folds in k-fold cross-validation", ShortName = "k")]
public int NumFolds = 2;
Expand All @@ -73,8 +74,9 @@ public sealed class Arguments : DataCommand.ArgumentsBase
[Argument(ArgumentType.LastOccurenceWins, HelpText = "Whether we should cache input training data", ShortName = "cache")]
public bool? CacheData;

[Argument(ArgumentType.Multiple, HelpText = "Transforms to apply prior to splitting the data into folds", ShortName = "prexf", SignatureType = typeof(SignatureDataTransform))]
public KeyValuePair<string, IComponentFactory<IDataView, IDataTransform>>[] PreTransform;
[Argument(ArgumentType.Multiple, HelpText = "Transforms to apply prior to splitting the data into folds",
Name = "PreTransform", ShortName = "prexf", SignatureType = typeof(SignatureDataTransform))]
public KeyValuePair<string, IComponentFactory<IDataView, IDataTransform>>[] PreTransforms;

[Argument(ArgumentType.AtMostOnce, IsInputFileName = true, HelpText = "The validation data file", ShortName = "valid")]
public string ValidationFile;
Expand Down Expand Up @@ -153,7 +155,7 @@ private void RunCore(IChannel ch, string cmd)
IDataLoader loader = CreateRawLoader();

// If the per-instance results are requested and there is no name column, add a GenerateNumberTransform.
var preXf = Args.PreTransform;
var preXf = Args.PreTransforms;
if (!string.IsNullOrEmpty(Args.OutputDataFile))
{
string name = TrainUtils.MatchNameOrDefaultOrNull(ch, loader.Schema, nameof(Args.NameColumn), Args.NameColumn, DefaultColumnNames.Name);
Expand All @@ -167,7 +169,7 @@ private void RunCore(IChannel ch, string cmd)
(env, input) =>
{
var args = new GenerateNumberTransform.Arguments();
args.Column = new[] { new GenerateNumberTransform.Column() { Name = DefaultColumnNames.Name }, };
args.Columns = new[] { new GenerateNumberTransform.Column() { Name = DefaultColumnNames.Name }, };
args.UseCounter = true;
return new GenerateNumberTransform(env, args, input);
}))
Expand Down Expand Up @@ -263,7 +265,7 @@ private RoleMappedData ApplyAllTransformsToData(IHostEnvironment env, IChannel c
/// </summary>
private RoleMappedData CreateRoleMappedData(IHostEnvironment env, IChannel ch, IDataView data, ITrainer trainer)
{
foreach (var kvp in Args.Transform)
foreach (var kvp in Args.Transforms)
data = kvp.Value.CreateComponent(env, data);

var schema = data.Schema;
Expand All @@ -276,7 +278,7 @@ private RoleMappedData CreateRoleMappedData(IHostEnvironment env, IChannel ch, I
TrainUtils.AddNormalizerIfNeeded(env, ch, trainer, ref data, features, Args.NormalizeFeatures);

// Training pipe and examples.
var customCols = TrainUtils.CheckAndGenerateCustomColumns(ch, Args.CustomColumn);
var customCols = TrainUtils.CheckAndGenerateCustomColumns(ch, Args.CustomColumns);

return new RoleMappedData(data, label, features, group, weight, name, customCols);
}
Expand Down Expand Up @@ -314,7 +316,7 @@ private string GetSplitColumn(IChannel ch, IDataView input, ref IDataView output
var keyGenArgs = new GenerateNumberTransform.Arguments();
var col = new GenerateNumberTransform.Column();
col.Name = stratificationColumn;
keyGenArgs.Column = new[] { col };
keyGenArgs.Columns = new[] { col };
output = new GenerateNumberTransform(Host, keyGenArgs, input);
}
else
Expand Down
15 changes: 8 additions & 7 deletions src/Microsoft.ML.Data/Commands/DataCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,9 @@ public abstract class ArgumentsBase
HelpText = "Desired degree of parallelism in the data pipeline", ShortName = "n")]
public int? Parallel;

[Argument(ArgumentType.Multiple, Visibility = ArgumentAttribute.VisibilityType.CmdLineOnly, HelpText = "Transform", ShortName = "xf", SignatureType = typeof(SignatureDataTransform))]
public KeyValuePair<string, IComponentFactory<IDataView, IDataTransform>>[] Transform;
[Argument(ArgumentType.Multiple, Visibility = ArgumentAttribute.VisibilityType.CmdLineOnly,
HelpText = "Transform", Name ="Transform", ShortName = "xf", SignatureType = typeof(SignatureDataTransform))]
public KeyValuePair<string, IComponentFactory<IDataView, IDataTransform>>[] Transforms;
}

[BestFriend]
Expand Down Expand Up @@ -134,9 +135,9 @@ protected virtual void SendTelemetryCore(IPipe<TelemetryMessage> pipe)
{
Contracts.AssertValue(pipe);

if (Args.Transform != null)
if (Args.Transforms != null)
{
foreach (var transform in Args.Transform)
foreach (var transform in Args.Transforms)
SendTelemetryComponent(pipe, transform.Value);
}
}
Expand Down Expand Up @@ -293,8 +294,8 @@ protected void LoadModelObjects(
trainPipe = pipe;
}

if (Utils.Size(Args.Transform) > 0)
pipe = CompositeDataLoader.Create(Host, pipe, Args.Transform);
if (Utils.Size(Args.Transforms) > 0)
pipe = CompositeDataLoader.Create(Host, pipe, Args.Transforms);

// Next consider loading the training data's role mapped schema.
trainSchema = null;
Expand Down Expand Up @@ -330,7 +331,7 @@ protected IDataLoader CreateLoader(Func<IHostEnvironment, IMultiStreamSource, ID

private IDataLoader CreateTransformChain(IDataLoader loader)
{
return CompositeDataLoader.Create(Host, loader, Args.Transform);
return CompositeDataLoader.Create(Host, loader, Args.Transforms);
}

protected IDataLoader CreateRawLoader(
Expand Down
14 changes: 8 additions & 6 deletions src/Microsoft.ML.Data/Commands/EvaluateCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,9 @@ public sealed class Arguments
[Argument(ArgumentType.LastOccurenceWins, HelpText = "Column to use for grouping", ShortName = "group", SortOrder = 5)]
public string GroupColumn = DefaultColumnNames.GroupId;

[Argument(ArgumentType.LastOccurenceWins, HelpText = "Columns with custom kinds declared through key assignments, for example, col[Kind]=Name to assign column named 'Name' kind 'Kind'", ShortName = "col", SortOrder = 10)]
public KeyValuePair<string, string>[] CustomColumn;
[Argument(ArgumentType.LastOccurenceWins, HelpText = "Columns with custom kinds declared through key assignments, for example, col[Kind]=Name to assign column named 'Name' kind 'Kind'",
Name = "CustomColumn", ShortName = "col", SortOrder = 10)]
public KeyValuePair<string, string>[] CustomColumns;

[Argument(ArgumentType.Multiple, HelpText = "Evaluator to use", ShortName = "eval", SignatureType = typeof(SignatureMamlEvaluator))]
public IComponentFactory<IMamlEvaluator> Evaluator;
Expand All @@ -155,7 +156,7 @@ private static IDataTransform Create(IHostEnvironment env, Arguments args, IData
args.GroupColumn, DefaultColumnNames.GroupId);
string weight = TrainUtils.MatchNameOrDefaultOrNull(ch, schema, nameof(Arguments.WeightColumn),
args.WeightColumn, DefaultColumnNames.Weight);
var customCols = TrainUtils.CheckAndGenerateCustomColumns(ch, args.CustomColumn);
var customCols = TrainUtils.CheckAndGenerateCustomColumns(ch, args.CustomColumns);

ch.Trace("Creating evaluator");
IMamlEvaluator eval = args.Evaluator?.CreateComponent(env) ??
Expand Down Expand Up @@ -183,8 +184,9 @@ public sealed class Arguments : DataCommand.ArgumentsBase
[Argument(ArgumentType.AtMostOnce, HelpText = "Name column name", ShortName = "name", SortOrder = 6)]
public string NameColumn = DefaultColumnNames.Name;

[Argument(ArgumentType.LastOccurenceWins, HelpText = "Columns with custom kinds declared through key assignments, for example, col[Kind]=Name to assign column named 'Name' kind 'Kind'", ShortName = "col", SortOrder = 10)]
public KeyValuePair<string, string>[] CustomColumn;
[Argument(ArgumentType.LastOccurenceWins, HelpText = "Columns with custom kinds declared through key assignments, for example, col[Kind]=Name to assign column named 'Name' kind 'Kind'",
Name ="CustomColumn", ShortName = "col", SortOrder = 10)]
public KeyValuePair<string, string>[] CustomColumns;

[Argument(ArgumentType.Multiple, HelpText = "Evaluator to use", ShortName = "eval", SignatureType = typeof(SignatureMamlEvaluator))]
public IComponentFactory<IMamlEvaluator> Evaluator;
Expand Down Expand Up @@ -232,7 +234,7 @@ private void RunCore(IChannel ch)
Args.WeightColumn, DefaultColumnNames.Weight);
string name = TrainUtils.MatchNameOrDefaultOrNull(ch, schema, nameof(Arguments.NameColumn),
Args.NameColumn, DefaultColumnNames.Name);
var customCols = TrainUtils.CheckAndGenerateCustomColumns(ch, Args.CustomColumn);
var customCols = TrainUtils.CheckAndGenerateCustomColumns(ch, Args.CustomColumns);

ch.Trace("Creating evaluator");
var evaluator = Args.Evaluator?.CreateComponent(Host) ??
Expand Down
2 changes: 1 addition & 1 deletion src/Microsoft.ML.Data/Commands/SaveDataCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ internal sealed class ShowDataCommand : DataCommand.ImplBase<ShowDataCommand.Arg
{
public sealed class Arguments : DataCommand.ArgumentsBase
{
[Argument(ArgumentType.Multiple, HelpText = "Comma separate list of columns to display", ShortName = "cols")]
[Argument(ArgumentType.Multiple, HelpText = "Comma separated list of columns to display", ShortName = "cols")]
public string Columns;

[Argument(ArgumentType.AtMostOnce, HelpText = "Number of rows")]
Expand Down
27 changes: 14 additions & 13 deletions src/Microsoft.ML.Data/Commands/ScoreCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ public sealed class Arguments : DataCommand.ArgumentsBase

[Argument(ArgumentType.Multiple,
HelpText = "Input columns: Columns with custom kinds declared through key assignments, for example, col[Kind]=Name to assign column named 'Name' kind 'Kind'",
ShortName = "col", SortOrder = 10)]
public KeyValuePair<string, string>[] CustomColumn;
Name = "CustomColumn", ShortName = "col", SortOrder = 10)]
public KeyValuePair<string, string>[] CustomColumns;

[Argument(ArgumentType.Multiple, HelpText = "Scorer to use", SignatureType = typeof(SignatureDataScorer))]
public TScorerFactory Scorer;
Expand All @@ -70,8 +70,9 @@ public sealed class Arguments : DataCommand.ArgumentsBase
[Argument(ArgumentType.AtMostOnce, HelpText = "Whether to output all columns or just scores", ShortName = "all")]
public bool? OutputAllColumns;

[Argument(ArgumentType.Multiple, HelpText = "What columns to output beyond score columns, if outputAllColumns=-.", ShortName = "outCol")]
public string[] OutputColumn;
[Argument(ArgumentType.Multiple, HelpText = "What columns to output beyond score columns, if outputAllColumns=-.",
Name = "OutputColumn", ShortName = "outCol")]
public string[] OutputColumns;
}

internal const string Summary = "Scores a data file.";
Expand Down Expand Up @@ -114,7 +115,7 @@ private void RunCore(IChannel ch)
nameof(Args.FeatureColumn), Args.FeatureColumn, DefaultColumnNames.Features);
string group = TrainUtils.MatchNameOrDefaultOrNull(ch, loader.Schema,
nameof(Args.GroupColumn), Args.GroupColumn, DefaultColumnNames.GroupId);
var customCols = TrainUtils.CheckAndGenerateCustomColumns(ch, Args.CustomColumn);
var customCols = TrainUtils.CheckAndGenerateCustomColumns(ch, Args.CustomColumns);
var schema = new RoleMappedSchema(loader.Schema, label: null, feature: feat, group: group, custom: customCols, opt: true);
var mapper = bindable.Bind(Host, schema);

Expand Down Expand Up @@ -156,20 +157,20 @@ private void RunCore(IChannel ch)

bool outputAllColumns =
Args.OutputAllColumns == true
|| (Args.OutputAllColumns == null && Utils.Size(Args.OutputColumn) == 0 && outputIsBinary);
|| (Args.OutputAllColumns == null && Utils.Size(Args.OutputColumns) == 0 && outputIsBinary);

bool outputNamesAndLabels =
Args.OutputAllColumns == true || Utils.Size(Args.OutputColumn) == 0;
Args.OutputAllColumns == true || Utils.Size(Args.OutputColumns) == 0;

if (Args.OutputAllColumns == true && Utils.Size(Args.OutputColumn) != 0)
ch.Warning(nameof(Args.OutputAllColumns) + "=+ always writes all columns irrespective of " + nameof(Args.OutputColumn) + " specified.");
if (Args.OutputAllColumns == true && Utils.Size(Args.OutputColumns) != 0)
ch.Warning(nameof(Args.OutputAllColumns) + "=+ always writes all columns irrespective of " + nameof(Args.OutputColumns) + " specified.");

if (!outputAllColumns && Utils.Size(Args.OutputColumn) != 0)
if (!outputAllColumns && Utils.Size(Args.OutputColumns) != 0)
{
foreach (var outCol in Args.OutputColumn)
foreach (var outCol in Args.OutputColumns)
{
if (!loader.Schema.TryGetColumnIndex(outCol, out int dummyColIndex))
throw ch.ExceptUserArg(nameof(Arguments.OutputColumn), "Column '{0}' not found.", outCol);
throw ch.ExceptUserArg(nameof(Arguments.OutputColumns), "Column '{0}' not found.", outCol);
}
}

Expand Down Expand Up @@ -226,7 +227,7 @@ private bool ShouldAddColumn(Schema schema, int i, uint scoreSet, bool outputNam
break;
}
}
if (Args.OutputColumn != null && Array.FindIndex(Args.OutputColumn, schema[i].Name.Equals) >= 0)
if (Args.OutputColumns != null && Array.FindIndex(Args.OutputColumns, schema[i].Name.Equals) >= 0)
return true;
return false;
}
Expand Down
8 changes: 5 additions & 3 deletions src/Microsoft.ML.Data/Commands/TestCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,10 @@ public sealed class Arguments : DataCommand.ArgumentsBase
[Argument(ArgumentType.AtMostOnce, HelpText = "Name column name", ShortName = "name", SortOrder = 6)]
public string NameColumn = DefaultColumnNames.Name;

[Argument(ArgumentType.LastOccurenceWins, HelpText = "Columns with custom kinds declared through key assignments, for example, col[Kind]=Name to assign column named 'Name' kind 'Kind'", ShortName = "col", SortOrder = 10)]
public KeyValuePair<string, string>[] CustomColumn;
[Argument(ArgumentType.LastOccurenceWins,
HelpText = "Columns with custom kinds declared through key assignments, for example, col[Kind]=Name to assign column named 'Name' kind 'Kind'",
Name = "CustomColumn", ShortName = "col", SortOrder = 10)]
public KeyValuePair<string, string>[] CustomColumns;

[Argument(ArgumentType.Multiple, HelpText = "Scorer to use", NullName = "<Auto>", SortOrder = 101, SignatureType = typeof(SignatureDataScorer))]
public IComponentFactory<IDataView, ISchemaBoundMapper, RoleMappedSchema, IDataScorerTransform> Scorer;
Expand Down Expand Up @@ -106,7 +108,7 @@ private void RunCore(IChannel ch)
Args.WeightColumn, DefaultColumnNames.Weight);
string name = TrainUtils.MatchNameOrDefaultOrNull(ch, schema, nameof(Args.NameColumn),
Args.NameColumn, DefaultColumnNames.Name);
var customCols = TrainUtils.CheckAndGenerateCustomColumns(ch, Args.CustomColumn);
var customCols = TrainUtils.CheckAndGenerateCustomColumns(ch, Args.CustomColumns);

// Score.
ch.Trace("Scoring and evaluating");
Expand Down
Loading