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}");