diff --git a/src/Microsoft.ML.Core/Data/IValueMapper.cs b/src/Microsoft.ML.Core/Data/IValueMapper.cs index 3b00fcdbbf..c6abfbc02d 100644 --- a/src/Microsoft.ML.Core/Data/IValueMapper.cs +++ b/src/Microsoft.ML.Core/Data/IValueMapper.cs @@ -9,13 +9,13 @@ namespace Microsoft.ML.Runtime.Data /// /// Delegate type to map/convert a value. /// - public delegate void ValueMapper(ref TSrc src, ref TDst dst); + public delegate void ValueMapper(in TSrc src, ref TDst dst); /// /// Delegate type to map/convert among three values, for example, one input with two /// outputs, or two inputs with one output. /// - public delegate void ValueMapper(ref TVal1 val1, ref TVal2 val2, ref TVal3 val3); + public delegate void ValueMapper(in TVal1 val1, ref TVal2 val2, ref TVal3 val3); /// /// Interface for mapping a single input value (of an indicated ColumnType) to diff --git a/src/Microsoft.ML.Data/Commands/ShowSchemaCommand.cs b/src/Microsoft.ML.Data/Commands/ShowSchemaCommand.cs index 4510715d6e..4fb0738e58 100644 --- a/src/Microsoft.ML.Data/Commands/ShowSchemaCommand.cs +++ b/src/Microsoft.ML.Data/Commands/ShowSchemaCommand.cs @@ -239,7 +239,7 @@ private static void ShowMetadataValue(IndentingTextWriter itw, ISchema schema var value = default(T); var sb = default(StringBuilder); schema.GetMetadata(kind, col, ref value); - conv(ref value, ref sb); + conv(in value, ref sb); itw.Write(": '{0}'", sb); } @@ -292,7 +292,7 @@ private static void ShowMetadataValueVec(IndentingTextWriter itw, ISchema sch else itw.Write(", "); var val = item.Value; - conv(ref val, ref sb); + conv(in val, ref sb); itw.Write("[{0}] '{1}'", item.Key, sb); count++; } diff --git a/src/Microsoft.ML.Data/Data/Conversion.cs b/src/Microsoft.ML.Data/Data/Conversion.cs index cb2791e585..e65533a25f 100644 --- a/src/Microsoft.ML.Data/Data/Conversion.cs +++ b/src/Microsoft.ML.Data/Data/Conversion.cs @@ -534,32 +534,32 @@ public ValueMapper GetKeyStringConversion(KeyType key) if (count > 0) { return - (ref TSrc src, ref SB dst) => + (in TSrc src, ref SB dst) => { ulong tmp = 0; - convSrc(ref src, ref tmp); + convSrc(in src, ref tmp); if (tmp == 0 || tmp > (ulong)count) ClearDst(ref dst); else { tmp = tmp + min - 1; - convU8(ref tmp, ref dst); + convU8(in tmp, ref dst); } }; } else { return - (ref TSrc src, ref SB dst) => + (in TSrc src, ref SB dst) => { U8 tmp = 0; - convSrc(ref src, ref tmp); + convSrc(in src, ref tmp); if (tmp == 0 || min > 1 && tmp > U8.MaxValue - min + 1) ClearDst(ref dst); else { tmp = tmp + min - 1; - convU8(ref tmp, ref dst); + convU8(in tmp, ref dst); } }; } @@ -610,7 +610,7 @@ private TryParseMapper GetKeyTryParse(KeyType key) return false; // REVIEW: This call to fnConv should never need range checks, so could be made faster. // Also, it would be nice to be able to assert that it doesn't overflow.... - fnConv(ref uu, ref dst); + fnConv(in uu, ref dst); return true; }; } @@ -645,7 +645,7 @@ private ValueMapper GetKeyParse(KeyType key) bool identity; var fnConv = GetStandardConversion(NumberType.U8, NumberType.FromKind(key.RawKind), out identity); return - (ref TX src, ref TDst dst) => + (in TX src, ref TDst dst) => { ulong uu; dst = default(TDst); @@ -656,7 +656,7 @@ private ValueMapper GetKeyParse(KeyType key) } // REVIEW: This call to fnConv should never need range checks, so could be made faster. // Also, it would be nice to be able to assert that it doesn't overflow.... - fnConv(ref uu, ref dst); + fnConv(in uu, ref dst); }; } @@ -856,126 +856,126 @@ public ValueGetter GetNAOrDefaultGetter(ColumnType type) #endregion GetNA #region ToI1 - public void Convert(ref I1 src, ref I1 dst) => dst = src; - public void Convert(ref I2 src, ref I1 dst) => dst = (I1)src; - public void Convert(ref I4 src, ref I1 dst) => dst = (I1)src; - public void Convert(ref I8 src, ref I1 dst) => dst = (I1)src; + public void Convert(in I1 src, ref I1 dst) => dst = src; + public void Convert(in I2 src, ref I1 dst) => dst = (I1)src; + public void Convert(in I4 src, ref I1 dst) => dst = (I1)src; + public void Convert(in I8 src, ref I1 dst) => dst = (I1)src; #endregion ToI1 #region ToI2 - public void Convert(ref I1 src, ref I2 dst) => dst = src; - public void Convert(ref I2 src, ref I2 dst) => dst = src; - public void Convert(ref I4 src, ref I2 dst) => dst = (I2)src; - public void Convert(ref I8 src, ref I2 dst) => dst = (I2)src; + public void Convert(in I1 src, ref I2 dst) => dst = src; + public void Convert(in I2 src, ref I2 dst) => dst = src; + public void Convert(in I4 src, ref I2 dst) => dst = (I2)src; + public void Convert(in I8 src, ref I2 dst) => dst = (I2)src; #endregion ToI2 #region ToI4 - public void Convert(ref I1 src, ref I4 dst) => dst = src; - public void Convert(ref I2 src, ref I4 dst) => dst = src; - public void Convert(ref I4 src, ref I4 dst) => dst = src; - public void Convert(ref I8 src, ref I4 dst) => dst = (I4)src; + public void Convert(in I1 src, ref I4 dst) => dst = src; + public void Convert(in I2 src, ref I4 dst) => dst = src; + public void Convert(in I4 src, ref I4 dst) => dst = src; + public void Convert(in I8 src, ref I4 dst) => dst = (I4)src; #endregion ToI4 #region ToI8 - public void Convert(ref I1 src, ref I8 dst) => dst = src; - public void Convert(ref I2 src, ref I8 dst) => dst = src; - public void Convert(ref I4 src, ref I8 dst) => dst = src; - public void Convert(ref I8 src, ref I8 dst) => dst = src; - - public void Convert(ref TS src, ref I8 dst) => dst = (I8)src.Ticks; - public void Convert(ref DT src, ref I8 dst) => dst = (I8)src.Ticks; - public void Convert(ref DZ src, ref I8 dst) => dst = (I8)src.UtcDateTime.Ticks; + public void Convert(in I1 src, ref I8 dst) => dst = src; + public void Convert(in I2 src, ref I8 dst) => dst = src; + public void Convert(in I4 src, ref I8 dst) => dst = src; + public void Convert(in I8 src, ref I8 dst) => dst = src; + + public void Convert(in TS src, ref I8 dst) => dst = (I8)src.Ticks; + public void Convert(in DT src, ref I8 dst) => dst = (I8)src.Ticks; + public void Convert(in DZ src, ref I8 dst) => dst = (I8)src.UtcDateTime.Ticks; #endregion ToI8 #region ToU1 - public void Convert(ref U1 src, ref U1 dst) => dst = src; - public void Convert(ref U2 src, ref U1 dst) => dst = src <= U1.MaxValue ? (U1)src : (U1)0; - public void Convert(ref U4 src, ref U1 dst) => dst = src <= U1.MaxValue ? (U1)src : (U1)0; - public void Convert(ref U8 src, ref U1 dst) => dst = src <= U1.MaxValue ? (U1)src : (U1)0; - public void Convert(ref UG src, ref U1 dst) => dst = src.Hi == 0 && src.Lo <= U1.MaxValue ? (U1)src.Lo : (U1)0; + public void Convert(in U1 src, ref U1 dst) => dst = src; + public void Convert(in U2 src, ref U1 dst) => dst = src <= U1.MaxValue ? (U1)src : (U1)0; + public void Convert(in U4 src, ref U1 dst) => dst = src <= U1.MaxValue ? (U1)src : (U1)0; + public void Convert(in U8 src, ref U1 dst) => dst = src <= U1.MaxValue ? (U1)src : (U1)0; + public void Convert(in UG src, ref U1 dst) => dst = src.Hi == 0 && src.Lo <= U1.MaxValue ? (U1)src.Lo : (U1)0; #endregion ToU1 #region ToU2 - public void Convert(ref U1 src, ref U2 dst) => dst = src; - public void Convert(ref U2 src, ref U2 dst) => dst = src; - public void Convert(ref U4 src, ref U2 dst) => dst = src <= U2.MaxValue ? (U2)src : (U2)0; - public void Convert(ref U8 src, ref U2 dst) => dst = src <= U2.MaxValue ? (U2)src : (U2)0; - public void Convert(ref UG src, ref U2 dst) => dst = src.Hi == 0 && src.Lo <= U2.MaxValue ? (U2)src.Lo : (U2)0; + public void Convert(in U1 src, ref U2 dst) => dst = src; + public void Convert(in U2 src, ref U2 dst) => dst = src; + public void Convert(in U4 src, ref U2 dst) => dst = src <= U2.MaxValue ? (U2)src : (U2)0; + public void Convert(in U8 src, ref U2 dst) => dst = src <= U2.MaxValue ? (U2)src : (U2)0; + public void Convert(in UG src, ref U2 dst) => dst = src.Hi == 0 && src.Lo <= U2.MaxValue ? (U2)src.Lo : (U2)0; #endregion ToU2 #region ToU4 - public void Convert(ref U1 src, ref U4 dst) => dst = src; - public void Convert(ref U2 src, ref U4 dst) => dst = src; - public void Convert(ref U4 src, ref U4 dst) => dst = src; - public void Convert(ref U8 src, ref U4 dst) => dst = src <= U4.MaxValue ? (U4)src : (U4)0; - public void Convert(ref UG src, ref U4 dst) => dst = src.Hi == 0 && src.Lo <= U4.MaxValue ? (U4)src.Lo : (U4)0; + public void Convert(in U1 src, ref U4 dst) => dst = src; + public void Convert(in U2 src, ref U4 dst) => dst = src; + public void Convert(in U4 src, ref U4 dst) => dst = src; + public void Convert(in U8 src, ref U4 dst) => dst = src <= U4.MaxValue ? (U4)src : (U4)0; + public void Convert(in UG src, ref U4 dst) => dst = src.Hi == 0 && src.Lo <= U4.MaxValue ? (U4)src.Lo : (U4)0; #endregion ToU4 #region ToU8 - public void Convert(ref U1 src, ref U8 dst) => dst = src; - public void Convert(ref U2 src, ref U8 dst) => dst = src; - public void Convert(ref U4 src, ref U8 dst) => dst = src; - public void Convert(ref U8 src, ref U8 dst) => dst = src; - public void Convert(ref UG src, ref U8 dst) => dst = src.Hi == 0 ? src.Lo : (U8)0; + public void Convert(in U1 src, ref U8 dst) => dst = src; + public void Convert(in U2 src, ref U8 dst) => dst = src; + public void Convert(in U4 src, ref U8 dst) => dst = src; + public void Convert(in U8 src, ref U8 dst) => dst = src; + public void Convert(in UG src, ref U8 dst) => dst = src.Hi == 0 ? src.Lo : (U8)0; #endregion ToU8 #region ToUG - public void Convert(ref U1 src, ref UG dst) => dst = new UG(src, 0); - public void Convert(ref U2 src, ref UG dst) => dst = new UG(src, 0); - public void Convert(ref U4 src, ref UG dst) => dst = new UG(src, 0); - public void Convert(ref U8 src, ref UG dst) => dst = new UG(src, 0); - public void Convert(ref UG src, ref UG dst) => dst = src; + public void Convert(in U1 src, ref UG dst) => dst = new UG(src, 0); + public void Convert(in U2 src, ref UG dst) => dst = new UG(src, 0); + public void Convert(in U4 src, ref UG dst) => dst = new UG(src, 0); + public void Convert(in U8 src, ref UG dst) => dst = new UG(src, 0); + public void Convert(in UG src, ref UG dst) => dst = src; #endregion ToUG #region ToR4 - public void Convert(ref I1 src, ref R4 dst) => dst = (R4)src; - public void Convert(ref I2 src, ref R4 dst) => dst = (R4)src; - public void Convert(ref I4 src, ref R4 dst) => dst = (R4)src; - public void Convert(ref I8 src, ref R4 dst) => dst = (R4)src; - public void Convert(ref U1 src, ref R4 dst) => dst = src; - public void Convert(ref U2 src, ref R4 dst) => dst = src; - public void Convert(ref U4 src, ref R4 dst) => dst = src; + public void Convert(in I1 src, ref R4 dst) => dst = (R4)src; + public void Convert(in I2 src, ref R4 dst) => dst = (R4)src; + public void Convert(in I4 src, ref R4 dst) => dst = (R4)src; + public void Convert(in I8 src, ref R4 dst) => dst = (R4)src; + public void Convert(in U1 src, ref R4 dst) => dst = src; + public void Convert(in U2 src, ref R4 dst) => dst = src; + public void Convert(in U4 src, ref R4 dst) => dst = src; // REVIEW: The 64-bit JIT has a bug in that it rounds incorrectly from ulong // to floating point when the high bit of the ulong is set. Should we work around the bug // or just live with it? See the DoubleParser code for details. - public void Convert(ref U8 src, ref R4 dst) => dst = src; + public void Convert(in U8 src, ref R4 dst) => dst = src; - public void Convert(ref TS src, ref R4 dst) => dst = (R4)src.Ticks; - public void Convert(ref DT src, ref R4 dst) => dst = (R4)src.Ticks; - public void Convert(ref DZ src, ref R4 dst) => dst = (R4)src.UtcDateTime.Ticks; + public void Convert(in TS src, ref R4 dst) => dst = (R4)src.Ticks; + public void Convert(in DT src, ref R4 dst) => dst = (R4)src.Ticks; + public void Convert(in DZ src, ref R4 dst) => dst = (R4)src.UtcDateTime.Ticks; #endregion ToR4 #region ToR8 - public void Convert(ref I1 src, ref R8 dst) => dst = (R8)src; - public void Convert(ref I2 src, ref R8 dst) => dst = (R8)src; - public void Convert(ref I4 src, ref R8 dst) => dst = (R8)src; - public void Convert(ref I8 src, ref R8 dst) => dst = (R8)src; - public void Convert(ref U1 src, ref R8 dst) => dst = src; - public void Convert(ref U2 src, ref R8 dst) => dst = src; - public void Convert(ref U4 src, ref R8 dst) => dst = src; + public void Convert(in I1 src, ref R8 dst) => dst = (R8)src; + public void Convert(in I2 src, ref R8 dst) => dst = (R8)src; + public void Convert(in I4 src, ref R8 dst) => dst = (R8)src; + public void Convert(in I8 src, ref R8 dst) => dst = (R8)src; + public void Convert(in U1 src, ref R8 dst) => dst = src; + public void Convert(in U2 src, ref R8 dst) => dst = src; + public void Convert(in U4 src, ref R8 dst) => dst = src; // REVIEW: The 64-bit JIT has a bug in that it rounds incorrectly from ulong // to floating point when the high bit of the ulong is set. Should we work around the bug // or just live with it? See the DoubleParser code for details. - public void Convert(ref U8 src, ref R8 dst) => dst = src; + public void Convert(in U8 src, ref R8 dst) => dst = src; - public void Convert(ref TS src, ref R8 dst) => dst = (R8)src.Ticks; - public void Convert(ref DT src, ref R8 dst) => dst = (R8)src.Ticks; - public void Convert(ref DZ src, ref R8 dst) => dst = (R8)src.UtcDateTime.Ticks; + public void Convert(in TS src, ref R8 dst) => dst = (R8)src.Ticks; + public void Convert(in DT src, ref R8 dst) => dst = (R8)src.Ticks; + public void Convert(in DZ src, ref R8 dst) => dst = (R8)src.UtcDateTime.Ticks; #endregion ToR8 #region ToStringBuilder - public void Convert(ref I1 src, ref SB dst) { ClearDst(ref dst); dst.Append(src); } - public void Convert(ref I2 src, ref SB dst) { ClearDst(ref dst); dst.Append(src); } - public void Convert(ref I4 src, ref SB dst) { ClearDst(ref dst); dst.Append(src); } - public void Convert(ref I8 src, ref SB dst) { ClearDst(ref dst); dst.Append(src); } - public void Convert(ref U1 src, ref SB dst) => ClearDst(ref dst).Append(src); - public void Convert(ref U2 src, ref SB dst) => ClearDst(ref dst).Append(src); - public void Convert(ref U4 src, ref SB dst) => ClearDst(ref dst).Append(src); - public void Convert(ref U8 src, ref SB dst) => ClearDst(ref dst).Append(src); - public void Convert(ref UG src, ref SB dst) { ClearDst(ref dst); dst.AppendFormat("0x{0:x16}{1:x16}", src.Hi, src.Lo); } - public void Convert(ref R4 src, ref SB dst) { ClearDst(ref dst); if (R4.IsNaN(src)) dst.AppendFormat(CultureInfo.InvariantCulture, "{0}", "?"); else dst.AppendFormat(CultureInfo.InvariantCulture, "{0:R}", src); } - public void Convert(ref R8 src, ref SB dst) { ClearDst(ref dst); if (R8.IsNaN(src)) dst.AppendFormat(CultureInfo.InvariantCulture, "{0}", "?"); else dst.AppendFormat(CultureInfo.InvariantCulture, "{0:G17}", src); } - public void Convert(ref BL src, ref SB dst) + public void Convert(in I1 src, ref SB dst) { ClearDst(ref dst); dst.Append(src); } + public void Convert(in I2 src, ref SB dst) { ClearDst(ref dst); dst.Append(src); } + public void Convert(in I4 src, ref SB dst) { ClearDst(ref dst); dst.Append(src); } + public void Convert(in I8 src, ref SB dst) { ClearDst(ref dst); dst.Append(src); } + public void Convert(in U1 src, ref SB dst) => ClearDst(ref dst).Append(src); + public void Convert(in U2 src, ref SB dst) => ClearDst(ref dst).Append(src); + public void Convert(in U4 src, ref SB dst) => ClearDst(ref dst).Append(src); + public void Convert(in U8 src, ref SB dst) => ClearDst(ref dst).Append(src); + public void Convert(in UG src, ref SB dst) { ClearDst(ref dst); dst.AppendFormat("0x{0:x16}{1:x16}", src.Hi, src.Lo); } + public void Convert(in R4 src, ref SB dst) { ClearDst(ref dst); if (R4.IsNaN(src)) dst.AppendFormat(CultureInfo.InvariantCulture, "{0}", "?"); else dst.AppendFormat(CultureInfo.InvariantCulture, "{0:R}", src); } + public void Convert(in R8 src, ref SB dst) { ClearDst(ref dst); if (R8.IsNaN(src)) dst.AppendFormat(CultureInfo.InvariantCulture, "{0}", "?"); else dst.AppendFormat(CultureInfo.InvariantCulture, "{0:G17}", src); } + public void Convert(in BL src, ref SB dst) { ClearDst(ref dst); if (!src) @@ -983,19 +983,19 @@ public void Convert(ref BL src, ref SB dst) else dst.Append("1"); } - public void Convert(ref TS src, ref SB dst) { ClearDst(ref dst); dst.AppendFormat("{0:c}", src); } - public void Convert(ref DT src, ref SB dst) { ClearDst(ref dst); dst.AppendFormat("{0:o}", src); } - public void Convert(ref DZ src, ref SB dst) { ClearDst(ref dst); dst.AppendFormat("{0:o}", src); } + public void Convert(in TS src, ref SB dst) { ClearDst(ref dst); dst.AppendFormat("{0:c}", src); } + public void Convert(in DT src, ref SB dst) { ClearDst(ref dst); dst.AppendFormat("{0:o}", src); } + public void Convert(in DZ src, ref SB dst) { ClearDst(ref dst); dst.AppendFormat("{0:o}", src); } #endregion ToStringBuilder #region FromR4 - public void Convert(ref R4 src, ref R4 dst) => dst = src; - public void Convert(ref R4 src, ref R8 dst) => dst = src; + public void Convert(in R4 src, ref R4 dst) => dst = src; + public void Convert(in R4 src, ref R8 dst) => dst = src; #endregion FromR4 #region FromR8 - public void Convert(ref R8 src, ref R4 dst) => dst = (R4)src; - public void Convert(ref R8 src, ref R8 dst) => dst = src; + public void Convert(in R8 src, ref R4 dst) => dst = (R4)src; + public void Convert(in R8 src, ref R8 dst) => dst = src; #endregion FromR8 #region FromTX @@ -1666,44 +1666,44 @@ private bool TryParse(in TX src, out TX dst) return true; } - public void Convert(ref TX span, ref I1 value) + public void Convert(in TX span, ref I1 value) { value = ParseI1(in span); } - public void Convert(ref TX span, ref U1 value) + public void Convert(in TX span, ref U1 value) { value = ParseU1(in span); } - public void Convert(ref TX span, ref I2 value) + public void Convert(in TX span, ref I2 value) { value = ParseI2(in span); } - public void Convert(ref TX span, ref U2 value) + public void Convert(in TX span, ref U2 value) { value = ParseU2(in span); } - public void Convert(ref TX span, ref I4 value) + public void Convert(in TX span, ref I4 value) { value = ParseI4(in span); } - public void Convert(ref TX span, ref U4 value) + public void Convert(in TX span, ref U4 value) { value = ParseU4(in span); } - public void Convert(ref TX span, ref I8 value) + public void Convert(in TX span, ref I8 value) { value = ParseI8(in span); } - public void Convert(ref TX span, ref U8 value) + public void Convert(in TX span, ref U8 value) { value = ParseU8(in span); } - public void Convert(ref TX span, ref UG value) + public void Convert(in TX span, ref UG value) { if (!TryParse(in span, out value)) Contracts.Assert(value.Equals(default(UG))); } - public void Convert(ref TX src, ref R4 value) + public void Convert(in TX src, ref R4 value) { var span = src.Span; if (DoubleParser.TryParse(span, out value)) @@ -1711,7 +1711,7 @@ public void Convert(ref TX src, ref R4 value) // Unparsable is mapped to NA. value = R4.NaN; } - public void Convert(ref TX src, ref R8 value) + public void Convert(in TX src, ref R8 value) { var span = src.Span; if (DoubleParser.TryParse(span, out value)) @@ -1719,37 +1719,37 @@ public void Convert(ref TX src, ref R8 value) // Unparsable is mapped to NA. value = R8.NaN; } - public void Convert(ref TX span, ref TX value) + public void Convert(in TX span, ref TX value) { value = span; } - public void Convert(ref TX src, ref BL value) + public void Convert(in TX src, ref BL value) { // When TryParseBL returns false, it should have set value to false. if (!TryParse(in src, out value)) Contracts.Assert(!value); } - public void Convert(ref TX src, ref SB dst) + public void Convert(in TX src, ref SB dst) { ClearDst(ref dst); if (!src.IsEmpty) dst.AppendMemory(src); } - public void Convert(ref TX span, ref TS value) => TryParse(in span, out value); - public void Convert(ref TX span, ref DT value) => TryParse(in span, out value); - public void Convert(ref TX span, ref DZ value) => TryParse(in span, out value); + public void Convert(in TX span, ref TS value) => TryParse(in span, out value); + public void Convert(in TX span, ref DT value) => TryParse(in span, out value); + public void Convert(in TX span, ref DZ value) => TryParse(in span, out value); #endregion FromTX #region FromBL - public void Convert(ref BL src, ref I1 dst) => dst = (I1)(object)src; - public void Convert(ref BL src, ref I2 dst) => dst = (I2)(object)src; - public void Convert(ref BL src, ref I4 dst) => dst = (I4)(object)src; - public void Convert(ref BL src, ref I8 dst) => dst = (I8)(object)src; - public void Convert(ref BL src, ref R4 dst) => dst = System.Convert.ToSingle(src); - public void Convert(ref BL src, ref R8 dst) => dst = System.Convert.ToDouble(src); - public void Convert(ref BL src, ref BL dst) => dst = src; + public void Convert(in BL src, ref I1 dst) => dst = (I1)(object)src; + public void Convert(in BL src, ref I2 dst) => dst = (I2)(object)src; + public void Convert(in BL src, ref I4 dst) => dst = (I4)(object)src; + public void Convert(in BL src, ref I8 dst) => dst = (I8)(object)src; + public void Convert(in BL src, ref R4 dst) => dst = System.Convert.ToSingle(src); + public void Convert(in BL src, ref R8 dst) => dst = System.Convert.ToDouble(src); + public void Convert(in BL src, ref BL dst) => dst = src; #endregion FromBL } } \ No newline at end of file diff --git a/src/Microsoft.ML.Data/Data/DataViewUtils.cs b/src/Microsoft.ML.Data/Data/DataViewUtils.cs index 5d4e015ef9..5c5dff3d72 100644 --- a/src/Microsoft.ML.Data/Data/DataViewUtils.cs +++ b/src/Microsoft.ML.Data/Data/DataViewUtils.cs @@ -1342,7 +1342,7 @@ public static ValueGetter> GetSingleValueGetter(IRow cur if (!Conversions.Instance.TryGetStringConversion(colType, out conversion)) { var error = $"Cannot display {colType}"; - conversion = (ref T src, ref StringBuilder builder) => + conversion = (in T src, ref StringBuilder builder) => { if (builder == null) builder = new StringBuilder(); @@ -1357,7 +1357,7 @@ public static ValueGetter> GetSingleValueGetter(IRow cur (ref ReadOnlyMemory value) => { floatGetter(ref v); - conversion(ref v, ref dst); + conversion(in v, ref dst); string text = dst.ToString(); value = text.AsMemory(); }; @@ -1384,7 +1384,7 @@ public static ValueGetter> GetVectorFlatteningGetter(IRo x => { var v = x.Value; - conversion(ref v, ref dst); + conversion(in v, ref dst); return dst.ToString(); })); value = string.Format("<{0}{1}>", stringRep, suffix).AsMemory(); diff --git a/src/Microsoft.ML.Data/Data/RowCursorUtils.cs b/src/Microsoft.ML.Data/Data/RowCursorUtils.cs index 5a4d7530ed..a47ad15f76 100644 --- a/src/Microsoft.ML.Data/Data/RowCursorUtils.cs +++ b/src/Microsoft.ML.Data/Data/RowCursorUtils.cs @@ -99,7 +99,7 @@ private static ValueGetter GetGetterAsCore(ColumnType typeSrc, (ref TDst dst) => { getter(ref src); - conv(ref src, ref dst); + conv(in src, ref dst); }; } @@ -134,7 +134,7 @@ private static ValueGetter GetGetterAsStringBuilderCore(Col (ref StringBuilder dst) => { getter(ref src); - conv(ref src, ref dst); + conv(in src, ref dst); }; } @@ -278,7 +278,7 @@ private static ValueGetter> GetVecGetterAsCore(VectorT // REVIEW: This would be faster if there were loops for each std conversion. // Consider adding those to the Conversions class. for (int i = 0; i < count; i++) - conv(ref src.Values[i], ref values[i]); + conv(in src.Values[i], ref values[i]); if (!src.IsDense) { diff --git a/src/Microsoft.ML.Data/DataLoadSave/Binary/BinaryLoader.cs b/src/Microsoft.ML.Data/DataLoadSave/Binary/BinaryLoader.cs index 73e8a25f3f..39816d3f24 100644 --- a/src/Microsoft.ML.Data/DataLoadSave/Binary/BinaryLoader.cs +++ b/src/Microsoft.ML.Data/DataLoadSave/Binary/BinaryLoader.cs @@ -1228,7 +1228,7 @@ private TableOfContentsEntry CreateRowIndexEntry(string rowIndexName) int count = _header.RowCount <= int.MaxValue ? (int)_header.RowCount : 0; KeyType type = new KeyType(DataKind.U8, 0, count); // We are mapping the row index as expressed as a long, into a key value, so we must increment by one. - ValueMapper mapper = (ref long src, ref ulong dst) => dst = (ulong)(src + 1); + ValueMapper mapper = (in long src, ref ulong dst) => dst = (ulong)(src + 1); var entry = new TableOfContentsEntry(this, rowIndexName, type, mapper); return entry; } @@ -1710,7 +1710,7 @@ private void Get(ref T value) { Ectx.Check(_curr != null, _badCursorState); long src = _curr.RowIndexLim - _remaining - 1; - _mapper(ref src, ref value); + _mapper(in src, ref value); } public override Delegate GetGetter() diff --git a/src/Microsoft.ML.Data/DataLoadSave/PartitionedFileLoader.cs b/src/Microsoft.ML.Data/DataLoadSave/PartitionedFileLoader.cs index af03c58224..5998cd0f22 100644 --- a/src/Microsoft.ML.Data/DataLoadSave/PartitionedFileLoader.cs +++ b/src/Microsoft.ML.Data/DataLoadSave/PartitionedFileLoader.cs @@ -610,7 +610,7 @@ private ValueGetter GetterDelegateCore(int col, ColumnType type) return (ref TValue value) => { - conv(ref _colValues[col], ref value); + conv(in _colValues[col], ref value); }; } diff --git a/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderParser.cs b/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderParser.cs index 3226d18446..b5e87296a8 100644 --- a/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderParser.cs +++ b/src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderParser.cs @@ -1015,7 +1015,7 @@ public int GatherFields(ReadOnlyMemory lineSpan, ReadOnlySpan span, int csrc = default; try { - Conversions.Instance.Convert(ref spanT, ref csrc); + Conversions.Instance.Convert(in spanT, ref csrc); } catch { diff --git a/src/Microsoft.ML.Data/DataLoadSave/Text/TextSaver.cs b/src/Microsoft.ML.Data/DataLoadSave/Text/TextSaver.cs index ede2477023..8e83f01ac1 100644 --- a/src/Microsoft.ML.Data/DataLoadSave/Text/TextSaver.cs +++ b/src/Microsoft.ML.Data/DataLoadSave/Text/TextSaver.cs @@ -116,28 +116,28 @@ protected ValueWriterBase(PrimitiveType type, int source, char sep) Conv = Conversions.Instance.GetStringConversion(type); var d = default(T); - Conv(ref d, ref Sb); + Conv(in d, ref Sb); Default = Sb.ToString(); } - protected void MapText(ref ReadOnlyMemory src, ref StringBuilder sb) + protected void MapText(in ReadOnlyMemory src, ref StringBuilder sb) { TextSaverUtils.MapText(src.Span, ref sb, Sep); } - protected void MapTimeSpan(ref TimeSpan src, ref StringBuilder sb) + protected void MapTimeSpan(in TimeSpan src, ref StringBuilder sb) { - TextSaverUtils.MapTimeSpan(ref src, ref sb); + TextSaverUtils.MapTimeSpan(in src, ref sb); } - protected void MapDateTime(ref DateTime src, ref StringBuilder sb) + protected void MapDateTime(in DateTime src, ref StringBuilder sb) { - TextSaverUtils.MapDateTime(ref src, ref sb); + TextSaverUtils.MapDateTime(in src, ref sb); } - protected void MapDateTimeZone(ref DateTimeOffset src, ref StringBuilder sb) + protected void MapDateTimeZone(in DateTimeOffset src, ref StringBuilder sb) { - TextSaverUtils.MapDateTimeZone(ref src, ref sb); + TextSaverUtils.MapDateTimeZone(in src, ref sb); } } @@ -170,7 +170,7 @@ public override void WriteData(Action appendItem, out int le { for (int i = 0; i < _src.Length; i++) { - Conv(ref _src.Values[i], ref Sb); + Conv(in _src.Values[i], ref Sb); appendItem(Sb, i); } } @@ -178,7 +178,7 @@ public override void WriteData(Action appendItem, out int le { for (int i = 0; i < _src.Count; i++) { - Conv(ref _src.Values[i], ref Sb); + Conv(in _src.Values[i], ref Sb); appendItem(Sb, _src.Indices[i]); } } @@ -195,7 +195,7 @@ public override void WriteHeader(Action appendItem, out int var name = _slotNames.Values[i]; if (name.IsEmpty) continue; - MapText(ref name, ref Sb); + MapText(in name, ref Sb); int index = _slotNames.IsDense ? i : _slotNames.Indices[i]; appendItem(Sb, index); } @@ -218,7 +218,7 @@ public ValueWriter(IRowCursor cursor, PrimitiveType type, int source, char sep) public override void WriteData(Action appendItem, out int length) { _getSrc(ref _src); - Conv(ref _src, ref Sb); + Conv(in _src, ref Sb); appendItem(Sb, 0); length = 1; } @@ -226,7 +226,7 @@ public override void WriteData(Action appendItem, out int le public override void WriteHeader(Action appendItem, out int length) { var span = _columnName.AsMemory(); - MapText(ref span, ref Sb); + MapText(in span, ref Sb); appendItem(Sb, 0); length = 1; } @@ -846,7 +846,7 @@ internal static void MapText(ReadOnlySpan span, ref StringBuilder sb, char } } - internal static void MapTimeSpan(ref TimeSpan src, ref StringBuilder sb) + internal static void MapTimeSpan(in TimeSpan src, ref StringBuilder sb) { if (sb == null) sb = new StringBuilder(); @@ -856,7 +856,7 @@ internal static void MapTimeSpan(ref TimeSpan src, ref StringBuilder sb) sb.AppendFormat("\"{0:c}\"", src); } - internal static void MapDateTime(ref DateTime src, ref StringBuilder sb) + internal static void MapDateTime(in DateTime src, ref StringBuilder sb) { if (sb == null) sb = new StringBuilder(); @@ -866,7 +866,7 @@ internal static void MapDateTime(ref DateTime src, ref StringBuilder sb) sb.AppendFormat("\"{0:o}\"", src); } - internal static void MapDateTimeZone(ref DateTimeOffset src, ref StringBuilder sb) + internal static void MapDateTimeZone(in DateTimeOffset src, ref StringBuilder sb) { if (sb == null) sb = new StringBuilder(); diff --git a/src/Microsoft.ML.Data/DataView/LambdaColumnMapper.cs b/src/Microsoft.ML.Data/DataView/LambdaColumnMapper.cs index 26f9c2ade7..817ba98ed1 100644 --- a/src/Microsoft.ML.Data/DataView/LambdaColumnMapper.cs +++ b/src/Microsoft.ML.Data/DataView/LambdaColumnMapper.cs @@ -165,7 +165,7 @@ protected override Delegate GetGetterCore(IChannel ch, IRow input, int iinfo, ou (ref T2 v2) => { getSrc(ref v1); - _map1(ref v1, ref v2); + _map1(in v1, ref v2); }; return getter; } @@ -178,8 +178,8 @@ protected override Delegate GetGetterCore(IChannel ch, IRow input, int iinfo, ou (ref T3 v3) => { getSrc(ref v1); - _map1(ref v1, ref v2); - _map2(ref v2, ref v3); + _map1(in v1, ref v2); + _map2(in v2, ref v3); }; return getter; } diff --git a/src/Microsoft.ML.Data/DataView/LambdaFilter.cs b/src/Microsoft.ML.Data/DataView/LambdaFilter.cs index ff05d89f51..d778ddbc11 100644 --- a/src/Microsoft.ML.Data/DataView/LambdaFilter.cs +++ b/src/Microsoft.ML.Data/DataView/LambdaFilter.cs @@ -170,7 +170,7 @@ public RowCursor(Impl parent, IRowCursor input, bool[] active) _pred = (in T1 src) => { - conv(ref _src, ref val); + conv(in _src, ref val); return pred(in val); }; } diff --git a/src/Microsoft.ML.Data/Evaluators/EvaluatorUtils.cs b/src/Microsoft.ML.Data/Evaluators/EvaluatorUtils.cs index 2bebb8c844..646b7b3547 100644 --- a/src/Microsoft.ML.Data/Evaluators/EvaluatorUtils.cs +++ b/src/Microsoft.ML.Data/Evaluators/EvaluatorUtils.cs @@ -372,7 +372,7 @@ private static IDataView AddTextColumn(IHostEnvironment env, IDataView inp { Contracts.Check(typeSrc.RawType == typeof(TSrc)); return LambdaColumnMapper.Create(env, registrationName, input, inputColName, outputColName, typeSrc, TextType.Instance, - (ref TSrc src, ref ReadOnlyMemory dst) => dst = value.AsMemory()); + (in TSrc src, ref ReadOnlyMemory dst) => dst = value.AsMemory()); } /// @@ -406,7 +406,7 @@ private static IDataView AddKeyColumn(IHostEnvironment env, IDataView inpu { Contracts.Check(typeSrc.RawType == typeof(TSrc)); return LambdaColumnMapper.Create(env, registrationName, input, inputColName, outputColName, typeSrc, - new KeyType(DataKind.U4, 0, keyCount), (ref TSrc src, ref uint dst) => + new KeyType(DataKind.U4, 0, keyCount), (in TSrc src, ref uint dst) => { if (value < 0 || value > keyCount) dst = 0; @@ -507,7 +507,7 @@ public static IDataView AddFoldIndex(IHostEnvironment env, IDataView input, int if (def.Equals(default(T))) { mapper = - (ref VBuffer src, ref VBuffer dst) => + (in VBuffer src, ref VBuffer dst) => { Contracts.Assert(src.Length == Utils.Size(map)); @@ -533,7 +533,7 @@ public static IDataView AddFoldIndex(IHostEnvironment env, IDataView input, int naIndices.Add(j); } mapper = - (ref VBuffer src, ref VBuffer dst) => + (in VBuffer src, ref VBuffer dst) => { Contracts.Assert(src.Length == Utils.Size(map)); var values = dst.Values; @@ -622,7 +622,7 @@ public static void ReconcileKeyValues(IHostEnvironment env, IDataView[] views, s { var keyMapperCur = keyValueMappers[i]; ValueMapper mapper = - (ref uint src, ref uint dst) => + (in uint src, ref uint dst) => { if (src == 0 || src > keyMapperCur.Length) dst = 0; @@ -653,7 +653,7 @@ public static void ReconcileKeyValuesWithNoNames(IHostEnvironment env, IDataView if (!views[i].Schema.TryGetColumnIndex(columnName, out var index)) throw env.Except($"Data view {i} doesn't contain a column '{columnName}'"); ValueMapper mapper = - (ref uint src, ref uint dst) => + (in uint src, ref uint dst) => { if (src > keyCount) dst = 0; @@ -689,7 +689,7 @@ public static void ReconcileVectorKeyValues(IHostEnvironment env, IDataView[] vi { var keyMapperCur = keyValueMappers[i]; ValueMapper, VBuffer> mapper = - (ref VBuffer src, ref VBuffer dst) => + (in VBuffer src, ref VBuffer dst) => { var values = dst.Values; if (Utils.Size(values) < src.Count) @@ -984,7 +984,7 @@ private static IDataView AddVarLengthColumn(IHostEnvironment env, IDataVie { return LambdaColumnMapper.Create(env, "ChangeToVarLength", idv, variableSizeVectorColumnName, variableSizeVectorColumnName + "_VarLength", typeSrc, new VectorType(typeSrc.ItemType.AsPrimitive), - (ref VBuffer src, ref VBuffer dst) => src.CopyTo(ref dst)); + (in VBuffer src, ref VBuffer dst) => src.CopyTo(ref dst)); } private static List GetMetricNames(IChannel ch, Schema schema, IRow row, Func ignoreCol, diff --git a/src/Microsoft.ML.Data/Evaluators/MulticlassClassifierEvaluator.cs b/src/Microsoft.ML.Data/Evaluators/MulticlassClassifierEvaluator.cs index fb27335e87..b2e479fcf0 100644 --- a/src/Microsoft.ML.Data/Evaluators/MulticlassClassifierEvaluator.cs +++ b/src/Microsoft.ML.Data/Evaluators/MulticlassClassifierEvaluator.cs @@ -1105,7 +1105,7 @@ protected override IDataView GetPerInstanceMetricsCore(IDataView perInst, RoleMa { perInst = LambdaColumnMapper.Create(Host, "ConvertToDouble", perInst, schema.Label.Name, schema.Label.Name, perInst.Schema.GetColumnType(labelCol), NumberType.R8, - (ref uint src, ref double dst) => dst = src == 0 ? double.NaN : src - 1 + (double)labelType.AsKey.Min); + (in uint src, ref double dst) => dst = src == 0 ? double.NaN : src - 1 + (double)labelType.AsKey.Min); } var perInstSchema = perInst.Schema; diff --git a/src/Microsoft.ML.Data/Evaluators/QuantileRegressionEvaluator.cs b/src/Microsoft.ML.Data/Evaluators/QuantileRegressionEvaluator.cs index 6b1b480e13..81e3152d4a 100644 --- a/src/Microsoft.ML.Data/Evaluators/QuantileRegressionEvaluator.cs +++ b/src/Microsoft.ML.Data/Evaluators/QuantileRegressionEvaluator.cs @@ -509,7 +509,7 @@ private IDataView ExtractRelevantIndex(IDataView data) var name = data.Schema.GetColumnName(i); var index = _index ?? type.VectorSize / 2; output = LambdaColumnMapper.Create(Host, "Quantile Regression", output, name, name, type, NumberType.R8, - (ref VBuffer src, ref Double dst) => dst = src.GetItemOrDefault(index)); + (in VBuffer src, ref Double dst) => dst = src.GetItemOrDefault(index)); output = new ChooseColumnsByIndexTransform(Host, new ChooseColumnsByIndexTransform.Arguments() { Drop = true, Index = new[] { i } }, output); } diff --git a/src/Microsoft.ML.Data/Prediction/Calibrator.cs b/src/Microsoft.ML.Data/Prediction/Calibrator.cs index d7b48e119c..d5f56fa3d2 100644 --- a/src/Microsoft.ML.Data/Prediction/Calibrator.cs +++ b/src/Microsoft.ML.Data/Prediction/Calibrator.cs @@ -250,9 +250,9 @@ public ValueMapper GetMapper() Host.Check(typeof(TDist) == typeof(Float)); var map = GetMapper(); ValueMapper del = - (ref TIn src, ref Float score, ref Float prob) => + (in TIn src, ref Float score, ref Float prob) => { - map(ref src, ref score); + map(in src, ref score); prob = Calibrator.PredictProbability(score); }; return (ValueMapper)(Delegate)del; diff --git a/src/Microsoft.ML.Data/Scorers/SchemaBindablePredictorWrapper.cs b/src/Microsoft.ML.Data/Scorers/SchemaBindablePredictorWrapper.cs index c2c585f504..5a43f069c4 100644 --- a/src/Microsoft.ML.Data/Scorers/SchemaBindablePredictorWrapper.cs +++ b/src/Microsoft.ML.Data/Scorers/SchemaBindablePredictorWrapper.cs @@ -153,7 +153,7 @@ private ValueGetter GetValueGetter(IRow input, int colSrc) (ref TDst dst) => { featureGetter(ref features); - map(ref features, ref dst); + map(in features, ref dst); }; } @@ -546,7 +546,7 @@ private static void EnsureCachedResultValueMapper(ValueMapper, Fl if (featureGetter != null) featureGetter(ref features); - mapper(ref features, ref score, ref prob); + mapper(in features, ref score, ref prob); cachedPosition = input.Position; } } @@ -667,7 +667,7 @@ protected override Delegate GetPredictionGetter(IRow input, int colSrc) { featureGetter(ref features); Contracts.Check(features.Length == featureCount || featureCount == 0); - map(ref features, ref value); + map(in features, ref value); }; return del; } diff --git a/src/Microsoft.ML.Data/Transforms/InvertHashUtils.cs b/src/Microsoft.ML.Data/Transforms/InvertHashUtils.cs index c51fc07231..5d83f0d67e 100644 --- a/src/Microsoft.ML.Data/Transforms/InvertHashUtils.cs +++ b/src/Microsoft.ML.Data/Transforms/InvertHashUtils.cs @@ -56,11 +56,11 @@ public static ValueMapper GetSimpleMapper(Schema schema, in // REVIEW: We could optimize for identity, but it's probably not worthwhile. var keyMapper = conv.GetStandardConversion(type, NumberType.U4, out identity); return - (ref T src, ref StringBuilder dst) => + (in T src, ref StringBuilder dst) => { ClearDst(ref dst); uint intermediate = 0; - keyMapper(ref src, ref intermediate); + keyMapper(in src, ref intermediate); if (intermediate == 0) return; keyValues.GetItemOrDefault((int)(intermediate - 1), ref value); @@ -77,13 +77,13 @@ public static ValueMapper, StringBuilder> GetPairMapper( StringBuilder sb = null; char[] buffer = null; return - (ref KeyValuePair pair, ref StringBuilder dst) => + (in KeyValuePair pair, ref StringBuilder dst) => { ClearDst(ref dst); dst.Append(pair.Key); dst.Append(':'); var subval = pair.Value; - submap(ref subval, ref sb); + submap(in subval, ref sb); AppendToEnd(sb, dst, ref buffer); }; } @@ -178,7 +178,7 @@ public InvertHashCollector(int slots, int maxCount, ValueMapper>(); - _copier = copier ?? ((ref T src, ref T dst) => dst = src); + _copier = copier ?? ((in T src, ref T dst) => dst = src); } private ReadOnlyMemory Textify(ref StringBuilder sb, ref StringBuilder temp, ref char[] cbuffer, ref Pair[] buffer, HashSet pairs) @@ -199,7 +199,7 @@ private ReadOnlyMemory Textify(ref StringBuilder sb, ref StringBuilder tem if (count == 1) { var value = buffer[0].Value; - _stringifyMapper(ref value, ref temp); + _stringifyMapper(in value, ref temp); return Utils.Size(temp) > 0 ? temp.ToString().AsMemory() : String.Empty.AsMemory(); } @@ -215,7 +215,7 @@ private ReadOnlyMemory Textify(ref StringBuilder sb, ref StringBuilder tem if (i > 0) sb.Append(','); var value = pair.Value; - _stringifyMapper(ref value, ref temp); + _stringifyMapper(in value, ref temp); InvertHashUtils.AppendToEnd(temp, sb, ref cbuffer); } sb.Append('}'); @@ -293,7 +293,7 @@ public void Add(int dstSlot, T key) else pairSet = _slotToValueSet[dstSlot] = new HashSet(_comparer); T dst = default(T); - _copier(ref key, ref dst); + _copier(in key, ref dst); pairSet.Add(new Pair(dst, pairSet.Count)); } diff --git a/src/Microsoft.ML.Data/Transforms/KeyToValueTransform.cs b/src/Microsoft.ML.Data/Transforms/KeyToValueTransform.cs index 96b1e2902f..42fb7f9464 100644 --- a/src/Microsoft.ML.Data/Transforms/KeyToValueTransform.cs +++ b/src/Microsoft.ML.Data/Transforms/KeyToValueTransform.cs @@ -333,7 +333,7 @@ public KeyToValueMap(Mapper parent, KeyType typeKey, PrimitiveType typeVal, TVal private void MapKey(ref TKey src, ref TValue dst) { uint uintSrc = 0; - _convertToUInt(ref src, ref uintSrc); + _convertToUInt(in src, ref uintSrc); // Assign to NA if key value is not in valid range. if (0 < uintSrc && uintSrc <= _values.Length) dst = _values[uintSrc - 1]; diff --git a/src/Microsoft.ML.Data/Transforms/RangeFilter.cs b/src/Microsoft.ML.Data/Transforms/RangeFilter.cs index 257809c44e..66cd67b06b 100644 --- a/src/Microsoft.ML.Data/Transforms/RangeFilter.cs +++ b/src/Microsoft.ML.Data/Transforms/RangeFilter.cs @@ -434,7 +434,7 @@ protected override bool Accept() Ch.Assert(Parent._type.IsKey); _srcGetter(ref _value); ulong value = 0; - _conv(ref _value, ref value); + _conv(in _value, ref value); if (value == 0 || value > (ulong)_count) return false; if (!CheckBounds(((Double)(uint)value - 0.5) / _count)) diff --git a/src/Microsoft.ML.Data/Transforms/TermTransformImpl.cs b/src/Microsoft.ML.Data/Transforms/TermTransformImpl.cs index 1f7c5475b0..a7a16a937b 100644 --- a/src/Microsoft.ML.Data/Transforms/TermTransformImpl.cs +++ b/src/Microsoft.ML.Data/Transforms/TermTransformImpl.cs @@ -632,7 +632,7 @@ internal override void Save(ModelSaveContext ctx, IHostEnvironment host, CodecFa } } - private void KeyMapper(ref ReadOnlyMemory src, ref uint dst) + private void KeyMapper(in ReadOnlyMemory src, ref uint dst) { var nstr = ReadOnlyMemoryUtils.FindInPool(src, _pool); if (nstr == null) @@ -717,7 +717,7 @@ internal override void Save(ModelSaveContext ctx, IHostEnvironment host, CodecFa public override ValueMapper GetKeyMapper() { return - (ref T src, ref uint dst) => + (in T src, ref uint dst) => { int val; if (_values.TryGetIndex(src, out val)) @@ -751,7 +751,7 @@ public override void WriteTextTerms(TextWriter writer) for (int i = 0; i < _values.Count; ++i) { T val = _values.GetItem(i); - stringMapper(ref val, ref sb); + stringMapper(in val, ref sb); writer.WriteLine("{0}\t{1}", i, sb.ToString()); } } @@ -792,7 +792,7 @@ private static void GetTextTerms(in VBuffer src, ValueMapper[src.Length]; for (int i = 0; i < src.Length; ++i) { - stringMapper(ref src.Values[i], ref sb); + stringMapper(in src.Values[i], ref sb); values[i] = sb.ToString().AsMemory(); } dst = new VBuffer>(src.Length, values, dst.Indices); @@ -888,7 +888,7 @@ private static uint MapDefault(ValueMapper map) { T src = default(T); uint dst = 0; - map(ref src, ref dst); + map(in src, ref dst); return dst; } @@ -915,7 +915,7 @@ public override Delegate GetMappingGetter(IRow input) (ref uint dst) => { getSrc(ref src); - map(ref src, ref dst); + map(in src, ref dst); }; return retVal; } @@ -965,7 +965,7 @@ public override Delegate GetMappingGetter(IRow input) int count = src.Count; for (int islot = 0; islot < count; islot++) { - map(ref values[islot], ref dstItem); + map(in values[islot], ref dstItem); if (dstItem != 0) { int slot = indices != null ? indices[islot] : islot; @@ -1003,7 +1003,7 @@ public override Delegate GetMappingGetter(IRow input) { for (int slot = 0; slot < src.Length; ++slot) { - map(ref values[slot], ref dstItem); + map(in values[slot], ref dstItem); if (dstItem != 0) bldr.AddFeature(slot, dstItem); } @@ -1019,7 +1019,7 @@ public override Delegate GetMappingGetter(IRow input) { // This was an explicitly defined value. _host.Assert(islot < src.Count); - map(ref values[islot], ref dstItem); + map(in values[islot], ref dstItem); if (dstItem != 0) bldr.AddFeature(slot, dstItem); nextExplicitSlot = ++islot == src.Count ? src.Length : indices[islot]; @@ -1130,7 +1130,7 @@ private bool AddMetadataCore(ColumnType srcMetaType, Schema.Metadata.Buil foreach (var pair in keyVals.Items(all: true)) { T keyVal = pair.Value; - conv(ref keyVal, ref convKeyVal); + conv(in keyVal, ref convKeyVal); // The builder for the key values should not have any missings. _host.Assert(0 < convKeyVal && convKeyVal <= srcMeta.Length); srcMeta.GetItemOrDefault((int)(convKeyVal - 1), ref values[pair.Key]); @@ -1213,13 +1213,13 @@ private bool WriteTextTermsCore(PrimitiveType srcMetaType, TextWriter wri foreach (var pair in keyVals.Items(all: true)) { T keyVal = pair.Value; - conv(ref keyVal, ref convKeyVal); + conv(in keyVal, ref convKeyVal); // The key mapping will not have admitted missing keys. _host.Assert(0 < convKeyVal && convKeyVal <= srcMeta.Length); srcMeta.GetItemOrDefault((int)(convKeyVal - 1), ref metaVal); - keyStringMapper(ref keyVal, ref sb); + keyStringMapper(in keyVal, ref sb); writer.Write("{0}\t{1}", pair.Key, sb.ToString()); - metaStringMapper(ref metaVal, ref sb); + metaStringMapper(in metaVal, ref sb); writer.WriteLine("\t{0}", sb.ToString()); } return true; diff --git a/src/Microsoft.ML.Ensemble/EnsembleUtils.cs b/src/Microsoft.ML.Ensemble/EnsembleUtils.cs index 6340c719eb..55ef1518be 100644 --- a/src/Microsoft.ML.Ensemble/EnsembleUtils.cs +++ b/src/Microsoft.ML.Ensemble/EnsembleUtils.cs @@ -31,7 +31,7 @@ public static RoleMappedData SelectFeatures(IHost host, RoleMappedData data, Bit var name = data.Schema.Feature.Name; var view = LambdaColumnMapper.Create( host, "FeatureSelector", data.Data, name, name, type, type, - (ref VBuffer src, ref VBuffer dst) => SelectFeatures(in src, features, card, ref dst)); + (in VBuffer src, ref VBuffer dst) => SelectFeatures(in src, features, card, ref dst)); var res = new RoleMappedData(view, data.Schema.GetColumnRoleNames()); return res; diff --git a/src/Microsoft.ML.Ensemble/OutputCombiners/BaseStacking.cs b/src/Microsoft.ML.Ensemble/OutputCombiners/BaseStacking.cs index 75d0989828..eb6dc3a650 100644 --- a/src/Microsoft.ML.Ensemble/OutputCombiners/BaseStacking.cs +++ b/src/Microsoft.ML.Ensemble/OutputCombiners/BaseStacking.cs @@ -104,7 +104,7 @@ public Combiner GetCombiner() (ref TOutput dst, TOutput[] src, Single[] weights) => { FillFeatureBuffer(src, ref feat); - map(ref feat, ref dst); + map(in feat, ref dst); }; return res; } @@ -160,10 +160,10 @@ public void Train(List>> models, if (model.SelectedFeatures != null) { EnsembleUtils.SelectFeatures(in cursor.Features, model.SelectedFeatures, model.Cardinality, ref vBuffers[i]); - maps[i](ref vBuffers[i], ref predictions[i]); + maps[i](in vBuffers[i], ref predictions[i]); } else - maps[i](ref cursor.Features, ref predictions[i]); + maps[i](in cursor.Features, ref predictions[i]); }); Utils.EnsureSize(ref labels, count + 1); diff --git a/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BaseDiverseSelector.cs b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BaseDiverseSelector.cs index 5e31b2c8f5..ac2e85dda6 100644 --- a/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BaseDiverseSelector.cs +++ b/src/Microsoft.ML.Ensemble/Selector/SubModelSelector/BaseDiverseSelector.cs @@ -53,7 +53,7 @@ public override void CalculateMetrics(FeatureSubsetModel GetMapper() var probabilities = new Single[_mappers.Length]; var vBuffers = new VBuffer[_mappers.Length]; ValueMapper, Single> del = - (ref VBuffer src, ref Single dst) => + (in VBuffer src, ref Single dst) => { if (InputType.VectorSize > 0) Host.Check(src.Length == InputType.VectorSize); @@ -142,10 +142,10 @@ public ValueMapper GetMapper() if (model.SelectedFeatures != null) { EnsembleUtils.SelectFeatures(in tmp, model.SelectedFeatures, model.Cardinality, ref vBuffers[i]); - maps[i](ref vBuffers[i], ref predictions[i], ref probabilities[i]); + maps[i](in vBuffers[i], ref predictions[i], ref probabilities[i]); } else - maps[i](ref tmp, ref predictions[i], ref probabilities[i]); + maps[i](in tmp, ref predictions[i], ref probabilities[i]); }); // REVIEW: DistributionEnsemble - AveragedWeights are used only in one of the two PredictDistributions overloads @@ -168,7 +168,7 @@ public ValueMapper GetMapper() var probabilities = new Single[_mappers.Length]; var vBuffers = new VBuffer[_mappers.Length]; ValueMapper, Single, Single> del = - (ref VBuffer src, ref Single score, ref Single prob) => + (in VBuffer src, ref Single score, ref Single prob) => { if (InputType.VectorSize > 0) Host.Check(src.Length == InputType.VectorSize); @@ -180,10 +180,10 @@ public ValueMapper GetMapper() if (model.SelectedFeatures != null) { EnsembleUtils.SelectFeatures(in tmp, model.SelectedFeatures, model.Cardinality, ref vBuffers[i]); - maps[i](ref vBuffers[i], ref predictions[i], ref probabilities[i]); + maps[i](in vBuffers[i], ref predictions[i], ref probabilities[i]); } else - maps[i](ref tmp, ref predictions[i], ref probabilities[i]); + maps[i](in tmp, ref predictions[i], ref probabilities[i]); }); combine(ref score, predictions, _averagedWeights); diff --git a/src/Microsoft.ML.Ensemble/Trainer/EnsemblePredictor.cs b/src/Microsoft.ML.Ensemble/Trainer/EnsemblePredictor.cs index 3200b298e1..b69b76f40e 100644 --- a/src/Microsoft.ML.Ensemble/Trainer/EnsemblePredictor.cs +++ b/src/Microsoft.ML.Ensemble/Trainer/EnsemblePredictor.cs @@ -122,7 +122,7 @@ public ValueMapper GetMapper() maps[i] = _mappers[i].GetMapper, Single>(); ValueMapper, Single> del = - (ref VBuffer src, ref Single dst) => + (in VBuffer src, ref Single dst) => { if (InputType.VectorSize > 0) Host.Check(src.Length == InputType.VectorSize); @@ -134,10 +134,10 @@ public ValueMapper GetMapper() if (model.SelectedFeatures != null) { EnsembleUtils.SelectFeatures(in tmp, model.SelectedFeatures, model.Cardinality, ref buffers[i]); - maps[i](ref buffers[i], ref predictions[i]); + maps[i](in buffers[i], ref predictions[i]); } else - maps[i](ref tmp, ref predictions[i]); + maps[i](in tmp, ref predictions[i]); }); combine(ref dst, predictions, Weights); diff --git a/src/Microsoft.ML.Ensemble/Trainer/Multiclass/EnsembleMultiClassPredictor.cs b/src/Microsoft.ML.Ensemble/Trainer/Multiclass/EnsembleMultiClassPredictor.cs index a73259da6c..6f931f3e9c 100644 --- a/src/Microsoft.ML.Ensemble/Trainer/Multiclass/EnsembleMultiClassPredictor.cs +++ b/src/Microsoft.ML.Ensemble/Trainer/Multiclass/EnsembleMultiClassPredictor.cs @@ -121,7 +121,7 @@ public ValueMapper GetMapper() } ValueMapper, VBuffer> del = - (ref VBuffer src, ref VBuffer dst) => + (in VBuffer src, ref VBuffer dst) => { if (_inputType.VectorSize > 0) Host.Check(src.Length == _inputType.VectorSize); @@ -133,10 +133,10 @@ public ValueMapper GetMapper() if (model.SelectedFeatures != null) { EnsembleUtils.SelectFeatures(in tmp, model.SelectedFeatures, model.Cardinality, ref features[i]); - maps[i](ref features[i], ref predictions[i]); + maps[i](in features[i], ref predictions[i]); } else - maps[i](ref tmp, ref predictions[i]); + maps[i](in tmp, ref predictions[i]); // individual maps delegates will return always the same VBuffer length Host.Check(predictions[i].Length == _mappers[i].OutputType.VectorSize); diff --git a/src/Microsoft.ML.FastTree/FastTree.cs b/src/Microsoft.ML.FastTree/FastTree.cs index 2beffa91c6..60c9333038 100644 --- a/src/Microsoft.ML.FastTree/FastTree.cs +++ b/src/Microsoft.ML.FastTree/FastTree.cs @@ -1334,11 +1334,11 @@ private ValueMapper, VBuffer> GetCopier(ColumnType itemT if (identity) { ValueMapper, VBuffer> identityResult = - (ref VBuffer src, ref VBuffer dst) => src.CopyTo(ref dst); + (in VBuffer src, ref VBuffer dst) => src.CopyTo(ref dst); return (ValueMapper, VBuffer>)(object)identityResult; } return - (ref VBuffer src, ref VBuffer dst) => + (in VBuffer src, ref VBuffer dst) => { var indices = dst.Indices; var values = dst.Values; @@ -1351,7 +1351,7 @@ private ValueMapper, VBuffer> GetCopier(ColumnType itemT } Utils.EnsureSize(ref values, src.Count); for (int i = 0; i < src.Count; ++i) - conv(ref src.Values[i], ref values[i]); + conv(in src.Values[i], ref values[i]); } dst = new VBuffer(src.Length, src.Count, values, indices); }; @@ -1458,7 +1458,7 @@ private Dataset Construct(RoleMappedData examples, ref int numExamples, int maxB ch.Assert(maxBins > 0); finder = finder ?? new BinFinder(); // Must copy over, as bin calculation is potentially destructive. - copier(ref temp, ref doubleTemp); + copier(in temp, ref doubleTemp); hasMissing = !CalculateBins(finder, in doubleTemp, maxBins, 0, out BinUpperBounds[iFeature]); } @@ -1682,7 +1682,7 @@ private void GetFeatureValues(ISlotCursor cursor, int iFeature, ValueGetter> SubsetGetter(ValueGetter> getter, SlotDropper slotDropper) @@ -2915,7 +2915,7 @@ public ValueMapper GetMapper() return (ValueMapper)(Delegate)del; } - protected virtual void Map(ref VBuffer src, ref Float dst) + protected virtual void Map(in VBuffer src, ref Float dst) { if (InputType.VectorSize > 0) Host.Check(src.Length == InputType.VectorSize); @@ -2934,7 +2934,7 @@ public ValueMapper> GetWhatTheFeatureMapper(int BufferBuilder builder = null; ValueMapper, VBuffer> del = - (ref VBuffer src, ref VBuffer dst) => + (in VBuffer src, ref VBuffer dst) => { WhatTheFeatureMap(in src, ref dst, ref builder); Runtime.Numeric.VectorUtils.SparsifyNormalize(ref dst, top, bottom, normalize); diff --git a/src/Microsoft.ML.FastTree/FastTreeTweedie.cs b/src/Microsoft.ML.FastTree/FastTreeTweedie.cs index 66079ae207..10b2729ba2 100644 --- a/src/Microsoft.ML.FastTree/FastTreeTweedie.cs +++ b/src/Microsoft.ML.FastTree/FastTreeTweedie.cs @@ -489,12 +489,12 @@ public static FastTreeTweediePredictor Create(IHostEnvironment env, ModelLoadCon return new FastTreeTweediePredictor(env, ctx); } - protected override void Map(ref VBuffer src, ref float dst) + protected override void Map(in VBuffer src, ref float dst) { // The value learnt and predicted by the trees is the log of the expected value, // as seen in equation 9 of the paper. So for the actual prediction, we take its // exponent. - base.Map(ref src, ref dst); + base.Map(in src, ref dst); // REVIEW: Some packages like R's GBM apparently clamp the input to the exponent // in the range [-19, 19]. We have historically taken a dim view of this sort of thing // ourselves, but if our views prove problematic we can reconsider. (An upper clamp of 19 diff --git a/src/Microsoft.ML.FastTree/GamTrainer.cs b/src/Microsoft.ML.FastTree/GamTrainer.cs index b7b2e0287f..581a64f3de 100644 --- a/src/Microsoft.ML.FastTree/GamTrainer.cs +++ b/src/Microsoft.ML.FastTree/GamTrainer.cs @@ -799,7 +799,7 @@ public ValueMapper GetMapper() return (ValueMapper)(Delegate)del; } - private void Map(ref VBuffer features, ref float response) + private void Map(in VBuffer features, ref float response) { Host.CheckParam(features.Length == _inputLength, nameof(features), "Bad length of input"); diff --git a/src/Microsoft.ML.FastTree/RandomForestRegression.cs b/src/Microsoft.ML.FastTree/RandomForestRegression.cs index ca9af38315..8349888cd5 100644 --- a/src/Microsoft.ML.FastTree/RandomForestRegression.cs +++ b/src/Microsoft.ML.FastTree/RandomForestRegression.cs @@ -100,7 +100,7 @@ public static FastForestRegressionPredictor Create(IHostEnvironment env, ModelLo public override PredictionKind PredictionKind => PredictionKind.Regression; - protected override void Map(ref VBuffer src, ref float dst) + protected override void Map(in VBuffer src, ref float dst) { if (InputType.VectorSize > 0) Host.Check(src.Length == InputType.VectorSize); @@ -113,7 +113,7 @@ protected override void Map(ref VBuffer src, ref float dst) public ValueMapper, VBuffer> GetMapper(float[] quantiles) { return - (ref VBuffer src, ref VBuffer dst) => + (in VBuffer src, ref VBuffer dst) => { // REVIEW: Should make this more efficient - it repeatedly allocates too much stuff. float[] weights = null; diff --git a/src/Microsoft.ML.FastTree/TreeEnsembleFeaturizer.cs b/src/Microsoft.ML.FastTree/TreeEnsembleFeaturizer.cs index 906175d322..f2821ed611 100644 --- a/src/Microsoft.ML.FastTree/TreeEnsembleFeaturizer.cs +++ b/src/Microsoft.ML.FastTree/TreeEnsembleFeaturizer.cs @@ -746,14 +746,14 @@ private static IDataView AppendFloatMapper(IHostEnvironment env, IChanne if (seed == 0) { mapper = - (ref TInput src, ref Single dst) => + (in TInput src, ref Single dst) => { if (isNa(in src)) { dst = Single.NaN; return; } - converter(ref src, ref temp); + converter(in src, ref temp); dst = (Single)(temp - 1); }; } @@ -762,14 +762,14 @@ private static IDataView AppendFloatMapper(IHostEnvironment env, IChanne ch.Check(type.Count > 0, "Label must be of known cardinality."); int[] permutation = Utils.GetRandomPermutation(RandomUtils.Create(seed), type.Count); mapper = - (ref TInput src, ref Single dst) => + (in TInput src, ref Single dst) => { if (isNa(in src)) { dst = Single.NaN; return; } - converter(ref src, ref temp); + converter(in src, ref temp); dst = (Single)permutation[(int)(temp - 1)]; }; } diff --git a/src/Microsoft.ML.HalLearners/OlsLinearRegression.cs b/src/Microsoft.ML.HalLearners/OlsLinearRegression.cs index b62d42e611..154e552d80 100644 --- a/src/Microsoft.ML.HalLearners/OlsLinearRegression.cs +++ b/src/Microsoft.ML.HalLearners/OlsLinearRegression.cs @@ -294,7 +294,7 @@ private OlsLinearRegressionPredictor TrainCore(IChannel ch, FloatLabelCursor.Fac while (cursor.MoveNext()) { var features = cursor.Features; - lrMap(ref features, ref yh); + lrMap(in features, ref yh); var e = cursor.Label - yh; rss += e * e; var ydm = cursor.Label - yMean; diff --git a/src/Microsoft.ML.KMeansClustering/KMeansPredictor.cs b/src/Microsoft.ML.KMeansClustering/KMeansPredictor.cs index b0c55e9523..0a8818b9c4 100644 --- a/src/Microsoft.ML.KMeansClustering/KMeansPredictor.cs +++ b/src/Microsoft.ML.KMeansClustering/KMeansPredictor.cs @@ -144,7 +144,7 @@ public ValueMapper GetMapper() Host.Check(typeof(TOut) == typeof(VBuffer)); ValueMapper, VBuffer> del = - (ref VBuffer src, ref VBuffer dst) => + (in VBuffer src, ref VBuffer dst) => { if (src.Length != _dimensionality) throw Host.Except($"Incorrect number of features: expected {_dimensionality}, got {src.Length}"); diff --git a/src/Microsoft.ML.PCA/PcaTrainer.cs b/src/Microsoft.ML.PCA/PcaTrainer.cs index c097538135..933a2769fb 100644 --- a/src/Microsoft.ML.PCA/PcaTrainer.cs +++ b/src/Microsoft.ML.PCA/PcaTrainer.cs @@ -561,7 +561,7 @@ public ValueMapper GetMapper() Host.Check(typeof(TOut) == typeof(float)); ValueMapper, float> del = - (ref VBuffer src, ref float dst) => + (in VBuffer src, ref float dst) => { Host.Check(src.Length == _dimension); dst = Score(in src); diff --git a/src/Microsoft.ML.Parquet/ParquetLoader.cs b/src/Microsoft.ML.Parquet/ParquetLoader.cs index 5455ccc7b8..4bbfc608f5 100644 --- a/src/Microsoft.ML.Parquet/ParquetLoader.cs +++ b/src/Microsoft.ML.Parquet/ParquetLoader.cs @@ -545,7 +545,7 @@ private ValueGetter CreateGetterDelegateCore(int col, V return (ref TValue value) => { TSource val = (TSource)_columnValues[activeIdx][_curDataSetRow]; - valueConverter(ref val, ref value); + valueConverter(in val, ref value); }; } #endregion @@ -676,41 +676,41 @@ public ParquetConversions(IChannel channel) _ch = channel; } - public void Conv(ref byte[] src, ref VBuffer dst) => dst = src != null ? new VBuffer(src.Length, src) : new VBuffer(0, new byte[0]); + public void Conv(in byte[] src, ref VBuffer dst) => dst = src != null ? new VBuffer(src.Length, src) : new VBuffer(0, new byte[0]); - public void Conv(ref sbyte? src, ref sbyte dst) => dst = (sbyte)src; + public void Conv(in sbyte? src, ref sbyte dst) => dst = (sbyte)src; - public void Conv(ref byte src, ref byte dst) => dst = src; + public void Conv(in byte src, ref byte dst) => dst = src; - public void Conv(ref short? src, ref short dst) => dst = (short)src; + public void Conv(in short? src, ref short dst) => dst = (short)src; - public void Conv(ref ushort src, ref ushort dst) => dst = src; + public void Conv(in ushort src, ref ushort dst) => dst = src; - public void Conv(ref int? src, ref int dst) => dst = (int)src; + public void Conv(in int? src, ref int dst) => dst = (int)src; - public void Conv(ref long? src, ref long dst) => dst = (long)src; + public void Conv(in long? src, ref long dst) => dst = (long)src; - public void Conv(ref float? src, ref Single dst) => dst = src ?? Single.NaN; + public void Conv(in float? src, ref Single dst) => dst = src ?? Single.NaN; - public void Conv(ref double? src, ref Double dst) => dst = src ?? Double.NaN; + public void Conv(in double? src, ref Double dst) => dst = src ?? Double.NaN; - public void Conv(ref decimal? src, ref Double dst) => dst = src != null ? Decimal.ToDouble((decimal)src) : Double.NaN; + public void Conv(in decimal? src, ref Double dst) => dst = src != null ? Decimal.ToDouble((decimal)src) : Double.NaN; - public void Conv(ref string src, ref ReadOnlyMemory dst) => dst = src.AsMemory(); + public void Conv(in string src, ref ReadOnlyMemory dst) => dst = src.AsMemory(); //Behavior for NA values is undefined. - public void Conv(ref bool src, ref bool dst) => dst = src; + public void Conv(in bool src, ref bool dst) => dst = src; - public void Conv(ref DateTimeOffset src, ref DateTimeOffset dst) => dst = src; + public void Conv(in DateTimeOffset src, ref DateTimeOffset dst) => dst = src; - public void Conv(ref IList src, ref ReadOnlyMemory dst) => dst = ConvertListToString(src).AsMemory(); + public void Conv(in IList src, ref ReadOnlyMemory dst) => dst = ConvertListToString(src).AsMemory(); /// /// Converts a System.Numerics.BigInteger value to a UInt128 data type value. /// /// BigInteger value. /// UInt128 object. - public void Conv(ref BigInteger src, ref UInt128 dst) + public void Conv(in BigInteger src, ref UInt128 dst) { try { @@ -732,7 +732,7 @@ public void Conv(ref BigInteger src, ref UInt128 dst) /// /// Parquet Interval value (int : months, int : days, int : milliseconds). /// TimeSpan object. - public void Conv(ref Interval src, ref TimeSpan dst) + public void Conv(in Interval src, ref TimeSpan dst) { dst = TimeSpan.FromDays(src.Months * 30 + src.Days) + TimeSpan.FromMilliseconds(src.Millis); } diff --git a/src/Microsoft.ML.Recommender/MatrixFactorizationPredictor.cs b/src/Microsoft.ML.Recommender/MatrixFactorizationPredictor.cs index 44da79c703..a8cea25d6f 100644 --- a/src/Microsoft.ML.Recommender/MatrixFactorizationPredictor.cs +++ b/src/Microsoft.ML.Recommender/MatrixFactorizationPredictor.cs @@ -200,7 +200,7 @@ private ValueGetter GetGetter(ValueGetter matrixColumnIndexGetter, { matrixColumnIndexGetter(ref matrixColumnIndex); matrixRowIndexGetter(ref matrixRowIndex); - mapper(ref matrixColumnIndex, ref matrixRowIndex, ref value); + mapper(in matrixColumnIndex, ref matrixRowIndex, ref value); }; return del; } @@ -228,7 +228,7 @@ public ValueMapper GetMapper; } - private void MapperCore(ref uint srcCol, ref uint srcRow, ref float dst) + private void MapperCore(in uint srcCol, ref uint srcRow, ref float dst) { // REVIEW: The key-type version a bit more "strict" than the predictor // version, since the predictor version can't know the maximum bound during diff --git a/src/Microsoft.ML.StandardLearners/Standard/LinearPredictor.cs b/src/Microsoft.ML.StandardLearners/Standard/LinearPredictor.cs index 3d0569644b..4af1e58bbe 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/LinearPredictor.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/LinearPredictor.cs @@ -287,7 +287,7 @@ public ValueMapper GetMapper() Contracts.Check(typeof(TOut) == typeof(Float)); ValueMapper, Float> del = - (ref VBuffer src, ref Float dst) => + (in VBuffer src, ref Float dst) => { if (src.Length != Weight.Length) throw Contracts.Except("Input is of length {0}, but predictor expected length {1}", src.Length, Weight.Length); @@ -380,7 +380,7 @@ public ValueMapper> GetWhatTheFeatureMapper)); ValueMapper, VBuffer> del = - (ref VBuffer src, ref VBuffer dstContributions) => + (in VBuffer src, ref VBuffer dstContributions) => { GetFeatureContributions(in src, ref dstContributions, top, bottom, normalize); }; diff --git a/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/MulticlassLogisticRegression.cs b/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/MulticlassLogisticRegression.cs index 99bc373498..d379263068 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/MulticlassLogisticRegression.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/LogisticRegression/MulticlassLogisticRegression.cs @@ -736,7 +736,7 @@ public ValueMapper GetMapper() Host.Check(typeof(TDst) == typeof(VBuffer), "Invalid destination type in GetMapper"); ValueMapper, VBuffer> del = - (ref VBuffer src, ref VBuffer dst) => + (in VBuffer src, ref VBuffer dst) => { Host.Check(src.Length == _numFeatures); diff --git a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/MetaMulticlassTrainer.cs b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/MetaMulticlassTrainer.cs index efa162b063..ce8ab30463 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/MetaMulticlassTrainer.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/MetaMulticlassTrainer.cs @@ -110,12 +110,12 @@ protected IDataView MapLabelsCore(ColumnType type, InPredicate equalsTarge { return LambdaColumnMapper.Create(Host, "Label mapper", data.Data, lab.Name, lab.Name, type, NumberType.Float, - (ref T src, ref float dst) => + (in T src, ref float dst) => dst = equalsTarget(in src) ? 1 : (isMissing(in src) ? float.NaN : default(float))); } return LambdaColumnMapper.Create(Host, "Label mapper", data.Data, lab.Name, lab.Name, type, NumberType.Float, - (ref T src, ref float dst) => + (in T src, ref float dst) => dst = equalsTarget(in src) ? 1 : default(float)); } diff --git a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/MultiClassNaiveBayesTrainer.cs b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/MultiClassNaiveBayesTrainer.cs index 72dd984328..fdcb9e4026 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/MultiClassNaiveBayesTrainer.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/MultiClassNaiveBayesTrainer.cs @@ -370,7 +370,7 @@ private void ComputeLabelProbabilityFromFeature(double labelOccurrenceCount, int absentFeatureLogProb += Math.Log(absentFeatureCount + 1) - Math.Log(labelOccurrenceCount + _labelCount); } - private void Map(ref VBuffer src, ref VBuffer dst) + private void Map(in VBuffer src, ref VBuffer dst) { Host.Check(src.Length == _featureCount, "Invalid number of features passed."); float[] labelScores = (dst.Length >= _labelCount) ? dst.Values : new float[_labelCount]; diff --git a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/Ova.cs b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/Ova.cs index adef60c9dd..954510896c 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/Ova.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/Ova.cs @@ -487,7 +487,7 @@ public override ValueMapper, VBuffer> GetMapper() maps[i] = Predictors[i].GetMapper, float>(); return - (ref VBuffer src, ref VBuffer dst) => + (in VBuffer src, ref VBuffer dst) => { if (InputType.VectorSize > 0) Contracts.Check(src.Length == InputType.VectorSize); @@ -497,7 +497,7 @@ public override ValueMapper, VBuffer> GetMapper() values = new float[maps.Length]; var tmp = src; - Parallel.For(0, maps.Length, i => maps[i](ref tmp, ref values[i])); + Parallel.For(0, maps.Length, i => maps[i](in tmp, ref values[i])); dst = new VBuffer(maps.Length, values, dst.Indices); }; } @@ -556,7 +556,7 @@ public override ValueMapper, VBuffer> GetMapper() maps[i] = _mappers[i].GetMapper, float, float>(); return - (ref VBuffer src, ref VBuffer dst) => + (in VBuffer src, ref VBuffer dst) => { if (InputType.VectorSize > 0) Contracts.Check(src.Length == InputType.VectorSize); @@ -570,7 +570,7 @@ public override ValueMapper, VBuffer> GetMapper() i => { float score = 0; - maps[i](ref tmp, ref score, ref values[i]); + maps[i](in tmp, ref score, ref values[i]); }); Normalize(values, maps.Length); dst = new VBuffer(maps.Length, values, dst.Indices); diff --git a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/Pkpd.cs b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/Pkpd.cs index 3d8e363d3d..c68266b439 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/MultiClass/Pkpd.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/MultiClass/Pkpd.cs @@ -450,7 +450,7 @@ public ValueMapper GetMapper() var buffer = new Double[_numClasses]; ValueMapper, VBuffer> del = - (ref VBuffer src, ref VBuffer dst) => + (in VBuffer src, ref VBuffer dst) => { if (InputType.VectorSize > 0) Host.Check(src.Length == InputType.VectorSize); @@ -461,7 +461,7 @@ public ValueMapper GetMapper() { float score = 0; float prob = 0; - maps[i](ref tmp, ref score, ref prob); + maps[i](in tmp, ref score, ref prob); buffer[i] = prob; }); diff --git a/src/Microsoft.ML.StandardLearners/Standard/Simple/SimpleTrainers.cs b/src/Microsoft.ML.StandardLearners/Standard/Simple/SimpleTrainers.cs index 804943ac0d..5dcb72ad02 100644 --- a/src/Microsoft.ML.StandardLearners/Standard/Simple/SimpleTrainers.cs +++ b/src/Microsoft.ML.StandardLearners/Standard/Simple/SimpleTrainers.cs @@ -216,12 +216,12 @@ private float PredictCore() } } - private void Map(ref VBuffer src, ref float dst) + private void Map(in VBuffer src, ref float dst) { dst = PredictCore(); } - private void MapDist(ref VBuffer src, ref float score, ref float prob) + private void MapDist(in VBuffer src, ref float score, ref float prob) { score = PredictCore(); prob = (score + 1) / 2; @@ -436,12 +436,12 @@ public ValueMapper GetMapper() return (ValueMapper)(Delegate)del; } - private void Map(ref VBuffer src, ref float dst) + private void Map(in VBuffer src, ref float dst) { dst = _raw; } - private void MapDist(ref VBuffer src, ref float score, ref float prob) + private void MapDist(in VBuffer src, ref float score, ref float prob) { score = _raw; prob = _prob; diff --git a/src/Microsoft.ML.Transforms/HashJoinTransform.cs b/src/Microsoft.ML.Transforms/HashJoinTransform.cs index bd3d007fa8..b596839c0b 100644 --- a/src/Microsoft.ML.Transforms/HashJoinTransform.cs +++ b/src/Microsoft.ML.Transforms/HashJoinTransform.cs @@ -451,7 +451,7 @@ private void GetSlotNames(int iinfo, ref VBuffer> dst) dst = new VBuffer>(n, output, dst.Indices); } - private delegate uint HashDelegate(ref TSrc value, uint seed); + private delegate uint HashDelegate(in TSrc value, uint seed); // generic method generators private static MethodInfo _methGetterOneToOne; @@ -518,7 +518,7 @@ private ValueGetter ComposeGetterOneToOne(IRow input, int iinfo) (ref uint dst) => { getSrc(ref src); - dst = (hashFunction(ref src, hashSeed) & mask) + 1; // +1 to offset from zero, which has special meaning for KeyType + dst = (hashFunction(in src, hashSeed) & mask) + 1; // +1 to offset from zero, which has special meaning for KeyType }; } @@ -578,7 +578,7 @@ private ValueGetter> ComposeGetterVecToVec(IRow input, int i // REVIEW: some legacy code hashes 0 for srcSlot in ord- case, do we need to preserve this behavior? if (ordered) hash = Hashing.MurmurRound(hash, (uint)srcSlot); - hash = hashFunction(ref values[srcSlot], hash); + hash = hashFunction(in values[srcSlot], hash); } hashes[i] = (Hashing.MixHash(hash) & mask) + 1; // +1 to offset from zero, which has special meaning for KeyType @@ -636,7 +636,7 @@ private ValueGetter ComposeGetterVecToOne(IRow input, int iinfo) { if (ordered) hash = Hashing.MurmurRound(hash, (uint)srcSlot); - hash = hashFunction(ref values[srcSlot], hash); + hash = hashFunction(in values[srcSlot], hash); } dst = (Hashing.MixHash(hash) & mask) + 1; // +1 to offset from zero, which has special meaning for KeyType }; @@ -658,9 +658,9 @@ private HashDelegate ComposeHashDelegate() var sb = default(StringBuilder); var conv = Conversions.Instance.GetStringConversion(); return - (ref TSrc value, uint seed) => + (in TSrc value, uint seed) => { - conv(ref value, ref sb); + conv(in value, ref sb); return Hashing.MurmurHash(seed, sb, 0, sb.Length); }; } @@ -681,12 +681,12 @@ private HashDelegate ComposeDoubleHashDelegate() return Hash; } - private uint Hash(ref float value, uint seed) + private uint Hash(in float value, uint seed) { return Hashing.MurmurRound(seed, FloatUtils.GetBits(value)); } - private uint Hash(ref double value, uint seed) + private uint Hash(in double value, uint seed) { ulong v = FloatUtils.GetBits(value); uint hash = Hashing.MurmurRound(seed, Utils.GetLo(v)); diff --git a/src/Microsoft.ML.Transforms/MutualInformationFeatureSelection.cs b/src/Microsoft.ML.Transforms/MutualInformationFeatureSelection.cs index 15f7884e28..c98ccfab04 100644 --- a/src/Microsoft.ML.Transforms/MutualInformationFeatureSelection.cs +++ b/src/Microsoft.ML.Transforms/MutualInformationFeatureSelection.cs @@ -465,7 +465,7 @@ private int[] GetKeyLabels(Transposer trans, int labelCol, ColumnType labeCol var tmp = default(VBuffer); var labels = default(VBuffer); trans.GetSingleSlotValue(labelCol, ref tmp); - BinKeys(labeColumnType)(ref tmp, ref labels); + BinKeys(labeColumnType)(in tmp, ref labels); VBufferUtils.Densify(ref labels); var values = labels.Values; if (labels.Length < values.Length) @@ -535,7 +535,7 @@ private static Mapper MakeKeyMapper(ColumnType type) { min = 0; lim = type.KeyCount + 1; - mapper(ref src, ref dst); + mapper(in src, ref dst); }; } @@ -652,7 +652,7 @@ private static ValueMapper, VBuffer> BinKeys(ColumnType colTy if (identity) { mapper = (ValueMapper)(Delegate)(ValueMapper)( - (ref uint src, ref int dst) => + (in uint src, ref int dst) => { dst = (int)src; }); @@ -660,10 +660,10 @@ private static ValueMapper, VBuffer> BinKeys(ColumnType colTy else { mapper = - (ref T src, ref int dst) => + (in T src, ref int dst) => { uint t = 0; - conv(ref src, ref t); + conv(in src, ref t); dst = (int)t; }; } @@ -683,9 +683,9 @@ private void BinInts(ref VBuffer input, ref VBuffer output, lim = min + bounds.Length + 1; int offset = min; ValueMapper mapper = - (ref int src, ref int dst) => + (in int src, ref int dst) => dst = offset + 1 + bounds.FindIndexSorted((Single)src); - mapper.MapVector(ref input, ref output); + mapper.MapVector(in input, ref output); _singles.Clear(); } @@ -711,9 +711,9 @@ private void BinSingles(ref VBuffer input, ref VBuffer output, lim = min + bounds.Length + 1; int offset = min; ValueMapper mapper = - (ref Single src, ref int dst) => + (in Single src, ref int dst) => dst = Single.IsNaN(src) ? offset : offset + 1 + bounds.FindIndexSorted(src); - mapper.MapVector(ref input, ref output); + mapper.MapVector(in input, ref output); _singles.Clear(); } @@ -738,9 +738,9 @@ private void BinDoubles(ref VBuffer input, ref VBuffer output, var offset = min = -1 - bounds.FindIndexSorted(0); lim = min + bounds.Length + 1; ValueMapper mapper = - (ref Double src, ref int dst) => + (in Double src, ref int dst) => dst = Double.IsNaN(src) ? offset : offset + 1 + bounds.FindIndexSorted(src); - mapper.MapVector(ref input, ref output); + mapper.MapVector(in input, ref output); _doubles.Clear(); } @@ -748,10 +748,10 @@ private void BinBools(ref VBuffer input, ref VBuffer output) { if (_boolMapper == null) _boolMapper = CreateVectorMapper(BinOneBool); - _boolMapper(ref input, ref output); + _boolMapper(in input, ref output); } - private void BinOneBool(ref bool src, ref int dst) + private void BinOneBool(in bool src, ref int dst) { dst = Convert.ToInt32(src); } @@ -767,13 +767,13 @@ private static ValueMapper, VBuffer> CreateVectorMapper(this ValueMapper map, ref VBuffer input, ref VBuffer output) + private static void MapVector(this ValueMapper map, in VBuffer input, ref VBuffer output) { var values = output.Values; if (Utils.Size(values) < input.Count) @@ -781,7 +781,7 @@ private static void MapVector(this ValueMapper map, ref for (int i = 0; i < input.Count; i++) { TSrc val = input.Values[i]; - map(ref val, ref values[i]); + map(in val, ref values[i]); } var indices = output.Indices; diff --git a/src/Microsoft.ML.Transforms/NAReplaceTransform.cs b/src/Microsoft.ML.Transforms/NAReplaceTransform.cs index 61250b801f..c11bb5792a 100644 --- a/src/Microsoft.ML.Transforms/NAReplaceTransform.cs +++ b/src/Microsoft.ML.Transforms/NAReplaceTransform.cs @@ -452,7 +452,7 @@ private object GetSpecifiedValue(string srcStr, ColumnType dstType, InPredica // Handles converting input strings to correct types. var srcTxt = srcStr.AsMemory(); var strToT = Runtime.Data.Conversion.Conversions.Instance.GetStandardConversion, T>(TextType.Instance, dstType.ItemType, out bool identity); - strToT(ref srcTxt, ref val); + strToT(in srcTxt, ref val); // Make sure that the srcTxt can legitimately be converted to dstType, throw error otherwise. if (isNA(in val)) throw Contracts.Except("No conversion of '{0}' to '{1}'", srcStr, dstType.ItemType); diff --git a/src/Microsoft.ML.Transforms/TermLookupTransform.cs b/src/Microsoft.ML.Transforms/TermLookupTransform.cs index 72f995b278..14fc80322a 100644 --- a/src/Microsoft.ML.Transforms/TermLookupTransform.cs +++ b/src/Microsoft.ML.Transforms/TermLookupTransform.cs @@ -229,7 +229,7 @@ public OneValueMap(PrimitiveType type) //Empty string will map to NA for R4 and R8, the only two types that can //handle missing values. var bad = String.Empty.AsMemory(); - conv(ref bad, ref _badValue); + conv(in bad, ref _badValue); } } diff --git a/src/Microsoft.ML.Transforms/Text/NgramHashTransform.cs b/src/Microsoft.ML.Transforms/Text/NgramHashTransform.cs index d5e5607977..563093e39a 100644 --- a/src/Microsoft.ML.Transforms/Text/NgramHashTransform.cs +++ b/src/Microsoft.ML.Transforms/Text/NgramHashTransform.cs @@ -931,12 +931,12 @@ public NgramIdFinder Decorate(int iinfo, NgramIdFinder finder) Contracts.AssertValue(srcMap); stringMapper = - (ref NGram src, ref StringBuilder dst) => + (in NGram src, ref StringBuilder dst) => { Contracts.Assert(src.ISrcCol == 0); if (src.Lim == 1) { - srcMap(ref src.Grams[0], ref dst); + srcMap(in src.Grams[0], ref dst); return; } ClearDst(ref dst); @@ -944,7 +944,7 @@ public NgramIdFinder Decorate(int iinfo, NgramIdFinder finder) { if (i > 0) dst.Append('|'); - srcMap(ref src.Grams[i], ref temp); + srcMap(in src.Grams[i], ref temp); InvertHashUtils.AppendToEnd(temp, dst, ref buffer); } }; @@ -964,7 +964,7 @@ public NgramIdFinder Decorate(int iinfo, NgramIdFinder finder) // We need to disambiguate the column name. This will be the same as the above format, // just instead of "" it would be with "ColumnName:". stringMapper = - (ref NGram src, ref StringBuilder dst) => + (in NGram src, ref StringBuilder dst) => { var srcMap = _srcTextGetters[srcIndices[src.ISrcCol]]; Contracts.AssertValue(srcMap); @@ -975,7 +975,7 @@ public NgramIdFinder Decorate(int iinfo, NgramIdFinder finder) { if (i > 0) dst.Append('|'); - srcMap(ref src.Grams[i], ref temp); + srcMap(in src.Grams[i], ref temp); InvertHashUtils.AppendToEnd(temp, dst, ref buffer); } }; @@ -983,7 +983,7 @@ public NgramIdFinder Decorate(int iinfo, NgramIdFinder finder) var collector = _iinfoToCollector[iinfo] = new InvertHashCollector( _parent._bindings.Types[iinfo].VectorSize, _invertHashMaxCounts[iinfo], - stringMapper, EqualityComparer.Default, (ref NGram src, ref NGram dst) => dst = src.Clone()); + stringMapper, EqualityComparer.Default, (in NGram src, ref NGram dst) => dst = src.Clone()); return (uint[] ngram, int lim, int icol, ref bool more) => diff --git a/test/Microsoft.ML.Core.Tests/UnitTests/DataTypes.cs b/test/Microsoft.ML.Core.Tests/UnitTests/DataTypes.cs index 7ae2384203..3f1408efd9 100644 --- a/test/Microsoft.ML.Core.Tests/UnitTests/DataTypes.cs +++ b/test/Microsoft.ML.Core.Tests/UnitTests/DataTypes.cs @@ -31,13 +31,13 @@ public void R4ToSBtoR4() float fVal = float.NaN; StringBuilder textFVal = default; - r4ToSB(ref fVal, ref textFVal); + r4ToSB(in fVal, ref textFVal); Assert.True("?" == textFVal.ToString()); fVal = 0; var fValTX = textFVal.ToString().AsMemory(); - txToR4(ref fValTX, ref fVal); + txToR4(in fValTX, ref fVal); Assert.Equal(fVal, float.NaN); } @@ -55,13 +55,13 @@ public void R8ToSBtoR8() double dVal = double.NaN; StringBuilder textDVal = default; - r8ToSB(ref dVal, ref textDVal); + r8ToSB(in dVal, ref textDVal); Assert.True("?" == textDVal.ToString()); dVal = 0; var dValTX = textDVal.ToString().AsMemory(); - txToR8(ref dValTX, ref dVal); + txToR8(in dValTX, ref dVal); Assert.Equal(dVal, double.NaN); } @@ -78,31 +78,31 @@ public void TXToSByte() sbyte maxValue = sbyte.MaxValue; ReadOnlyMemory src = minValue.ToString().AsMemory(); sbyte dst = 0; - mapper(ref src, ref dst); + mapper(in src, ref dst); Assert.Equal(dst, minValue); //2. sbyte.MaxValue in text to sbyte. src = maxValue.ToString().AsMemory(); dst = 0; - mapper(ref src, ref dst); + mapper(in src, ref dst); Assert.Equal(dst, maxValue); //3. ERROR condition: sbyte.MinValue - 1 in text to sbyte. src = (sbyte.MinValue - 1).ToString().AsMemory(); dst = 0; - var ex = Assert.ThrowsAny(() => mapper(ref src, ref dst)); + var ex = Assert.ThrowsAny(() => mapper(in src, ref dst)); Assert.Equal("Value could not be parsed from text to sbyte.", ex.Message); //4. ERROR condition: sbyte.MaxValue + 1 in text to sbyte. src = (sbyte.MaxValue + 1).ToString().AsMemory(); dst = 0; - ex = Assert.ThrowsAny(() => mapper(ref src, ref dst)); + ex = Assert.ThrowsAny(() => mapper(in src, ref dst)); Assert.Equal("Value could not be parsed from text to sbyte.", ex.Message); //5. Empty string in text to sbyte. src = default; dst = -1; - mapper(ref src, ref dst); + mapper(in src, ref dst); Assert.Equal(default, dst); } @@ -118,31 +118,31 @@ public void TXToShort() short maxValue = short.MaxValue; ReadOnlyMemory src = minValue.ToString().AsMemory(); short dst = 0; - mapper(ref src, ref dst); + mapper(in src, ref dst); Assert.Equal(dst, minValue); //2. short.MaxValue in text to short. src = maxValue.ToString().AsMemory(); dst = 0; - mapper(ref src, ref dst); + mapper(in src, ref dst); Assert.Equal(dst, maxValue); //3. ERROR condition: short.MinValue - 1 in text to short. src = (minValue - 1).ToString().AsMemory(); dst = 0; - var ex = Assert.ThrowsAny(() => mapper(ref src, ref dst)); + var ex = Assert.ThrowsAny(() => mapper(in src, ref dst)); Assert.Equal("Value could not be parsed from text to short.", ex.Message); //4. ERROR condition: short.MaxValue + 1 in text to short. src = (maxValue + 1).ToString().AsMemory(); dst = 0; - ex = Assert.ThrowsAny(() => mapper(ref src, ref dst)); + ex = Assert.ThrowsAny(() => mapper(in src, ref dst)); Assert.Equal("Value could not be parsed from text to short.", ex.Message); //5. Empty value in text to short. src = default; dst = -1; - mapper(ref src, ref dst); + mapper(in src, ref dst); Assert.Equal(default, dst); } @@ -158,31 +158,31 @@ public void TXToInt() int maxValue = int.MaxValue; ReadOnlyMemory src = minValue.ToString().AsMemory(); int dst = 0; - mapper(ref src, ref dst); + mapper(in src, ref dst); Assert.Equal(dst, minValue); //2. int.MaxValue in text to int. src = maxValue.ToString().AsMemory(); dst = 0; - mapper(ref src, ref dst); + mapper(in src, ref dst); Assert.Equal(dst, maxValue); //3. ERROR condition: int.MinValue - 1 in text to int. src = ((long)minValue - 1).ToString().AsMemory(); dst = 0; - var ex = Assert.ThrowsAny(() => mapper(ref src, ref dst)); + var ex = Assert.ThrowsAny(() => mapper(in src, ref dst)); Assert.Equal("Value could not be parsed from text to int.", ex.Message); //4. ERROR condition: int.MaxValue + 1 in text to int. src = ((long)maxValue + 1).ToString().AsMemory(); dst = 0; - ex = Assert.ThrowsAny(() => mapper(ref src, ref dst)); + ex = Assert.ThrowsAny(() => mapper(in src, ref dst)); Assert.Equal("Value could not be parsed from text to int.", ex.Message); //5. Empty value in text to int. src = default; dst = -1; - mapper(ref src, ref dst); + mapper(in src, ref dst); Assert.Equal(default, dst); } @@ -198,31 +198,31 @@ public void TXToLong() var maxValue = long.MaxValue; ReadOnlyMemory src = minValue.ToString().AsMemory(); var dst = default(long); - mapper(ref src, ref dst); + mapper(in src, ref dst); Assert.Equal(dst, minValue); //2. long.MaxValue in text to long. src = maxValue.ToString().AsMemory(); dst = 0; - mapper(ref src, ref dst); + mapper(in src, ref dst); Assert.Equal(dst, maxValue); //3. long.MinValue - 1 in text to long. src = (minValue - 1).ToString().AsMemory(); dst = 0; - mapper(ref src, ref dst); + mapper(in src, ref dst); Assert.Equal(dst, (long)minValue - 1); //4. ERROR condition: long.MaxValue + 1 in text to long. src = ((ulong)maxValue + 1).ToString().AsMemory(); dst = 0; - var ex = Assert.ThrowsAny(() => mapper(ref src, ref dst)); + var ex = Assert.ThrowsAny(() => mapper(in src, ref dst)); Assert.Equal("Value could not be parsed from text to long.", ex.Message); //5. Empty value in text to long. src = default; dst = -1; - mapper(ref src, ref dst); + mapper(in src, ref dst); Assert.Equal(default, dst); } diff --git a/test/Microsoft.ML.Core.Tests/UnitTests/TestEntryPoints.cs b/test/Microsoft.ML.Core.Tests/UnitTests/TestEntryPoints.cs index bce6320984..d5e11e7767 100644 --- a/test/Microsoft.ML.Core.Tests/UnitTests/TestEntryPoints.cs +++ b/test/Microsoft.ML.Core.Tests/UnitTests/TestEntryPoints.cs @@ -1002,7 +1002,7 @@ public void EntryPointPipelineEnsembleText() }).Data; ValueMapper, bool> labelToBinary = - (ref ReadOnlyMemory src, ref bool dst) => + (in ReadOnlyMemory src, ref bool dst) => { if (ReadOnlyMemoryUtils.EqualsStr("Sport", src)) dst = true; diff --git a/test/Microsoft.ML.TestFramework/DataPipe/TestDataPipe.cs b/test/Microsoft.ML.TestFramework/DataPipe/TestDataPipe.cs index 0144907e8f..e8b402585f 100644 --- a/test/Microsoft.ML.TestFramework/DataPipe/TestDataPipe.cs +++ b/test/Microsoft.ML.TestFramework/DataPipe/TestDataPipe.cs @@ -496,11 +496,11 @@ private bool VerifyMatch(TSrc src, TDst dst, ValueMapper where TDst : struct { TDst v = default(TDst); - conv(ref src, ref v); + conv(in src, ref v); if (EqualityComparer.Default.Equals(dst, v)) return true; TSrc vSrc = default; - convBack(ref v, ref vSrc); + convBack(in v, ref vSrc); if (EqualityComparer.Default.Equals(dst, default(TDst)) && !EqualityComparer.Default.Equals(src, vSrc)) return true; Fail($"Values different values in VerifyMatch<{typeof(TSrc).Name}, {typeof(TDst).Name}>: converted from {typeof(TSrc).Name} to {typeof(TDst).Name}: {v}. Parsed from text: {dst}");