From c073e6b3bcb271afe002cd1fb354bb2309551a28 Mon Sep 17 00:00:00 2001 From: LittleLittleCloud Date: Tue, 28 Apr 2020 12:25:38 -0700 Subject: [PATCH 1/5] upgrade to 3.1 --- .../Templates/Console/PredictProject.cs | 2 +- .../Templates/Console/PredictProject.tt | 2 +- ...s.AzureCodeGeneratorTest.test.ConsoleApp.csproj.approved.txt | 2 +- ...CodeGeneratorTest.CodeGenTest.ConsoleApp.csproj.approved.txt | 2 +- ...GeneratorTests.ConsoleAppProjectFileContentTest.approved.txt | 2 +- ...eConsoleAppProjectContents_VerifyPredictProject.approved.txt | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.ML.CodeGenerator/Templates/Console/PredictProject.cs b/src/Microsoft.ML.CodeGenerator/Templates/Console/PredictProject.cs index 96c4bbf124..29f288a076 100644 --- a/src/Microsoft.ML.CodeGenerator/Templates/Console/PredictProject.cs +++ b/src/Microsoft.ML.CodeGenerator/Templates/Console/PredictProject.cs @@ -27,7 +27,7 @@ internal partial class PredictProject : PredictProjectBase public virtual string TransformText() { this.Write("\r\n\r\n \r\n Exe\r\n netcoreapp2.1\r\n \r\n netcoreapp3.1\r\n \r\n \r\n \r\n"); diff --git a/src/Microsoft.ML.CodeGenerator/Templates/Console/PredictProject.tt b/src/Microsoft.ML.CodeGenerator/Templates/Console/PredictProject.tt index 1dd932085e..15e82d409c 100644 --- a/src/Microsoft.ML.CodeGenerator/Templates/Console/PredictProject.tt +++ b/src/Microsoft.ML.CodeGenerator/Templates/Console/PredictProject.tt @@ -8,7 +8,7 @@ Exe - netcoreapp2.1 + netcoreapp3.1 diff --git a/test/Microsoft.ML.CodeGenerator.Tests/ApprovalTests/ConsoleCodeGeneratorTests.AzureCodeGeneratorTest.test.ConsoleApp.csproj.approved.txt b/test/Microsoft.ML.CodeGenerator.Tests/ApprovalTests/ConsoleCodeGeneratorTests.AzureCodeGeneratorTest.test.ConsoleApp.csproj.approved.txt index 66e5ca3695..f94467d5dc 100644 --- a/test/Microsoft.ML.CodeGenerator.Tests/ApprovalTests/ConsoleCodeGeneratorTests.AzureCodeGeneratorTest.test.ConsoleApp.csproj.approved.txt +++ b/test/Microsoft.ML.CodeGenerator.Tests/ApprovalTests/ConsoleCodeGeneratorTests.AzureCodeGeneratorTest.test.ConsoleApp.csproj.approved.txt @@ -2,7 +2,7 @@ Exe - netcoreapp2.1 + netcoreapp3.1 diff --git a/test/Microsoft.ML.CodeGenerator.Tests/ApprovalTests/ConsoleCodeGeneratorTests.AzureImageCodeGeneratorTest.CodeGenTest.ConsoleApp.csproj.approved.txt b/test/Microsoft.ML.CodeGenerator.Tests/ApprovalTests/ConsoleCodeGeneratorTests.AzureImageCodeGeneratorTest.CodeGenTest.ConsoleApp.csproj.approved.txt index 23fa52e0c1..5a0f249e82 100644 --- a/test/Microsoft.ML.CodeGenerator.Tests/ApprovalTests/ConsoleCodeGeneratorTests.AzureImageCodeGeneratorTest.CodeGenTest.ConsoleApp.csproj.approved.txt +++ b/test/Microsoft.ML.CodeGenerator.Tests/ApprovalTests/ConsoleCodeGeneratorTests.AzureImageCodeGeneratorTest.CodeGenTest.ConsoleApp.csproj.approved.txt @@ -2,7 +2,7 @@ Exe - netcoreapp2.1 + netcoreapp3.1 diff --git a/test/Microsoft.ML.CodeGenerator.Tests/ApprovalTests/ConsoleCodeGeneratorTests.ConsoleAppProjectFileContentTest.approved.txt b/test/Microsoft.ML.CodeGenerator.Tests/ApprovalTests/ConsoleCodeGeneratorTests.ConsoleAppProjectFileContentTest.approved.txt index 9ef4077dee..97df9ea672 100644 --- a/test/Microsoft.ML.CodeGenerator.Tests/ApprovalTests/ConsoleCodeGeneratorTests.ConsoleAppProjectFileContentTest.approved.txt +++ b/test/Microsoft.ML.CodeGenerator.Tests/ApprovalTests/ConsoleCodeGeneratorTests.ConsoleAppProjectFileContentTest.approved.txt @@ -2,7 +2,7 @@ Exe - netcoreapp2.1 + netcoreapp3.1 diff --git a/test/Microsoft.ML.CodeGenerator.Tests/ApprovalTests/ConsoleCodeGeneratorTests.Recommendation_GenerateConsoleAppProjectContents_VerifyPredictProject.approved.txt b/test/Microsoft.ML.CodeGenerator.Tests/ApprovalTests/ConsoleCodeGeneratorTests.Recommendation_GenerateConsoleAppProjectContents_VerifyPredictProject.approved.txt index 14a45f8c0c..e261bed0fd 100644 --- a/test/Microsoft.ML.CodeGenerator.Tests/ApprovalTests/ConsoleCodeGeneratorTests.Recommendation_GenerateConsoleAppProjectContents_VerifyPredictProject.approved.txt +++ b/test/Microsoft.ML.CodeGenerator.Tests/ApprovalTests/ConsoleCodeGeneratorTests.Recommendation_GenerateConsoleAppProjectContents_VerifyPredictProject.approved.txt @@ -2,7 +2,7 @@ Exe - netcoreapp2.1 + netcoreapp3.1 From 8f0fc1a59dd3aa6186ec4e94f9cccf93fab4dae4 Mon Sep 17 00:00:00 2001 From: LittleLittleCloud Date: Tue, 28 Apr 2020 12:31:31 -0700 Subject: [PATCH 2/5] write inline data using invariantCulture --- src/Microsoft.ML.CodeGenerator/Utils.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.ML.CodeGenerator/Utils.cs b/src/Microsoft.ML.CodeGenerator/Utils.cs index 216097064c..075bc577ce 100644 --- a/src/Microsoft.ML.CodeGenerator/Utils.cs +++ b/src/Microsoft.ML.CodeGenerator/Utils.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Reflection; @@ -101,7 +102,7 @@ internal static string GetValueFromColumn(DataViewRowCursor rowCursor, DataVi return "Single.NegativeInfinity"; } - return f?.ToString() + "F"; + return f?.ToString(CultureInfo.InvariantCulture) + "F"; } if (val is bool) From 3d3ba08bd3f6f16da252a1ddb6f3e47ec76b2139 Mon Sep 17 00:00:00 2001 From: LittleLittleCloud Date: Tue, 2 Feb 2021 12:39:43 -0800 Subject: [PATCH 3/5] make column inference serializable --- .../API/ColumnInference.cs | 18 +++++++++++----- src/Microsoft.ML.AutoML/Assembly.cs | 2 +- src/Microsoft.ML.CodeGenerator/Assembly.cs | 2 +- .../ColumnInferenceTests.cs | 18 ++++++++++++++++ .../Microsoft.ML.AutoML.Tests.csproj | 21 ++----------------- 5 files changed, 35 insertions(+), 26 deletions(-) diff --git a/src/Microsoft.ML.AutoML/API/ColumnInference.cs b/src/Microsoft.ML.AutoML/API/ColumnInference.cs index ab2539b948..a2d697da98 100644 --- a/src/Microsoft.ML.AutoML/API/ColumnInference.cs +++ b/src/Microsoft.ML.AutoML/API/ColumnInference.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using Microsoft.ML.Data; +using Newtonsoft.Json; namespace Microsoft.ML.AutoML { @@ -20,6 +21,7 @@ public sealed class ColumnInferenceResults /// Can be used to instantiate a new to load /// data into an . /// + [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include)] public TextLoader.Options TextLoaderOptions { get; internal set; } /// @@ -31,6 +33,7 @@ public sealed class ColumnInferenceResults /// See /// for example. /// + [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include)] public ColumnInformation ColumnInformation { get; internal set; } } @@ -90,31 +93,36 @@ public sealed class ColumnInformation /// /// Categorical data columns should generally be columns that contain a small number of unique values. /// - public ICollection CategoricalColumnNames { get; } + [JsonProperty] + public ICollection CategoricalColumnNames { get; private set; } /// /// The dataset columns that are numeric. /// /// The default value is a new, empty . - public ICollection NumericColumnNames { get; } + [JsonProperty] + public ICollection NumericColumnNames { get; private set; } /// /// The dataset columns that are text. /// /// The default value is a new, empty . - public ICollection TextColumnNames { get; } + [JsonProperty] + public ICollection TextColumnNames { get; private set; } /// /// The dataset columns that AutoML should ignore. /// /// The default value is a new, empty . - public ICollection IgnoredColumnNames { get; } + [JsonProperty] + public ICollection IgnoredColumnNames { get; private set; } /// /// The dataset columns that are image paths. /// /// The default value is a new, empty . - public ICollection ImagePathColumnNames { get; } + [JsonProperty] + public ICollection ImagePathColumnNames { get; private set; } public ColumnInformation() { diff --git a/src/Microsoft.ML.AutoML/Assembly.cs b/src/Microsoft.ML.AutoML/Assembly.cs index 1fd879e42e..110e01af7b 100644 --- a/src/Microsoft.ML.AutoML/Assembly.cs +++ b/src/Microsoft.ML.AutoML/Assembly.cs @@ -13,5 +13,5 @@ [assembly: InternalsVisibleTo("Microsoft.ML.ModelBuilder, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293")] [assembly: InternalsVisibleTo("Microsoft.ML.ModelBuilder.AutoMLService, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293")] [assembly: InternalsVisibleTo("Microsoft.ML.ModelBuilder.AutoMLService.Gpu, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293")] -[assembly: InternalsVisibleTo("Microsoft.ML.ModelBuilder.AutoMLService.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293")] +[assembly: InternalsVisibleTo("Microsoft.ML.ModelBuilder.AutoMLService.Tests, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293")] diff --git a/src/Microsoft.ML.CodeGenerator/Assembly.cs b/src/Microsoft.ML.CodeGenerator/Assembly.cs index 9b9e70ea85..71b6b77d88 100644 --- a/src/Microsoft.ML.CodeGenerator/Assembly.cs +++ b/src/Microsoft.ML.CodeGenerator/Assembly.cs @@ -10,4 +10,4 @@ [assembly: InternalsVisibleTo("mlnet.Tests, PublicKey=00240000048000009400000006020000002400005253413100040000010001004b86c4cb78549b34bab61a3b1800e23bfeb5b3ec390074041536a7e3cbd97f5f04cf0f857155a8928eaa29ebfd11cfbbad3ba70efea7bda3226c6a8d370a4cd303f714486b6ebc225985a638471e6ef571cc92a4613c00b8fa65d61ccee0cbe5f36330c9a01f4183559f1bef24cc2917c6d913e3a541333a1d05d9bed22b38cb")] [assembly: InternalsVisibleTo("Microsoft.ML.ModelBuilder.AutoMLService, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293")] [assembly: InternalsVisibleTo("Microsoft.ML.ModelBuilder.AutoMLService.Gpu, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293")] -[assembly: InternalsVisibleTo("Microsoft.ML.ModelBuilder.AutoMLService.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293")] +[assembly: InternalsVisibleTo("Microsoft.ML.ModelBuilder.AutoMLService.Tests, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293")] diff --git a/test/Microsoft.ML.AutoML.Tests/ColumnInferenceTests.cs b/test/Microsoft.ML.AutoML.Tests/ColumnInferenceTests.cs index f7b7c2f2fb..63ada4d493 100644 --- a/test/Microsoft.ML.AutoML.Tests/ColumnInferenceTests.cs +++ b/test/Microsoft.ML.AutoML.Tests/ColumnInferenceTests.cs @@ -2,9 +2,13 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using ApprovalTests; +using ApprovalTests.Namers; +using ApprovalTests.Reporters; using FluentAssertions; using Microsoft.ML.Data; using Microsoft.ML.TestFramework; +using Newtonsoft.Json; using Xunit; using Xunit.Abstractions; @@ -222,5 +226,19 @@ public void InferColumnsFromMultilineInputFile() Assert.Equal("description", result.ColumnInformation.TextColumnNames.First()); Assert.Equal("animal", result.ColumnInformation.CategoricalColumnNames.First()); } + + [Fact] + [UseReporter(typeof(DiffReporter))] + [UseApprovalSubdirectory("ApprovalTests")] + public void Wiki_column_inference_result_should_be_serializable() + { + var wiki = Path.Combine("TestData", "wiki-column-inference.json"); + using (var stream = new StreamReader(wiki)) + { + var json = stream.ReadToEnd(); + var columnInferenceResults = JsonConvert.DeserializeObject(json); + Approvals.Verify(JsonConvert.SerializeObject(columnInferenceResults, Formatting.Indented)); + } + } } } diff --git a/test/Microsoft.ML.AutoML.Tests/Microsoft.ML.AutoML.Tests.csproj b/test/Microsoft.ML.AutoML.Tests/Microsoft.ML.AutoML.Tests.csproj index 2800f55994..fad409f5f0 100644 --- a/test/Microsoft.ML.AutoML.Tests/Microsoft.ML.AutoML.Tests.csproj +++ b/test/Microsoft.ML.AutoML.Tests/Microsoft.ML.AutoML.Tests.csproj @@ -7,30 +7,13 @@ + - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - + PreserveNewest From 4a82531a86dafec2e7a2d178b05693dfc5d27f98 Mon Sep 17 00:00:00 2001 From: LittleLittleCloud Date: Tue, 2 Feb 2021 12:50:12 -0800 Subject: [PATCH 4/5] add test json --- .../TestData/wiki-column-inference.json | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 test/Microsoft.ML.AutoML.Tests/TestData/wiki-column-inference.json diff --git a/test/Microsoft.ML.AutoML.Tests/TestData/wiki-column-inference.json b/test/Microsoft.ML.AutoML.Tests/TestData/wiki-column-inference.json new file mode 100644 index 0000000000..79c9e98a07 --- /dev/null +++ b/test/Microsoft.ML.AutoML.Tests/TestData/wiki-column-inference.json @@ -0,0 +1,66 @@ +{ + "TextLoaderOptions": { + "AllowQuoting": true, + "AllowSparse": false, + "InputSize": null, + "Separators": [ + "\t" + ], + "DecimalMarker": ".", + "Columns": [ + { + "Name": "Sentiment", + "Source": [ + { + "Min": 0, + "Max": 0, + "AutoEnd": false, + "VariableEnd": false, + "AllOther": false, + "ForceVector": false + } + ], + "KeyCount": null, + "DataKind": 11 + }, + { + "Name": "SentimentText", + "Source": [ + { + "Min": 1, + "Max": 1, + "AutoEnd": false, + "VariableEnd": false, + "AllOther": false, + "ForceVector": false + } + ], + "KeyCount": null, + "DataKind": 11 + } + ], + "TrimWhitespace": false, + "HasHeader": true, + "UseThreads": true, + "ReadMultilines": false, + "HeaderFile": null, + "MaxRows": null, + "EscapeChar": "\"", + "MissingRealsAsNaNs": false + }, + "ColumnInformation": { + "LabelColumnName": "Sentiment", + "UserIdColumnName": null, + "GroupIdColumnName": null, + "ItemIdColumnName": null, + "ExampleWeightColumnName": null, + "SamplingKeyColumnName": null, + "CategoricalColumnNames": [], + "NumericColumnNames": [], + "TextColumnNames": [ + "SentimentText" + ], + "IgnoredColumnNames": [], + "ImagePathColumnNames": [] + } +} \ No newline at end of file From 6465ab91bad8efcc529f2a6ef0e62beef54de065 Mon Sep 17 00:00:00 2001 From: LittleLittleCloud Date: Tue, 2 Feb 2021 14:35:52 -0800 Subject: [PATCH 5/5] add approvaltests --- ...result_should_be_serializable.approved.txt | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 test/Microsoft.ML.AutoML.Tests/ApprovalTests/ColumnInferenceTests.Wiki_column_inference_result_should_be_serializable.approved.txt diff --git a/test/Microsoft.ML.AutoML.Tests/ApprovalTests/ColumnInferenceTests.Wiki_column_inference_result_should_be_serializable.approved.txt b/test/Microsoft.ML.AutoML.Tests/ApprovalTests/ColumnInferenceTests.Wiki_column_inference_result_should_be_serializable.approved.txt new file mode 100644 index 0000000000..79c9e98a07 --- /dev/null +++ b/test/Microsoft.ML.AutoML.Tests/ApprovalTests/ColumnInferenceTests.Wiki_column_inference_result_should_be_serializable.approved.txt @@ -0,0 +1,66 @@ +{ + "TextLoaderOptions": { + "AllowQuoting": true, + "AllowSparse": false, + "InputSize": null, + "Separators": [ + "\t" + ], + "DecimalMarker": ".", + "Columns": [ + { + "Name": "Sentiment", + "Source": [ + { + "Min": 0, + "Max": 0, + "AutoEnd": false, + "VariableEnd": false, + "AllOther": false, + "ForceVector": false + } + ], + "KeyCount": null, + "DataKind": 11 + }, + { + "Name": "SentimentText", + "Source": [ + { + "Min": 1, + "Max": 1, + "AutoEnd": false, + "VariableEnd": false, + "AllOther": false, + "ForceVector": false + } + ], + "KeyCount": null, + "DataKind": 11 + } + ], + "TrimWhitespace": false, + "HasHeader": true, + "UseThreads": true, + "ReadMultilines": false, + "HeaderFile": null, + "MaxRows": null, + "EscapeChar": "\"", + "MissingRealsAsNaNs": false + }, + "ColumnInformation": { + "LabelColumnName": "Sentiment", + "UserIdColumnName": null, + "GroupIdColumnName": null, + "ItemIdColumnName": null, + "ExampleWeightColumnName": null, + "SamplingKeyColumnName": null, + "CategoricalColumnNames": [], + "NumericColumnNames": [], + "TextColumnNames": [ + "SentimentText" + ], + "IgnoredColumnNames": [], + "ImagePathColumnNames": [] + } +} \ No newline at end of file