From 9855d815d348b45a576bca51dab76db904657bd3 Mon Sep 17 00:00:00 2001 From: Wei-Sheng Chin Date: Wed, 19 Dec 2018 17:57:54 -0800 Subject: [PATCH 1/2] loads inf/nan properly --- src/Microsoft.ML.LightGBM/WrappedLightGbmBooster.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.ML.LightGBM/WrappedLightGbmBooster.cs b/src/Microsoft.ML.LightGBM/WrappedLightGbmBooster.cs index 152274740f..2744298121 100644 --- a/src/Microsoft.ML.LightGBM/WrappedLightGbmBooster.cs +++ b/src/Microsoft.ML.LightGBM/WrappedLightGbmBooster.cs @@ -96,10 +96,10 @@ internal unsafe string GetModelString() private static double[] Str2DoubleArray(string str, char delimiter) { - return str.Split(delimiter).Select( - x => { double t; double.TryParse(x, out t); return t; } - ).ToArray(); - + return str.Split(delimiter) + .Select(s => double.TryParse(s.Replace("inf", "∞"), out double rslt) ? rslt : + (s.Contains("nan") ? double.NaN : throw new Exception($"Cannot parse as double: {s}"))) + .ToArray(); } private static int[] Str2IntArray(string str, char delimiter) From 21878ef56d4687e4e90b0bffe4b17b7e876a0d98 Mon Sep 17 00:00:00 2001 From: Wei-Sheng Chin Date: Wed, 2 Jan 2019 10:03:38 -0800 Subject: [PATCH 2/2] Address comments --- .../WrappedLightGbmBooster.cs | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.ML.LightGBM/WrappedLightGbmBooster.cs b/src/Microsoft.ML.LightGBM/WrappedLightGbmBooster.cs index 2744298121..a4e48dd83b 100644 --- a/src/Microsoft.ML.LightGBM/WrappedLightGbmBooster.cs +++ b/src/Microsoft.ML.LightGBM/WrappedLightGbmBooster.cs @@ -96,10 +96,24 @@ internal unsafe string GetModelString() private static double[] Str2DoubleArray(string str, char delimiter) { - return str.Split(delimiter) - .Select(s => double.TryParse(s.Replace("inf", "∞"), out double rslt) ? rslt : - (s.Contains("nan") ? double.NaN : throw new Exception($"Cannot parse as double: {s}"))) - .ToArray(); + var values = new List(); + foreach (var token in str.Split(delimiter)) + { + var trimmed = token.Trim(); + + if (trimmed.Equals("inf", StringComparison.OrdinalIgnoreCase)) + values.Add(double.PositiveInfinity); + else if (trimmed.Equals("-inf", StringComparison.OrdinalIgnoreCase)) + values.Add(double.NegativeInfinity); + else if (trimmed.Contains("nan")) + values.Add(double.NaN); + else + // The value carried in the trimmed string is not inf, -inf, or nan. + // Therefore, double.Parse should be able to generate a valid number from it. + // If parsing fails, an exception will be thrown. + values.Add(double.Parse(trimmed)); + } + return values.ToArray(); } private static int[] Str2IntArray(string str, char delimiter)