Skip to content

Commit

Permalink
PR feedback
Browse files Browse the repository at this point in the history
Update the rest of the BinaryWriter utils to use Span.
  • Loading branch information
eerhardt committed Nov 6, 2018
1 parent 5f0fa8e commit 2c799c3
Show file tree
Hide file tree
Showing 24 changed files with 85 additions and 253 deletions.
253 changes: 44 additions & 209 deletions src/Microsoft.ML.Core/Utilities/Stream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,40 +61,19 @@ public static void WriteBoolByte(this BinaryWriter writer, bool x)
}

/// <summary>
/// Writes a length prefixed array of ints.
/// Writes a length prefixed span of ints.
/// </summary>
public static void WriteIntArray(this BinaryWriter writer, int[] values)
public static void WriteIntArray(this BinaryWriter writer, ReadOnlySpan<int> values)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);

if (values == null)
{
writer.Write(0);
return;
}

writer.Write(values.Length);
foreach (int val in values)
writer.Write(val);
}

/// <summary>
/// Writes a length prefixed array of ints.
/// </summary>
public static void WriteIntArray(this BinaryWriter writer, int[] values, int count)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);
Contracts.Assert(0 <= count & count <= Utils.Size(values));

writer.Write(count);
for (int i = 0; i < count; i++)
for (int i = 0; i < values.Length; i++)
writer.Write(values[i]);
}

/// <summary>
/// Writes an array of ints without the length prefix.
/// Writes a span of ints without the length prefix.
/// </summary>
public static void WriteIntsNoCount(this BinaryWriter writer, ReadOnlySpan<int> values)
{
Expand All @@ -105,48 +84,25 @@ public static void WriteIntsNoCount(this BinaryWriter writer, ReadOnlySpan<int>
}

/// <summary>
/// Writes a length prefixed array of uints.
/// Writes a length prefixed span of uints.
/// </summary>
public static void WriteUIntArray(this BinaryWriter writer, uint[] values)
public static void WriteUIntArray(this BinaryWriter writer, ReadOnlySpan<uint> values)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);

if (values == null)
{
writer.Write(0);
return;
}

writer.Write(values.Length);
foreach (uint val in values)
writer.Write(val);
}

/// <summary>
/// Writes a length prefixed array of uints.
/// </summary>
public static void WriteUIntArray(this BinaryWriter writer, uint[] values, int count)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);
Contracts.Assert(0 <= count & count <= Utils.Size(values));

writer.Write(count);
for (int i = 0; i < count; i++)
for (int i = 0; i < values.Length; i++)
writer.Write(values[i]);
}

/// <summary>
/// Writes an array of uints without the length prefix.
/// Writes a span of uints without the length prefix.
/// </summary>
public static void WriteUIntsNoCount(this BinaryWriter writer, uint[] values, int count)
public static void WriteUIntsNoCount(this BinaryWriter writer, ReadOnlySpan<uint> values)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);
Contracts.Assert(0 <= count & count <= Utils.Size(values));

for (int i = 0; i < count; i++)
for (int i = 0; i < values.Length; i++)
writer.Write(values[i]);
}

Expand All @@ -170,6 +126,19 @@ public static void WriteByteArray(this BinaryWriter writer, byte[] values)
writer.Write(values);
}

/// <summary>
/// Writes a length prefixed span of bytes.
/// </summary>
public static void WriteByteArray(this BinaryWriter writer, ReadOnlySpan<byte> values)
{
Contracts.AssertValue(writer);

writer.Write(values.Length);

for (int i = 0; i < values.Length; i++)
writer.Write(values[i]);
}

/// <summary>
/// Writes a length prefixed array of bytes.
/// </summary>
Expand All @@ -196,56 +165,21 @@ public static void WriteBytesNoCount(this BinaryWriter writer, byte[] values, in
}

/// <summary>
/// Writes a length prefixed array of Floats.
/// Writes a length prefixed span of Floats.
/// </summary>
public static void WriteFloatArray(this BinaryWriter writer, float[] values)
public static void WriteSingleArray(this BinaryWriter writer, ReadOnlySpan<float> values)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);

if (values == null)
{
writer.Write(0);
return;
}

writer.Write(values.Length);
foreach (var val in values)
writer.Write(val);
}

/// <summary>
/// Writes a length prefixed array of Floats.
/// </summary>
public static void WriteFloatArray(this BinaryWriter writer, float[] values, int count)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);
Contracts.Assert(0 <= count & count <= Utils.Size(values));

writer.Write(count);
for (int i = 0; i < count; i++)
for (int i = 0; i < values.Length; i++)
writer.Write(values[i]);
}

/// <summary>
/// Writes a specified number of floats starting at the specified index from an array.
/// </summary>
public static void WriteFloatArray(this BinaryWriter writer, float[] values, int start, int count)
{
Contracts.AssertValue(writer);
Contracts.AssertValue(values);
Contracts.Assert(0 <= start && start < values.Length);
Contracts.Assert(0 < count && count <= values.Length - start);

for (int i = 0; i < count; i++)
writer.Write(values[start + i]);
}

/// <summary>
/// Writes a length prefixed array of Floats.
/// </summary>
public static void WriteFloatArray(this BinaryWriter writer, IEnumerable<float> values, int count)
public static void WriteSingleArray(this BinaryWriter writer, IEnumerable<float> values, int count)
{
Contracts.AssertValue(writer);
Contracts.AssertValue(values);
Expand All @@ -264,7 +198,7 @@ public static void WriteFloatArray(this BinaryWriter writer, IEnumerable<float>
/// <summary>
/// Writes a span of Floats without the length prefix.
/// </summary>
public static void WriteFloatsNoCount(this BinaryWriter writer, ReadOnlySpan<float> values)
public static void WriteSinglesNoCount(this BinaryWriter writer, ReadOnlySpan<float> values)
{
Contracts.AssertValue(writer);

Expand All @@ -273,160 +207,61 @@ public static void WriteFloatsNoCount(this BinaryWriter writer, ReadOnlySpan<flo
}

/// <summary>
/// Writes a length prefixed array of singles.
/// </summary>
public static void WriteSingleArray(this BinaryWriter writer, float[] values)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);

if (values == null)
{
writer.Write(0);
return;
}

writer.Write(values.Length);
foreach (var val in values)
writer.Write(val);
}

/// <summary>
/// Writes a length prefixed array of singles.
/// </summary>
public static void WriteSingleArray(this BinaryWriter writer, float[] values, int count)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);
Contracts.Assert(0 <= count & count <= Utils.Size(values));

writer.Write(count);
for (int i = 0; i < count; i++)
writer.Write(values[i]);
}

/// <summary>
/// Writes an array of singles without the length prefix.
/// Writes a length prefixed span of doubles.
/// </summary>
public static void WriteSinglesNoCount(this BinaryWriter writer, float[] values, int count)
public static void WriteDoubleArray(this BinaryWriter writer, ReadOnlySpan<double> values)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);
Contracts.Assert(0 <= count & count <= Utils.Size(values));

for (int i = 0; i < count; i++)
writer.Write(values[i]);
}

/// <summary>
/// Writes a length prefixed array of doubles.
/// </summary>
public static void WriteDoubleArray(this BinaryWriter writer, double[] values)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);

if (values == null)
{
writer.Write(0);
return;
}

writer.Write(values.Length);
foreach (double val in values)
writer.Write(val);
}

/// <summary>
/// Writes a length prefixed array of doubles.
/// </summary>
public static void WriteDoubleArray(this BinaryWriter writer, double[] values, int count)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);
Contracts.Assert(0 <= count & count <= Utils.Size(values));

writer.Write(count);
for (int i = 0; i < count; i++)
for (int i = 0; i < values.Length; i++)
writer.Write(values[i]);
}

/// <summary>
/// Writes an array of doubles without the length prefix.
/// Writes a span of doubles without the length prefix.
/// </summary>
public static void WriteDoublesNoCount(this BinaryWriter writer, double[] values, int count)
public static void WriteDoublesNoCount(this BinaryWriter writer, ReadOnlySpan<double> values)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);
Contracts.Assert(0 <= count & count <= Utils.Size(values));

for (int i = 0; i < count; i++)
for (int i = 0; i < values.Length; i++)
writer.Write(values[i]);
}

/// <summary>
/// Writes a length prefixed array of bools as bytes with 0/1 values.
/// Writes a length prefixed span of bools as bytes with 0/1 values.
/// </summary>
public static void WriteBoolByteArray(this BinaryWriter writer, bool[] values)
public static void WriteBoolByteArray(this BinaryWriter writer, ReadOnlySpan<bool> values)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);

if (values == null)
{
writer.Write(0);
return;
}

writer.Write(values.Length);
foreach (bool val in values)
writer.Write(val ? (byte)1 : (byte)0);
}

/// <summary>
/// Writes a length prefixed array of bools as bytes with 0/1 values.
/// </summary>
public static void WriteBoolByteArray(this BinaryWriter writer, bool[] values, int count)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);
Contracts.Assert(0 <= count & count <= Utils.Size(values));

writer.Write(count);
for (int i = 0; i < count; i++)
for (int i = 0; i < values.Length; i++)
writer.Write(values[i] ? (byte)1 : (byte)0);
}

/// <summary>
/// Writes an array of bools as bytes with 0/1 values, without the length prefix.
/// Writes a span of bools as bytes with 0/1 values, without the length prefix.
/// </summary>
public static void WriteBoolBytesNoCount(this BinaryWriter writer, bool[] values, int count)
public static void WriteBoolBytesNoCount(this BinaryWriter writer, ReadOnlySpan<bool> values)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);
Contracts.Assert(0 <= count & count <= Utils.Size(values));

for (int i = 0; i < count; i++)
for (int i = 0; i < values.Length; i++)
writer.Write(values[i] ? (byte)1 : (byte)0);
}

/// <summary>
/// Writes a length prefixed array of chars.
/// Writes a length prefixed span of chars.
/// </summary>
public static void WriteCharArray(this BinaryWriter writer, char[] values)
public static void WriteCharArray(this BinaryWriter writer, ReadOnlySpan<char> values)
{
Contracts.AssertValue(writer);
Contracts.AssertValueOrNull(values);

if (values == null)
{
writer.Write(0);
return;
}

writer.Write(values.Length);
foreach (var val in values)
writer.Write((short)val);
for (int i = 0; i < values.Length; i++)
writer.Write((short)values[i]);
}

/// <summary>
Expand Down
2 changes: 1 addition & 1 deletion src/Microsoft.ML.Data/Prediction/Calibrator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1045,7 +1045,7 @@ private void SaveCore(ModelSaveContext ctx)
ctx.Writer.Write(sizeof(Float));
ctx.Writer.Write(_binSize);
ctx.Writer.Write(_min);
ctx.Writer.WriteFloatArray(_binProbs);
ctx.Writer.WriteSingleArray(_binProbs);
}

/// <summary>
Expand Down
4 changes: 2 additions & 2 deletions src/Microsoft.ML.Data/Transforms/NormalizeColumnDbl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -275,8 +275,8 @@ public static void SaveModel(ModelSaveContext ctx, bool useLog, TFloat[] mean, T
ctx.Writer.Write(sizeof(TFloat));
ctx.Writer.WriteBoolByte(useLog);
ctx.Writer.Write(mean.Length);
ctx.Writer.WriteDoublesNoCount(mean, mean.Length);
ctx.Writer.WriteDoublesNoCount(stddev, mean.Length);
ctx.Writer.WriteDoublesNoCount(mean);
ctx.Writer.WriteDoublesNoCount(stddev.AsSpan(0, mean.Length));

ctx.SaveTextStream("CdfNormalizer.txt",
writer =>
Expand Down
4 changes: 2 additions & 2 deletions src/Microsoft.ML.Data/Transforms/NormalizeColumnSng.cs
Original file line number Diff line number Diff line change
Expand Up @@ -275,8 +275,8 @@ public static void SaveModel(ModelSaveContext ctx, bool useLog, TFloat[] mean, T
ctx.Writer.Write(sizeof(TFloat));
ctx.Writer.WriteBoolByte(useLog);
ctx.Writer.Write(mean.Length);
ctx.Writer.WriteSinglesNoCount(mean, mean.Length);
ctx.Writer.WriteSinglesNoCount(stddev, mean.Length);
ctx.Writer.WriteSinglesNoCount(mean);
ctx.Writer.WriteSinglesNoCount(stddev.AsSpan(0, mean.Length));

ctx.SaveTextStream("CdfNormalizer.txt",
writer =>
Expand Down
Loading

0 comments on commit 2c799c3

Please sign in to comment.