From e7f9dafa7f7a052697b05e5ba24f1f6c4f43c84c Mon Sep 17 00:00:00 2001 From: Aleksei Smirnov Date: Mon, 15 May 2023 12:31:22 +0300 Subject: [PATCH 01/12] Fix using ToList on Row Collection --- src/Microsoft.ML.Fairlearn/Reductions/UtilityParity.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.ML.Fairlearn/Reductions/UtilityParity.cs b/src/Microsoft.ML.Fairlearn/Reductions/UtilityParity.cs index be304962ce..0da2683d55 100644 --- a/src/Microsoft.ML.Fairlearn/Reductions/UtilityParity.cs +++ b/src/Microsoft.ML.Fairlearn/Reductions/UtilityParity.cs @@ -122,7 +122,7 @@ public override DataFrame Gamma(PrimitiveDataFrameColumn yPred/* Maybe ch dfNeg["sign"].FillNulls("-", inPlace: true); // stack the temp dataframe dfNeg to the bottom dataframe that we want to return - dfNeg.Rows.ToList().ForEach(row => { gSigned.Append(row, inPlace: true); }); + gSigned.Append(dfNeg.Rows, inPlace: true); return gSigned; } From f4d3a6ecac44fbc83e121c9476fe240bf9329316 Mon Sep 17 00:00:00 2001 From: Aleksei Smirnov Date: Mon, 15 May 2023 17:01:52 +0300 Subject: [PATCH 02/12] Fix DataFrame bounds checking on indexing elements --- src/Microsoft.Data.Analysis/DataFrameBuffer.cs | 3 ++- src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.cs | 4 ++-- src/Microsoft.Data.Analysis/ReadOnlyDataFrameBuffer.cs | 3 ++- src/Microsoft.Data.Analysis/StringDataFrameColumn.cs | 2 +- src/Microsoft.Data.Analysis/VBufferDataFrameColumn.cs | 3 ++- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.Data.Analysis/DataFrameBuffer.cs b/src/Microsoft.Data.Analysis/DataFrameBuffer.cs index 352b853ddc..66abed3ba2 100644 --- a/src/Microsoft.Data.Analysis/DataFrameBuffer.cs +++ b/src/Microsoft.Data.Analysis/DataFrameBuffer.cs @@ -77,8 +77,9 @@ internal override T this[int index] { set { - if (index > Length) + if (index >= Length) throw new ArgumentOutOfRangeException(nameof(index)); + RawSpan[index] = value; } } diff --git a/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.cs b/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.cs index 113b67cc1c..51058e529a 100644 --- a/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.cs +++ b/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.cs @@ -164,7 +164,7 @@ protected internal override Apache.Arrow.Array ToArrowArray(long startIndex, int { get { - if (startIndex > Length) + if (startIndex >= Length) { throw new ArgumentOutOfRangeException(nameof(startIndex)); } @@ -174,7 +174,7 @@ protected internal override Apache.Arrow.Array ToArrowArray(long startIndex, int protected override IReadOnlyList GetValues(long startIndex, int length) { - if (startIndex > Length) + if (startIndex >= Length) { throw new ArgumentOutOfRangeException(nameof(startIndex)); } diff --git a/src/Microsoft.Data.Analysis/ReadOnlyDataFrameBuffer.cs b/src/Microsoft.Data.Analysis/ReadOnlyDataFrameBuffer.cs index 2bc41ebe51..b3a8a7bccf 100644 --- a/src/Microsoft.Data.Analysis/ReadOnlyDataFrameBuffer.cs +++ b/src/Microsoft.Data.Analysis/ReadOnlyDataFrameBuffer.cs @@ -66,8 +66,9 @@ internal virtual T this[int index] { get { - if (index > Length) + if (index >= Length) throw new ArgumentOutOfRangeException(nameof(index)); + return ReadOnlySpan[index]; } set => throw new NotSupportedException(); diff --git a/src/Microsoft.Data.Analysis/StringDataFrameColumn.cs b/src/Microsoft.Data.Analysis/StringDataFrameColumn.cs index 0d88ef5505..1a46ff74a9 100644 --- a/src/Microsoft.Data.Analysis/StringDataFrameColumn.cs +++ b/src/Microsoft.Data.Analysis/StringDataFrameColumn.cs @@ -77,7 +77,7 @@ public void Append(string value) private int GetBufferIndexContainingRowIndex(ref long rowIndex) { - if (rowIndex > Length) + if (rowIndex >= Length) { throw new ArgumentOutOfRangeException(Strings.ColumnIndexOutOfRange, nameof(rowIndex)); } diff --git a/src/Microsoft.Data.Analysis/VBufferDataFrameColumn.cs b/src/Microsoft.Data.Analysis/VBufferDataFrameColumn.cs index 35456f34c4..ee860cfa33 100644 --- a/src/Microsoft.Data.Analysis/VBufferDataFrameColumn.cs +++ b/src/Microsoft.Data.Analysis/VBufferDataFrameColumn.cs @@ -85,10 +85,11 @@ public void Append(VBuffer value) private int GetBufferIndexContainingRowIndex(ref long rowIndex) { - if (rowIndex > Length) + if (rowIndex >= Length) { throw new ArgumentOutOfRangeException(Strings.ColumnIndexOutOfRange, nameof(rowIndex)); } + return (int)(rowIndex / int.MaxValue); } From c1fc16e3f2e80b340edba3e904c10944a30316af Mon Sep 17 00:00:00 2001 From: Aleksei Smirnov Date: Sun, 21 May 2023 00:02:56 +0300 Subject: [PATCH 03/12] Fix build of Microsoft.Data.Analysis.Tests --- .../Microsoft.Data.Analysis.Tests.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/test/Microsoft.Data.Analysis.Tests/Microsoft.Data.Analysis.Tests.csproj b/test/Microsoft.Data.Analysis.Tests/Microsoft.Data.Analysis.Tests.csproj index 8a59c78efe..a88dcda4a1 100644 --- a/test/Microsoft.Data.Analysis.Tests/Microsoft.Data.Analysis.Tests.csproj +++ b/test/Microsoft.Data.Analysis.Tests/Microsoft.Data.Analysis.Tests.csproj @@ -9,7 +9,6 @@ - From c080c460e101cca7209618936d8b339331d921a6 Mon Sep 17 00:00:00 2001 From: Aleksei Smirnov Date: Sun, 21 May 2023 00:22:24 +0300 Subject: [PATCH 04/12] Fix merge issues --- src/Microsoft.Data.Analysis/DataFrame.IO.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Data.Analysis/DataFrame.IO.cs b/src/Microsoft.Data.Analysis/DataFrame.IO.cs index 38ee4da3c9..adde1103b4 100644 --- a/src/Microsoft.Data.Analysis/DataFrame.IO.cs +++ b/src/Microsoft.Data.Analysis/DataFrame.IO.cs @@ -288,7 +288,7 @@ private static DataFrameColumn CreateColumn(Type kind, string columnName) } else if (kind == typeof(float)) { - ret = new PrimitiveDataFrameColumn(columnName)); + ret = new PrimitiveDataFrameColumn(columnName); } else if (kind == typeof(string)) { From c4388dc2e35108155b21d718f4b418ed6f2ebd0a Mon Sep 17 00:00:00 2001 From: Aleksei Smirnov Date: Sun, 21 May 2023 00:24:19 +0300 Subject: [PATCH 05/12] Fix the behavior or column SetName method --- src/Microsoft.Data.Analysis/DataFrame.Join.cs | 2 +- src/Microsoft.Data.Analysis/DataFrame.cs | 4 +- .../DataFrameColumn.cs | 42 +++++++++++++++---- .../DataFrameColumnCollection.cs | 24 ++++++++++- .../DataFrameTests.cs | 38 +++++++++++++++++ 5 files changed, 98 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.Data.Analysis/DataFrame.Join.cs b/src/Microsoft.Data.Analysis/DataFrame.Join.cs index 2109573c38..8e4029ffd3 100644 --- a/src/Microsoft.Data.Analysis/DataFrame.Join.cs +++ b/src/Microsoft.Data.Analysis/DataFrame.Join.cs @@ -30,7 +30,7 @@ private void SetSuffixForDuplicatedColumnNames(DataFrame dataFrame, DataFrameCol { // Pre-existing column. Change name DataFrameColumn existingColumn = dataFrame.Columns[index]; - dataFrame._columnCollection.SetColumnName(existingColumn, existingColumn.Name + leftSuffix); + existingColumn.SetName(existingColumn.Name + leftSuffix); column.SetName(column.Name + rightSuffix); index = dataFrame._columnCollection.IndexOf(column.Name); } diff --git a/src/Microsoft.Data.Analysis/DataFrame.cs b/src/Microsoft.Data.Analysis/DataFrame.cs index 20d42bb9f7..25a8cbbfbc 100644 --- a/src/Microsoft.Data.Analysis/DataFrame.cs +++ b/src/Microsoft.Data.Analysis/DataFrame.cs @@ -301,7 +301,7 @@ public DataFrame AddPrefix(string prefix, bool inPlace = false) for (int i = 0; i < df.Columns.Count; i++) { DataFrameColumn column = df.Columns[i]; - df._columnCollection.SetColumnName(column, prefix + column.Name); + column.SetName(prefix + column.Name); df.OnColumnsChanged(); } return df; @@ -316,7 +316,7 @@ public DataFrame AddSuffix(string suffix, bool inPlace = false) for (int i = 0; i < df.Columns.Count; i++) { DataFrameColumn column = df.Columns[i]; - df._columnCollection.SetColumnName(column, column.Name + suffix); + column.SetName(column.Name + suffix); df.OnColumnsChanged(); } return df; diff --git a/src/Microsoft.Data.Analysis/DataFrameColumn.cs b/src/Microsoft.Data.Analysis/DataFrameColumn.cs index 3a2f97f817..1b55b92d8f 100644 --- a/src/Microsoft.Data.Analysis/DataFrameColumn.cs +++ b/src/Microsoft.Data.Analysis/DataFrameColumn.cs @@ -84,6 +84,26 @@ protected set } } + // List of ColumnCollections that owns the column + // Current API allows column to be added into multiple dataframes, that's why the list is needed + private readonly List _ownerColumnCollections = new(); + + internal void AddOwner(DataFrameColumnCollection columCollection) + { + if (!_ownerColumnCollections.Contains(columCollection)) + { + _ownerColumnCollections.Add(columCollection); + } + } + + internal void RemoveOwner(DataFrameColumnCollection columCollection) + { + if (_ownerColumnCollections.Contains(columCollection)) + { + _ownerColumnCollections.Remove(columCollection); + } + } + /// /// The number of values in this column. /// @@ -95,24 +115,30 @@ public abstract long NullCount private string _name; /// - /// The name of this column. + /// The column name. /// public string Name => _name; /// - /// Updates the name of this column. + /// Updates the column name. /// /// The new name. - /// If passed in, update the column name in - public void SetName(string newName, DataFrame dataFrame = null) + public void SetName(string newName) { - if (!(dataFrame is null)) - { - dataFrame.Columns.SetColumnName(this, newName); - } + foreach (var owner in _ownerColumnCollections) + owner.UpdateColumnNameMetadata(this, newName); + _name = newName; } + /// + /// Updates the name of this column. + /// + /// The new name. + /// Ignored (for backward compatibility) + [Obsolete] + public void SetName(string newName, DataFrame dataFrame) => SetName(newName); + /// /// The type of data this column holds. /// diff --git a/src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs b/src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs index ae558f239e..baf3816d47 100644 --- a/src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs +++ b/src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs @@ -41,11 +41,23 @@ internal IReadOnlyList GetColumnNames() return ret; } + public void RenameColumn(string currentName, string newName) + { + var column = this[currentName]; + column.SetName(newName); + } + + [Obsolete] public void SetColumnName(DataFrameColumn column, string newName) + { + column.SetName(newName); + } + + //Updates column's metadata (is used as a callback from Column class) + internal void UpdateColumnNameMetadata(DataFrameColumn column, string newName) { string currentName = column.Name; int currentIndex = _columnNameToIndexDictionary[currentName]; - column.SetName(newName); _columnNames[currentIndex] = newName; _columnNameToIndexDictionary.Remove(currentName); _columnNameToIndexDictionary.Add(newName, currentIndex); @@ -76,6 +88,9 @@ protected override void InsertItem(int columnIndex, DataFrameColumn column) { throw new ArgumentException(string.Format(Strings.DuplicateColumnName, column.Name), nameof(column)); } + + column.AddOwner(this); + RowCount = column.Length; _columnNames.Insert(columnIndex, column.Name); _columnNameToIndexDictionary[column.Name] = columnIndex; @@ -99,10 +114,14 @@ protected override void SetItem(int columnIndex, DataFrameColumn column) { throw new ArgumentException(string.Format(Strings.DuplicateColumnName, column.Name), nameof(column)); } + _columnNameToIndexDictionary.Remove(_columnNames[columnIndex]); _columnNames[columnIndex] = column.Name; _columnNameToIndexDictionary[column.Name] = columnIndex; + + this[columnIndex].RemoveOwner(this); base.SetItem(columnIndex, column); + ColumnsChanged?.Invoke(); } @@ -114,7 +133,10 @@ protected override void RemoveItem(int columnIndex) _columnNameToIndexDictionary[_columnNames[i]]--; } _columnNames.RemoveAt(columnIndex); + + this[columnIndex].RemoveOwner(this); base.RemoveItem(columnIndex); + ColumnsChanged?.Invoke(); } diff --git a/test/Microsoft.Data.Analysis.Tests/DataFrameTests.cs b/test/Microsoft.Data.Analysis.Tests/DataFrameTests.cs index 4be1a55cd8..8a55479e1b 100644 --- a/test/Microsoft.Data.Analysis.Tests/DataFrameTests.cs +++ b/test/Microsoft.Data.Analysis.Tests/DataFrameTests.cs @@ -323,6 +323,44 @@ public void InsertAndRemoveColumnTests() Assert.True(ReferenceEquals(charColumn, charColumn_1)); } + [Fact] + public void RenameColumnWithSetNameTests() + { + StringDataFrameColumn city = new StringDataFrameColumn("City", new string[] { "London", "Berlin" }); + PrimitiveDataFrameColumn temp = new PrimitiveDataFrameColumn("Temperature", new int[] { 12, 13 }); + + DataFrame dataframe = new DataFrame(city, temp); + + // Change the name of the column: + dataframe["City"].SetName("Town"); + var renamedColumn = dataframe["Town"]; + + Assert.Throws(() => dataframe["City"]); + + Assert.NotNull(renamedColumn); + Assert.Equal("Town", renamedColumn.Name); + Assert.True(ReferenceEquals(city, renamedColumn)); + } + + [Fact] + public void RenameColumnWithRenameColumnTests() + { + StringDataFrameColumn city = new StringDataFrameColumn("City", new string[] { "London", "Berlin" }); + PrimitiveDataFrameColumn temp = new PrimitiveDataFrameColumn("Temperature", new int[] { 12, 13 }); + + DataFrame dataframe = new DataFrame(city, temp); + + // Change the name of the column: + dataframe.Columns.RenameColumn("City", "Town"); + var renamedColumn = dataframe["Town"]; + + Assert.Throws(() => dataframe["City"]); + + Assert.NotNull(renamedColumn); + Assert.Equal("Town", renamedColumn.Name); + Assert.True(ReferenceEquals(city, renamedColumn)); + } + [Fact] public void TestBinaryOperations() { From 92e2d72191b8e5fac31bdef10e00bec4ca0f44f1 Mon Sep 17 00:00:00 2001 From: Aleksei Smirnov Date: Sun, 21 May 2023 11:58:49 +0300 Subject: [PATCH 06/12] Reset RowCount to zero, when DataFrame is empty # Conflicts: # src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs # test/Microsoft.Data.Analysis.Tests/DataFrameTests.cs --- .../DataFrameColumnCollection.cs | 18 +++- .../DataFrameTests.cs | 101 ++++++++++++++---- 2 files changed, 96 insertions(+), 23 deletions(-) diff --git a/src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs b/src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs index baf3816d47..06f1a87ef9 100644 --- a/src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs +++ b/src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs @@ -74,13 +74,15 @@ public void Insert(int columnIndex, IEnumerable column, string columnName) protected override void InsertItem(int columnIndex, DataFrameColumn column) { column = column ?? throw new ArgumentNullException(nameof(column)); - if (RowCount > 0 && column.Length != RowCount) + + if (Count == 0) { - throw new ArgumentException(Strings.MismatchedColumnLengths, nameof(column)); + //change RowCount on inserting first row to dataframe + RowCount = column.Length; } - - if (Count >= 1 && RowCount == 0 && column.Length != RowCount) + else if (column.Length != RowCount) { + //check all columns in the dataframe have the same lenght (amount of rows) throw new ArgumentException(Strings.MismatchedColumnLengths, nameof(column)); } @@ -91,7 +93,6 @@ protected override void InsertItem(int columnIndex, DataFrameColumn column) column.AddOwner(this); - RowCount = column.Length; _columnNames.Insert(columnIndex, column.Name); _columnNameToIndexDictionary[column.Name] = columnIndex; for (int i = columnIndex + 1; i < Count; i++) @@ -137,6 +138,10 @@ protected override void RemoveItem(int columnIndex) this[columnIndex].RemoveOwner(this); base.RemoveItem(columnIndex); + //Reset RowCount if the last column was removed and dataframe is empty + if (Count == 0) + RowCount = 0; + ColumnsChanged?.Invoke(); } @@ -168,6 +173,9 @@ protected override void ClearItems() ColumnsChanged?.Invoke(); _columnNames.Clear(); _columnNameToIndexDictionary.Clear(); + + //reset RowCount as DataFrame is now empty + RowCount = 0; } /// diff --git a/test/Microsoft.Data.Analysis.Tests/DataFrameTests.cs b/test/Microsoft.Data.Analysis.Tests/DataFrameTests.cs index 8a55479e1b..866ecfec4f 100644 --- a/test/Microsoft.Data.Analysis.Tests/DataFrameTests.cs +++ b/test/Microsoft.Data.Analysis.Tests/DataFrameTests.cs @@ -271,29 +271,44 @@ public void TestIndexer() [Fact] public void ColumnAndTableCreationTest() { - DataFrameColumn intColumn = new PrimitiveDataFrameColumn("IntColumn", Enumerable.Range(0, 10).Select(x => x)); - DataFrameColumn floatColumn = new PrimitiveDataFrameColumn("FloatColumn", Enumerable.Range(0, 10).Select(x => (float)x)); + const int rowCount = 10; + DataFrameColumn intColumn = new PrimitiveDataFrameColumn("IntColumn", Enumerable.Range(0, rowCount).Select(x => x)); + DataFrameColumn floatColumn = new PrimitiveDataFrameColumn("FloatColumn", Enumerable.Range(0, rowCount).Select(x => (float)x)); DataFrame dataFrame = new DataFrame(); dataFrame.Columns.Insert(0, intColumn); dataFrame.Columns.Insert(1, floatColumn); - Assert.Equal(10, dataFrame.Rows.Count); + Assert.Equal(rowCount, dataFrame.Rows.Count); Assert.Equal(2, dataFrame.Columns.Count); - Assert.Equal(10, dataFrame.Columns[0].Length); + Assert.Equal(2, dataFrame.Columns.LongCount()); + Assert.Equal(rowCount, dataFrame.Columns[0].Length); Assert.Equal("IntColumn", dataFrame.Columns[0].Name); - Assert.Equal(10, dataFrame.Columns[1].Length); + Assert.Equal(rowCount, dataFrame.Columns[1].Length); Assert.Equal("FloatColumn", dataFrame.Columns[1].Name); - DataFrameColumn bigColumn = new PrimitiveDataFrameColumn("BigColumn", Enumerable.Range(0, 11).Select(x => (float)x)); - DataFrameColumn repeatedName = new PrimitiveDataFrameColumn("FloatColumn", Enumerable.Range(0, 10).Select(x => (float)x)); + //add column with bigger length than other columns in the dataframe + DataFrameColumn bigColumn = new PrimitiveDataFrameColumn("BigColumn", Enumerable.Range(0, rowCount + 1).Select(x => (float)x)); Assert.Throws(() => dataFrame.Columns.Insert(2, bigColumn)); + Assert.Throws(() => dataFrame.Columns.Add(bigColumn)); + + //add column smaller than other columns in the dataframe + DataFrameColumn smallColumn = new PrimitiveDataFrameColumn("SmallColumn", Enumerable.Range(0, rowCount - 1).Select(x => (float)x)); + Assert.Throws(() => dataFrame.Columns.Insert(2, smallColumn)); + Assert.Throws(() => dataFrame.Columns.Add(smallColumn)); + + //add column with duplicate name + DataFrameColumn repeatedName = new PrimitiveDataFrameColumn("FloatColumn", Enumerable.Range(0, rowCount).Select(x => (float)x)); Assert.Throws(() => dataFrame.Columns.Insert(2, repeatedName)); - Assert.Throws(() => dataFrame.Columns.Insert(10, repeatedName)); + + //Insert column at index out of range + DataFrameColumn extraColumn = new PrimitiveDataFrameColumn("OtherFloatColumn", Enumerable.Range(0, rowCount).Select(x => (float)x)); + var columnCount = dataFrame.Columns.Count; + Assert.Throws(() => dataFrame.Columns.Insert(columnCount + 1, repeatedName)); Assert.Equal(2, dataFrame.Columns.Count); - DataFrameColumn intColumnCopy = new PrimitiveDataFrameColumn("IntColumn", Enumerable.Range(0, 10).Select(x => x)); + DataFrameColumn intColumnCopy = new PrimitiveDataFrameColumn("IntColumn", Enumerable.Range(0, rowCount).Select(x => x)); Assert.Throws(() => dataFrame.Columns[1] = intColumnCopy); - DataFrameColumn differentIntColumn = new PrimitiveDataFrameColumn("IntColumn1", Enumerable.Range(0, 10).Select(x => x)); + DataFrameColumn differentIntColumn = new PrimitiveDataFrameColumn("IntColumn1", Enumerable.Range(0, rowCount).Select(x => x)); dataFrame.Columns[1] = differentIntColumn; Assert.True(object.ReferenceEquals(differentIntColumn, dataFrame.Columns[1])); @@ -309,18 +324,68 @@ public void ColumnAndTableCreationTest() } [Fact] - public void InsertAndRemoveColumnTests() + public void InsertAndRemoveColumnToTheEndOfNotEmptyDataFrameTests() { DataFrame dataFrame = MakeDataFrameWithAllMutableColumnTypes(10); - DataFrameColumn intColumn = new PrimitiveDataFrameColumn("IntColumn", Enumerable.Range(0, 10).Select(x => x)); - DataFrameColumn charColumn = dataFrame.Columns["Char"]; - int insertedIndex = dataFrame.Columns.Count; - dataFrame.Columns.Insert(dataFrame.Columns.Count, intColumn); + DataFrameColumn intColumn = new PrimitiveDataFrameColumn("NewIntColumn", Enumerable.Range(0, 10).Select(x => x)); + + int columnCount = dataFrame.Columns.Count; + DataFrameColumn originalLastColumn = dataFrame.Columns[columnCount - 1]; + + //Insert new column at the end + dataFrame.Columns.Insert(columnCount, intColumn); + Assert.Equal(columnCount + 1, dataFrame.Columns.Count); + + //Remove first dataFrame.Columns.RemoveAt(0); - DataFrameColumn intColumn_1 = dataFrame.Columns["IntColumn"]; - DataFrameColumn charColumn_1 = dataFrame.Columns["Char"]; + Assert.Equal(columnCount, dataFrame.Columns.Count); + + //Check that int column was inserted + DataFrameColumn intColumn_1 = dataFrame.Columns["NewIntColumn"]; Assert.True(ReferenceEquals(intColumn, intColumn_1)); - Assert.True(ReferenceEquals(charColumn, charColumn_1)); + + //Check that last column of the original dataframe was not removed + DataFrameColumn lastColumn_1 = dataFrame.Columns[originalLastColumn.Name]; + Assert.True(ReferenceEquals(originalLastColumn, lastColumn_1)); + + //Check that new column is the last one + int newIndex = dataFrame.Columns.IndexOf("NewIntColumn"); + Assert.Equal(columnCount - 1, newIndex); + + //Check that original last column now has correct index + int newIndexForOriginalLastColumn = dataFrame.Columns.IndexOf(originalLastColumn.Name); + Assert.Equal(columnCount - 2, newIndexForOriginalLastColumn); + } + + [Fact] + public void AddAndRemoveColumnToTheEmptyDataFrameTests() + { + DataFrame dataFrame = new DataFrame(); + DataFrameColumn intColumn = new PrimitiveDataFrameColumn("NewIntColumn", Enumerable.Range(0, 10).Select(x => x)); + + dataFrame.Columns.Add(intColumn); + Assert.Single(dataFrame.Columns); + Assert.Equal(10, dataFrame.Rows.Count); + + dataFrame.Columns.Remove(intColumn); + Assert.Empty(dataFrame.Columns); + Assert.Equal(0, dataFrame.Rows.Count); + } + + [Fact] + public void ClearColumnsTests() + { + //Arrange + DataFrame dataFrame = MakeDataFrameWithAllMutableColumnTypes(10); + + //Act + dataFrame.Columns.Clear(); + + //Assert + Assert.Empty(dataFrame.Columns); + + Assert.Equal(0, dataFrame.Rows.Count); + Assert.Equal(0, dataFrame.Columns.LongCount()); } [Fact] From e88b642f92de97e065d3f8c57a426203d0c83d0c Mon Sep 17 00:00:00 2001 From: Aleksei Smirnov Date: Sun, 21 May 2023 12:01:23 +0300 Subject: [PATCH 07/12] Remove redundant column names collection from DataFrameColumnCollection # Conflicts: # src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs --- .../DataFrameColumnCollection.cs | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs b/src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs index 06f1a87ef9..a94cdb7801 100644 --- a/src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs +++ b/src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs @@ -14,9 +14,6 @@ namespace Microsoft.Data.Analysis public class DataFrameColumnCollection : Collection { private readonly Action ColumnsChanged; - - private readonly List _columnNames = new List(); - private readonly Dictionary _columnNameToIndexDictionary = new Dictionary(StringComparer.Ordinal); internal long RowCount { get; set; } @@ -58,7 +55,6 @@ internal void UpdateColumnNameMetadata(DataFrameColumn column, string newName) { string currentName = column.Name; int currentIndex = _columnNameToIndexDictionary[currentName]; - _columnNames[currentIndex] = newName; _columnNameToIndexDictionary.Remove(currentName); _columnNameToIndexDictionary.Add(newName, currentIndex); ColumnsChanged?.Invoke(); @@ -93,11 +89,10 @@ protected override void InsertItem(int columnIndex, DataFrameColumn column) column.AddOwner(this); - _columnNames.Insert(columnIndex, column.Name); _columnNameToIndexDictionary[column.Name] = columnIndex; for (int i = columnIndex + 1; i < Count; i++) { - _columnNameToIndexDictionary[_columnNames[i]]++; + _columnNameToIndexDictionary[this[i].Name]++; } base.InsertItem(columnIndex, column); ColumnsChanged?.Invoke(); @@ -115,9 +110,7 @@ protected override void SetItem(int columnIndex, DataFrameColumn column) { throw new ArgumentException(string.Format(Strings.DuplicateColumnName, column.Name), nameof(column)); } - - _columnNameToIndexDictionary.Remove(_columnNames[columnIndex]); - _columnNames[columnIndex] = column.Name; + _columnNameToIndexDictionary.Remove(this[columnIndex].Name); _columnNameToIndexDictionary[column.Name] = columnIndex; this[columnIndex].RemoveOwner(this); @@ -128,12 +121,11 @@ protected override void SetItem(int columnIndex, DataFrameColumn column) protected override void RemoveItem(int columnIndex) { - _columnNameToIndexDictionary.Remove(_columnNames[columnIndex]); + _columnNameToIndexDictionary.Remove(this[columnIndex].Name); for (int i = columnIndex + 1; i < Count; i++) { - _columnNameToIndexDictionary[_columnNames[i]]--; + _columnNameToIndexDictionary[this[i].Name]--; } - _columnNames.RemoveAt(columnIndex); this[columnIndex].RemoveOwner(this); base.RemoveItem(columnIndex); @@ -171,7 +163,6 @@ protected override void ClearItems() { base.ClearItems(); ColumnsChanged?.Invoke(); - _columnNames.Clear(); _columnNameToIndexDictionary.Clear(); //reset RowCount as DataFrame is now empty From 91d0f1fdeb0a1c179a69b4759211fc1d12ddfeb9 Mon Sep 17 00:00:00 2001 From: Aleksei Smirnov Date: Sun, 21 May 2023 12:08:19 +0300 Subject: [PATCH 08/12] Add missing implementation for datetime relevant arrow type # Conflicts: # src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.cs --- eng/Versions.props | 2 +- .../DataFrame.Arrow.cs | 15 ++++- .../PrimitiveColumnContainer.cs | 12 ---- .../PrimitiveDataFrameColumn.cs | 57 ++++++++++++++----- .../ArrowIntegrationTests.cs | 1 + 5 files changed, 58 insertions(+), 29 deletions(-) diff --git a/eng/Versions.props b/eng/Versions.props index 902cc3dab3..d13d42aadc 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -30,7 +30,7 @@ 6.0.1 4.7.1 - 2.0.0 + 11.0.0 3.19.6 2.3.1 3.3.0 diff --git a/src/Microsoft.Data.Analysis/DataFrame.Arrow.cs b/src/Microsoft.Data.Analysis/DataFrame.Arrow.cs index 2938413459..270cfff63b 100644 --- a/src/Microsoft.Data.Analysis/DataFrame.Arrow.cs +++ b/src/Microsoft.Data.Analysis/DataFrame.Arrow.cs @@ -101,10 +101,18 @@ private static void AppendDataFrameColumnFromArrowArray(Field field, IArrowArray AppendDataFrameColumnFromArrowArray(fieldsEnumerator.Current, structArrayEnumerator.Current, ret, field.Name + "_"); } break; - case ArrowTypeId.Decimal: + case ArrowTypeId.Date64: + Date64Array arrowDate64Array = (Date64Array)arrowArray; + dataFrameColumn = new PrimitiveDataFrameColumn(fieldName, arrowDate64Array.Data.Length); + for (int i = 0; i < arrowDate64Array.Data.Length; i++) + { + dataFrameColumn[i] = arrowDate64Array.GetDateTime(i); + } + break; + case ArrowTypeId.Decimal128: + case ArrowTypeId.Decimal256: case ArrowTypeId.Binary: case ArrowTypeId.Date32: - case ArrowTypeId.Date64: case ArrowTypeId.Dictionary: case ArrowTypeId.FixedSizedBinary: case ArrowTypeId.HalfFloat: @@ -114,6 +122,7 @@ private static void AppendDataFrameColumnFromArrowArray(Field field, IArrowArray case ArrowTypeId.Null: case ArrowTypeId.Time32: case ArrowTypeId.Time64: + case ArrowTypeId.Timestamp: default: throw new NotImplementedException($"{fieldType.Name}"); } @@ -145,7 +154,7 @@ public static DataFrame FromArrowRecordBatch(RecordBatch recordBatch) } /// - /// Returns an without copying data + /// Returns an mostly without copying data /// public IEnumerable ToArrowRecordBatches() { diff --git a/src/Microsoft.Data.Analysis/PrimitiveColumnContainer.cs b/src/Microsoft.Data.Analysis/PrimitiveColumnContainer.cs index 92996b136b..d65255d5be 100644 --- a/src/Microsoft.Data.Analysis/PrimitiveColumnContainer.cs +++ b/src/Microsoft.Data.Analysis/PrimitiveColumnContainer.cs @@ -374,18 +374,6 @@ internal int MaxRecordBatchLength(long startIndex) return Buffers[arrayIndex].Length - (int)startIndex; } - internal ReadOnlyMemory GetValueBuffer(long startIndex) - { - int arrayIndex = GetArrayContainingRowIndex(startIndex); - return Buffers[arrayIndex].ReadOnlyBuffer; - } - - internal ReadOnlyMemory GetNullBuffer(long startIndex) - { - int arrayIndex = GetArrayContainingRowIndex(startIndex); - return NullBitMapBuffers[arrayIndex].ReadOnlyBuffer; - } - public IReadOnlyList this[long startIndex, int length] { get diff --git a/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.cs b/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.cs index c251c802ec..304d542c54 100644 --- a/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.cs +++ b/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using Apache.Arrow; using Apache.Arrow.Types; using Microsoft.ML; @@ -104,6 +105,8 @@ private IArrowType GetArrowType() return UInt64Type.Default; else if (typeof(T) == typeof(ushort)) return UInt16Type.Default; + else if (typeof(T) == typeof(DateTime)) + return Date64Type.Default; else throw new NotImplementedException(nameof(T)); } @@ -127,36 +130,64 @@ protected internal override Apache.Arrow.Array ToArrowArray(long startIndex, int { int arrayIndex = numberOfRows == 0 ? 0 : _columnContainer.GetArrayContainingRowIndex(startIndex); int offset = (int)(startIndex - arrayIndex * ReadOnlyDataFrameBuffer.MaxCapacity); + if (numberOfRows != 0 && numberOfRows > _columnContainer.Buffers[arrayIndex].Length - offset) { throw new ArgumentException(Strings.SpansMultipleBuffers, nameof(numberOfRows)); } - ArrowBuffer valueBuffer = numberOfRows == 0 ? ArrowBuffer.Empty : new ArrowBuffer(_columnContainer.GetValueBuffer(startIndex)); - ArrowBuffer nullBuffer = numberOfRows == 0 ? ArrowBuffer.Empty : new ArrowBuffer(_columnContainer.GetNullBuffer(startIndex)); + int nullCount = GetNullCount(startIndex, numberOfRows); + + //DateTime requires convertion + if (this.DataType == typeof(DateTime)) + { + if (numberOfRows == 0) + return new Date64Array(ArrowBuffer.Empty, ArrowBuffer.Empty, numberOfRows, nullCount, offset); + + ReadOnlyDataFrameBuffer valueBuffer = (numberOfRows == 0) ? null : _columnContainer.Buffers[arrayIndex]; + ReadOnlyDataFrameBuffer nullBuffer = (numberOfRows == 0) ? null : _columnContainer.NullBitMapBuffers[arrayIndex]; + + ReadOnlySpan valueSpan = MemoryMarshal.Cast(valueBuffer.ReadOnlySpan); + Date64Array.Builder builder = new Date64Array.Builder().Reserve(valueBuffer.Length); + + for (int i = 0; i < valueBuffer.Length; i++) + { + if (BitUtility.GetBit(nullBuffer.ReadOnlySpan, i)) + builder.Append(valueSpan[i]); + else + builder.AppendNull(); + } + + return builder.Build(); + } + + //No convertion + ArrowBuffer arrowValueBuffer = numberOfRows == 0 ? ArrowBuffer.Empty : new ArrowBuffer(_columnContainer.Buffers[arrayIndex].ReadOnlyBuffer); + ArrowBuffer arrowNullBuffer = numberOfRows == 0 ? ArrowBuffer.Empty : new ArrowBuffer(_columnContainer.NullBitMapBuffers[arrayIndex].ReadOnlyBuffer); + Type type = this.DataType; if (type == typeof(bool)) - return new BooleanArray(valueBuffer, nullBuffer, numberOfRows, nullCount, offset); + return new BooleanArray(arrowValueBuffer, arrowNullBuffer, numberOfRows, nullCount, offset); else if (type == typeof(double)) - return new DoubleArray(valueBuffer, nullBuffer, numberOfRows, nullCount, offset); + return new DoubleArray(arrowValueBuffer, arrowNullBuffer, numberOfRows, nullCount, offset); else if (type == typeof(float)) - return new FloatArray(valueBuffer, nullBuffer, numberOfRows, nullCount, offset); + return new FloatArray(arrowValueBuffer, arrowNullBuffer, numberOfRows, nullCount, offset); else if (type == typeof(int)) - return new Int32Array(valueBuffer, nullBuffer, numberOfRows, nullCount, offset); + return new Int32Array(arrowValueBuffer, arrowNullBuffer, numberOfRows, nullCount, offset); else if (type == typeof(long)) - return new Int64Array(valueBuffer, nullBuffer, numberOfRows, nullCount, offset); + return new Int64Array(arrowValueBuffer, arrowNullBuffer, numberOfRows, nullCount, offset); else if (type == typeof(sbyte)) - return new Int8Array(valueBuffer, nullBuffer, numberOfRows, nullCount, offset); + return new Int8Array(arrowValueBuffer, arrowNullBuffer, numberOfRows, nullCount, offset); else if (type == typeof(short)) - return new Int16Array(valueBuffer, nullBuffer, numberOfRows, nullCount, offset); + return new Int16Array(arrowValueBuffer, arrowNullBuffer, numberOfRows, nullCount, offset); else if (type == typeof(uint)) - return new UInt32Array(valueBuffer, nullBuffer, numberOfRows, nullCount, offset); + return new UInt32Array(arrowValueBuffer, arrowNullBuffer, numberOfRows, nullCount, offset); else if (type == typeof(ulong)) - return new UInt64Array(valueBuffer, nullBuffer, numberOfRows, nullCount, offset); + return new UInt64Array(arrowValueBuffer, arrowNullBuffer, numberOfRows, nullCount, offset); else if (type == typeof(ushort)) - return new UInt16Array(valueBuffer, nullBuffer, numberOfRows, nullCount, offset); + return new UInt16Array(arrowValueBuffer, arrowNullBuffer, numberOfRows, nullCount, offset); else if (type == typeof(byte)) - return new UInt8Array(valueBuffer, nullBuffer, numberOfRows, nullCount, offset); + return new UInt8Array(arrowValueBuffer, arrowNullBuffer, numberOfRows, nullCount, offset); else throw new NotImplementedException(type.ToString()); } diff --git a/test/Microsoft.Data.Analysis.Tests/ArrowIntegrationTests.cs b/test/Microsoft.Data.Analysis.Tests/ArrowIntegrationTests.cs index dacf43a8db..185ab835bb 100644 --- a/test/Microsoft.Data.Analysis.Tests/ArrowIntegrationTests.cs +++ b/test/Microsoft.Data.Analysis.Tests/ArrowIntegrationTests.cs @@ -48,6 +48,7 @@ public void TestArrowIntegration() .Append("ULongColumn", false, new UInt64Array.Builder().AppendRange(Enumerable.Repeat((ulong)1, 10)).Build()) .Append("ByteColumn", false, new Int8Array.Builder().AppendRange(Enumerable.Repeat((sbyte)1, 10)).Build()) .Append("UByteColumn", false, new UInt8Array.Builder().AppendRange(Enumerable.Repeat((byte)1, 10)).Build()) + .Append("Date64Column", false, new Date64Array.Builder().AppendRange(Enumerable.Repeat(DateTime.Now, 10)).Build()) .Build(); DataFrame df = DataFrame.FromArrowRecordBatch(originalBatch); From 4ebddeb1b5ae9fedaba7d1a95c46471fac24801d Mon Sep 17 00:00:00 2001 From: Aleksei Smirnov Date: Sun, 21 May 2023 12:19:56 +0300 Subject: [PATCH 09/12] Fix DataFrame Merge issue # Conflicts: # src/Microsoft.Data.Analysis/BooleanDataFrameColumn.cs # src/Microsoft.Data.Analysis/ByteDataFrameColumn.cs # src/Microsoft.Data.Analysis/CharDataFrameColumn.cs # src/Microsoft.Data.Analysis/DateTimeDataFrameColumn.cs # src/Microsoft.Data.Analysis/DecimalDataFrameColumn.cs # src/Microsoft.Data.Analysis/DoubleDataFrameColumn.cs # src/Microsoft.Data.Analysis/Int16DataFrameColumn.cs # src/Microsoft.Data.Analysis/Int32DataFrameColumn.cs # src/Microsoft.Data.Analysis/Int64DataFrameColumn.cs # src/Microsoft.Data.Analysis/SByteDataFrameColumn.cs # src/Microsoft.Data.Analysis/SingleDataFrameColumn.cs # src/Microsoft.Data.Analysis/UInt16DataFrameColumn.cs # src/Microsoft.Data.Analysis/UInt32DataFrameColumn.cs # src/Microsoft.Data.Analysis/UInt64DataFrameColumn.cs # test/Microsoft.Data.Analysis.Tests/DataFrame.IOTests.cs --- .../DataFrameColumnCollection.cs | 17 +++++++ .../PrimitiveDataFrameColumn.cs | 17 +++++-- .../DataFrameTests.cs | 50 +++++++++++++++++++ 3 files changed, 81 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs b/src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs index a94cdb7801..52d890b182 100644 --- a/src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs +++ b/src/Microsoft.Data.Analysis/DataFrameColumnCollection.cs @@ -220,6 +220,23 @@ public PrimitiveDataFrameColumn GetPrimitiveColumn(string name) throw new ArgumentException(string.Format(Strings.BadColumnCast, column.DataType, typeof(T)), nameof(T)); } + /// + /// Gets the with the specified . + /// + /// The name of the column + /// . + /// A column named cannot be found, or if the column's type doesn't match. + public PrimitiveDataFrameColumn GetDateTimeColumn(string name) + { + DataFrameColumn column = this[name]; + if (column is PrimitiveDataFrameColumn ret) + { + return ret; + } + + throw new ArgumentException(string.Format(Strings.BadColumnCast, column.DataType, typeof(DateTime))); + } + /// /// Gets the with the specified . /// diff --git a/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.cs b/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.cs index 304d542c54..0fe7820fe2 100644 --- a/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.cs +++ b/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.cs @@ -220,6 +220,16 @@ protected override IReadOnlyList GetValues(long startIndex, int length) return ret; } + internal virtual PrimitiveDataFrameColumn CreateNewColumn(string name, PrimitiveColumnContainer container) + { + return new PrimitiveDataFrameColumn(name, container); + } + + protected virtual PrimitiveDataFrameColumn CreateNewColumn(string name, long length = 0) + { + return new PrimitiveDataFrameColumn(name, length); + } + internal T? GetTypedValue(long rowIndex) => _columnContainer[rowIndex]; protected override object GetValue(long rowIndex) => GetTypedValue(rowIndex); @@ -411,7 +421,7 @@ private PrimitiveDataFrameColumn Clone(PrimitiveDataFrameColumn boolCol { if (boolColumn.Length > Length) throw new ArgumentException(Strings.MapIndicesExceedsColumnLenth, nameof(boolColumn)); - PrimitiveDataFrameColumn ret = new PrimitiveDataFrameColumn(Name); + PrimitiveDataFrameColumn ret = CreateNewColumn(Name); for (long i = 0; i < boolColumn.Length; i++) { bool? value = boolColumn[i]; @@ -438,7 +448,8 @@ private PrimitiveDataFrameColumn CloneImplementation(PrimitiveDataFrameCol } else throw new NotImplementedException(); - PrimitiveDataFrameColumn ret = new PrimitiveDataFrameColumn(Name, retContainer); + + PrimitiveDataFrameColumn ret = CreateNewColumn(Name, retContainer); return ret; } @@ -447,7 +458,7 @@ public PrimitiveDataFrameColumn Clone(PrimitiveDataFrameColumn mapIndic if (mapIndices is null) { PrimitiveColumnContainer newColumnContainer = _columnContainer.Clone(); - return new PrimitiveDataFrameColumn(Name, newColumnContainer); + return CreateNewColumn(Name, newColumnContainer); } else { diff --git a/test/Microsoft.Data.Analysis.Tests/DataFrameTests.cs b/test/Microsoft.Data.Analysis.Tests/DataFrameTests.cs index 866ecfec4f..87cdf4846f 100644 --- a/test/Microsoft.Data.Analysis.Tests/DataFrameTests.cs +++ b/test/Microsoft.Data.Analysis.Tests/DataFrameTests.cs @@ -2766,6 +2766,56 @@ public void TestMerge_Issue5778() MatchRowsOnMergedDataFrame(merge, left, right, 1, 1, 0); } + [Fact] + //Issue 6127 + public void TestMerge_CorrectColumnTypes() + { + DataFrame left = MakeDataFrameWithAllMutableColumnTypes(2, false); + DataFrame right = MakeDataFrameWithAllMutableColumnTypes(1); + + DataFrame merge = left.Merge(right, "Int", "Int"); + + Assert.NotNull(merge.Columns.GetBooleanColumn("Bool_left")); + Assert.NotNull(merge.Columns.GetBooleanColumn("Bool_right")); + + Assert.NotNull(merge.Columns.GetDecimalColumn("Decimal_left")); + Assert.NotNull(merge.Columns.GetDecimalColumn("Decimal_right")); + + Assert.NotNull(merge.Columns.GetSingleColumn("Float_left")); + Assert.NotNull(merge.Columns.GetSingleColumn("Float_right")); + + Assert.NotNull(merge.Columns.GetDoubleColumn("Double_left")); + Assert.NotNull(merge.Columns.GetDoubleColumn("Double_right")); + + Assert.NotNull(merge.Columns.GetByteColumn("Byte_left")); + Assert.NotNull(merge.Columns.GetByteColumn("Byte_right")); + + Assert.NotNull(merge.Columns.GetCharColumn("Char_left")); + Assert.NotNull(merge.Columns.GetCharColumn("Char_right")); + + Assert.NotNull(merge.Columns.GetInt16Column("Short_left")); + Assert.NotNull(merge.Columns.GetInt16Column("Short_right")); + + Assert.NotNull(merge.Columns.GetUInt16Column("Ushort_left")); + Assert.NotNull(merge.Columns.GetUInt16Column("Ushort_right")); + + Assert.NotNull(merge.Columns.GetInt32Column("Int_left")); + Assert.NotNull(merge.Columns.GetInt32Column("Int_right")); + + Assert.NotNull(merge.Columns.GetUInt32Column("Uint_left")); + Assert.NotNull(merge.Columns.GetUInt32Column("Uint_right")); + + Assert.NotNull(merge.Columns.GetInt64Column("Long_left")); + Assert.NotNull(merge.Columns.GetInt64Column("Long_right")); + + Assert.NotNull(merge.Columns.GetUInt64Column("Ulong_left")); + Assert.NotNull(merge.Columns.GetUInt64Column("Ulong_right")); + + Assert.NotNull(merge.Columns.GetDateTimeColumn("DateTime_left")); + Assert.NotNull(merge.Columns.GetDateTimeColumn("DateTime_right")); + + } + [Fact] public void TestDescription() { From da2cb99751ee1a8396fb03003585eea0793c6907 Mon Sep 17 00:00:00 2001 From: Aleksei Smirnov Date: Thu, 25 May 2023 08:56:59 +0300 Subject: [PATCH 10/12] Clean switch by type in binary operations # Conflicts: # src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.BinaryOperations.tt --- ...imitiveDataFrameColumn.BinaryOperations.cs | 392 +++++++++--------- 1 file changed, 196 insertions(+), 196 deletions(-) diff --git a/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.BinaryOperations.cs b/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.BinaryOperations.cs index d0df8f9c34..d05af4d699 100644 --- a/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.BinaryOperations.cs +++ b/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumn.BinaryOperations.cs @@ -20,33 +20,33 @@ public override DataFrameColumn Add(DataFrameColumn column, bool inPlace = false switch (column) { case PrimitiveDataFrameColumn boolColumn: - return AddImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AddImplementation(boolColumn, inPlace); case PrimitiveDataFrameColumn byteColumn: - return AddImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AddImplementation(byteColumn, inPlace); case PrimitiveDataFrameColumn charColumn: - return AddImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AddImplementation(charColumn, inPlace); case PrimitiveDataFrameColumn decimalColumn: - return AddImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AddImplementation(decimalColumn, inPlace); case PrimitiveDataFrameColumn doubleColumn: - return AddImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AddImplementation(doubleColumn, inPlace); case PrimitiveDataFrameColumn floatColumn: - return AddImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AddImplementation(floatColumn, inPlace); case PrimitiveDataFrameColumn intColumn: - return AddImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AddImplementation(intColumn, inPlace); case PrimitiveDataFrameColumn longColumn: - return AddImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AddImplementation(longColumn, inPlace); case PrimitiveDataFrameColumn sbyteColumn: - return AddImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AddImplementation(sbyteColumn, inPlace); case PrimitiveDataFrameColumn shortColumn: - return AddImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AddImplementation(shortColumn, inPlace); case PrimitiveDataFrameColumn uintColumn: - return AddImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AddImplementation(uintColumn, inPlace); case PrimitiveDataFrameColumn ulongColumn: - return AddImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AddImplementation(ulongColumn, inPlace); case PrimitiveDataFrameColumn ushortColumn: - return AddImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AddImplementation(ushortColumn, inPlace); case PrimitiveDataFrameColumn DateTimeColumn: - return AddImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AddImplementation(DateTimeColumn, inPlace); default: throw new NotSupportedException(); } @@ -67,33 +67,33 @@ public override DataFrameColumn Subtract(DataFrameColumn column, bool inPlace = switch (column) { case PrimitiveDataFrameColumn boolColumn: - return SubtractImplementation(column as PrimitiveDataFrameColumn, inPlace); + return SubtractImplementation(boolColumn, inPlace); case PrimitiveDataFrameColumn byteColumn: - return SubtractImplementation(column as PrimitiveDataFrameColumn, inPlace); + return SubtractImplementation(byteColumn, inPlace); case PrimitiveDataFrameColumn charColumn: - return SubtractImplementation(column as PrimitiveDataFrameColumn, inPlace); + return SubtractImplementation(charColumn, inPlace); case PrimitiveDataFrameColumn decimalColumn: - return SubtractImplementation(column as PrimitiveDataFrameColumn, inPlace); + return SubtractImplementation(decimalColumn, inPlace); case PrimitiveDataFrameColumn doubleColumn: - return SubtractImplementation(column as PrimitiveDataFrameColumn, inPlace); + return SubtractImplementation(doubleColumn, inPlace); case PrimitiveDataFrameColumn floatColumn: - return SubtractImplementation(column as PrimitiveDataFrameColumn, inPlace); + return SubtractImplementation(floatColumn, inPlace); case PrimitiveDataFrameColumn intColumn: - return SubtractImplementation(column as PrimitiveDataFrameColumn, inPlace); + return SubtractImplementation(intColumn, inPlace); case PrimitiveDataFrameColumn longColumn: - return SubtractImplementation(column as PrimitiveDataFrameColumn, inPlace); + return SubtractImplementation(longColumn, inPlace); case PrimitiveDataFrameColumn sbyteColumn: - return SubtractImplementation(column as PrimitiveDataFrameColumn, inPlace); + return SubtractImplementation(sbyteColumn, inPlace); case PrimitiveDataFrameColumn shortColumn: - return SubtractImplementation(column as PrimitiveDataFrameColumn, inPlace); + return SubtractImplementation(shortColumn, inPlace); case PrimitiveDataFrameColumn uintColumn: - return SubtractImplementation(column as PrimitiveDataFrameColumn, inPlace); + return SubtractImplementation(uintColumn, inPlace); case PrimitiveDataFrameColumn ulongColumn: - return SubtractImplementation(column as PrimitiveDataFrameColumn, inPlace); + return SubtractImplementation(ulongColumn, inPlace); case PrimitiveDataFrameColumn ushortColumn: - return SubtractImplementation(column as PrimitiveDataFrameColumn, inPlace); + return SubtractImplementation(ushortColumn, inPlace); case PrimitiveDataFrameColumn DateTimeColumn: - return SubtractImplementation(column as PrimitiveDataFrameColumn, inPlace); + return SubtractImplementation(DateTimeColumn, inPlace); default: throw new NotSupportedException(); } @@ -114,33 +114,33 @@ public override DataFrameColumn Multiply(DataFrameColumn column, bool inPlace = switch (column) { case PrimitiveDataFrameColumn boolColumn: - return MultiplyImplementation(column as PrimitiveDataFrameColumn, inPlace); + return MultiplyImplementation(boolColumn, inPlace); case PrimitiveDataFrameColumn byteColumn: - return MultiplyImplementation(column as PrimitiveDataFrameColumn, inPlace); + return MultiplyImplementation(byteColumn, inPlace); case PrimitiveDataFrameColumn charColumn: - return MultiplyImplementation(column as PrimitiveDataFrameColumn, inPlace); + return MultiplyImplementation(charColumn, inPlace); case PrimitiveDataFrameColumn decimalColumn: - return MultiplyImplementation(column as PrimitiveDataFrameColumn, inPlace); + return MultiplyImplementation(decimalColumn, inPlace); case PrimitiveDataFrameColumn doubleColumn: - return MultiplyImplementation(column as PrimitiveDataFrameColumn, inPlace); + return MultiplyImplementation(doubleColumn, inPlace); case PrimitiveDataFrameColumn floatColumn: - return MultiplyImplementation(column as PrimitiveDataFrameColumn, inPlace); + return MultiplyImplementation(floatColumn, inPlace); case PrimitiveDataFrameColumn intColumn: - return MultiplyImplementation(column as PrimitiveDataFrameColumn, inPlace); + return MultiplyImplementation(intColumn, inPlace); case PrimitiveDataFrameColumn longColumn: - return MultiplyImplementation(column as PrimitiveDataFrameColumn, inPlace); + return MultiplyImplementation(longColumn, inPlace); case PrimitiveDataFrameColumn sbyteColumn: - return MultiplyImplementation(column as PrimitiveDataFrameColumn, inPlace); + return MultiplyImplementation(sbyteColumn, inPlace); case PrimitiveDataFrameColumn shortColumn: - return MultiplyImplementation(column as PrimitiveDataFrameColumn, inPlace); + return MultiplyImplementation(shortColumn, inPlace); case PrimitiveDataFrameColumn uintColumn: - return MultiplyImplementation(column as PrimitiveDataFrameColumn, inPlace); + return MultiplyImplementation(uintColumn, inPlace); case PrimitiveDataFrameColumn ulongColumn: - return MultiplyImplementation(column as PrimitiveDataFrameColumn, inPlace); + return MultiplyImplementation(ulongColumn, inPlace); case PrimitiveDataFrameColumn ushortColumn: - return MultiplyImplementation(column as PrimitiveDataFrameColumn, inPlace); + return MultiplyImplementation(ushortColumn, inPlace); case PrimitiveDataFrameColumn DateTimeColumn: - return MultiplyImplementation(column as PrimitiveDataFrameColumn, inPlace); + return MultiplyImplementation(DateTimeColumn, inPlace); default: throw new NotSupportedException(); } @@ -161,33 +161,33 @@ public override DataFrameColumn Divide(DataFrameColumn column, bool inPlace = fa switch (column) { case PrimitiveDataFrameColumn boolColumn: - return DivideImplementation(column as PrimitiveDataFrameColumn, inPlace); + return DivideImplementation(boolColumn, inPlace); case PrimitiveDataFrameColumn byteColumn: - return DivideImplementation(column as PrimitiveDataFrameColumn, inPlace); + return DivideImplementation(byteColumn, inPlace); case PrimitiveDataFrameColumn charColumn: - return DivideImplementation(column as PrimitiveDataFrameColumn, inPlace); + return DivideImplementation(charColumn, inPlace); case PrimitiveDataFrameColumn decimalColumn: - return DivideImplementation(column as PrimitiveDataFrameColumn, inPlace); + return DivideImplementation(decimalColumn, inPlace); case PrimitiveDataFrameColumn doubleColumn: - return DivideImplementation(column as PrimitiveDataFrameColumn, inPlace); + return DivideImplementation(doubleColumn, inPlace); case PrimitiveDataFrameColumn floatColumn: - return DivideImplementation(column as PrimitiveDataFrameColumn, inPlace); + return DivideImplementation(floatColumn, inPlace); case PrimitiveDataFrameColumn intColumn: - return DivideImplementation(column as PrimitiveDataFrameColumn, inPlace); + return DivideImplementation(intColumn, inPlace); case PrimitiveDataFrameColumn longColumn: - return DivideImplementation(column as PrimitiveDataFrameColumn, inPlace); + return DivideImplementation(longColumn, inPlace); case PrimitiveDataFrameColumn sbyteColumn: - return DivideImplementation(column as PrimitiveDataFrameColumn, inPlace); + return DivideImplementation(sbyteColumn, inPlace); case PrimitiveDataFrameColumn shortColumn: - return DivideImplementation(column as PrimitiveDataFrameColumn, inPlace); + return DivideImplementation(shortColumn, inPlace); case PrimitiveDataFrameColumn uintColumn: - return DivideImplementation(column as PrimitiveDataFrameColumn, inPlace); + return DivideImplementation(uintColumn, inPlace); case PrimitiveDataFrameColumn ulongColumn: - return DivideImplementation(column as PrimitiveDataFrameColumn, inPlace); + return DivideImplementation(ulongColumn, inPlace); case PrimitiveDataFrameColumn ushortColumn: - return DivideImplementation(column as PrimitiveDataFrameColumn, inPlace); + return DivideImplementation(ushortColumn, inPlace); case PrimitiveDataFrameColumn DateTimeColumn: - return DivideImplementation(column as PrimitiveDataFrameColumn, inPlace); + return DivideImplementation(DateTimeColumn, inPlace); default: throw new NotSupportedException(); } @@ -208,33 +208,33 @@ public override DataFrameColumn Modulo(DataFrameColumn column, bool inPlace = fa switch (column) { case PrimitiveDataFrameColumn boolColumn: - return ModuloImplementation(column as PrimitiveDataFrameColumn, inPlace); + return ModuloImplementation(boolColumn, inPlace); case PrimitiveDataFrameColumn byteColumn: - return ModuloImplementation(column as PrimitiveDataFrameColumn, inPlace); + return ModuloImplementation(byteColumn, inPlace); case PrimitiveDataFrameColumn charColumn: - return ModuloImplementation(column as PrimitiveDataFrameColumn, inPlace); + return ModuloImplementation(charColumn, inPlace); case PrimitiveDataFrameColumn decimalColumn: - return ModuloImplementation(column as PrimitiveDataFrameColumn, inPlace); + return ModuloImplementation(decimalColumn, inPlace); case PrimitiveDataFrameColumn doubleColumn: - return ModuloImplementation(column as PrimitiveDataFrameColumn, inPlace); + return ModuloImplementation(doubleColumn, inPlace); case PrimitiveDataFrameColumn floatColumn: - return ModuloImplementation(column as PrimitiveDataFrameColumn, inPlace); + return ModuloImplementation(floatColumn, inPlace); case PrimitiveDataFrameColumn intColumn: - return ModuloImplementation(column as PrimitiveDataFrameColumn, inPlace); + return ModuloImplementation(intColumn, inPlace); case PrimitiveDataFrameColumn longColumn: - return ModuloImplementation(column as PrimitiveDataFrameColumn, inPlace); + return ModuloImplementation(longColumn, inPlace); case PrimitiveDataFrameColumn sbyteColumn: - return ModuloImplementation(column as PrimitiveDataFrameColumn, inPlace); + return ModuloImplementation(sbyteColumn, inPlace); case PrimitiveDataFrameColumn shortColumn: - return ModuloImplementation(column as PrimitiveDataFrameColumn, inPlace); + return ModuloImplementation(shortColumn, inPlace); case PrimitiveDataFrameColumn uintColumn: - return ModuloImplementation(column as PrimitiveDataFrameColumn, inPlace); + return ModuloImplementation(uintColumn, inPlace); case PrimitiveDataFrameColumn ulongColumn: - return ModuloImplementation(column as PrimitiveDataFrameColumn, inPlace); + return ModuloImplementation(ulongColumn, inPlace); case PrimitiveDataFrameColumn ushortColumn: - return ModuloImplementation(column as PrimitiveDataFrameColumn, inPlace); + return ModuloImplementation(ushortColumn, inPlace); case PrimitiveDataFrameColumn DateTimeColumn: - return ModuloImplementation(column as PrimitiveDataFrameColumn, inPlace); + return ModuloImplementation(DateTimeColumn, inPlace); default: throw new NotSupportedException(); } @@ -255,33 +255,33 @@ public override DataFrameColumn And(DataFrameColumn column, bool inPlace = false switch (column) { case PrimitiveDataFrameColumn boolColumn: - return AndImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AndImplementation(boolColumn, inPlace); case PrimitiveDataFrameColumn byteColumn: - return AndImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AndImplementation(byteColumn, inPlace); case PrimitiveDataFrameColumn charColumn: - return AndImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AndImplementation(charColumn, inPlace); case PrimitiveDataFrameColumn decimalColumn: - return AndImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AndImplementation(decimalColumn, inPlace); case PrimitiveDataFrameColumn doubleColumn: - return AndImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AndImplementation(doubleColumn, inPlace); case PrimitiveDataFrameColumn floatColumn: - return AndImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AndImplementation(floatColumn, inPlace); case PrimitiveDataFrameColumn intColumn: - return AndImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AndImplementation(intColumn, inPlace); case PrimitiveDataFrameColumn longColumn: - return AndImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AndImplementation(longColumn, inPlace); case PrimitiveDataFrameColumn sbyteColumn: - return AndImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AndImplementation(sbyteColumn, inPlace); case PrimitiveDataFrameColumn shortColumn: - return AndImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AndImplementation(shortColumn, inPlace); case PrimitiveDataFrameColumn uintColumn: - return AndImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AndImplementation(uintColumn, inPlace); case PrimitiveDataFrameColumn ulongColumn: - return AndImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AndImplementation(ulongColumn, inPlace); case PrimitiveDataFrameColumn ushortColumn: - return AndImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AndImplementation(ushortColumn, inPlace); case PrimitiveDataFrameColumn DateTimeColumn: - return AndImplementation(column as PrimitiveDataFrameColumn, inPlace); + return AndImplementation(DateTimeColumn, inPlace); default: throw new NotSupportedException(); } @@ -297,33 +297,33 @@ public override DataFrameColumn Or(DataFrameColumn column, bool inPlace = false) switch (column) { case PrimitiveDataFrameColumn boolColumn: - return OrImplementation(column as PrimitiveDataFrameColumn, inPlace); + return OrImplementation(boolColumn, inPlace); case PrimitiveDataFrameColumn byteColumn: - return OrImplementation(column as PrimitiveDataFrameColumn, inPlace); + return OrImplementation(byteColumn, inPlace); case PrimitiveDataFrameColumn charColumn: - return OrImplementation(column as PrimitiveDataFrameColumn, inPlace); + return OrImplementation(charColumn, inPlace); case PrimitiveDataFrameColumn decimalColumn: - return OrImplementation(column as PrimitiveDataFrameColumn, inPlace); + return OrImplementation(decimalColumn, inPlace); case PrimitiveDataFrameColumn doubleColumn: - return OrImplementation(column as PrimitiveDataFrameColumn, inPlace); + return OrImplementation(doubleColumn, inPlace); case PrimitiveDataFrameColumn floatColumn: - return OrImplementation(column as PrimitiveDataFrameColumn, inPlace); + return OrImplementation(floatColumn, inPlace); case PrimitiveDataFrameColumn intColumn: - return OrImplementation(column as PrimitiveDataFrameColumn, inPlace); + return OrImplementation(intColumn, inPlace); case PrimitiveDataFrameColumn longColumn: - return OrImplementation(column as PrimitiveDataFrameColumn, inPlace); + return OrImplementation(longColumn, inPlace); case PrimitiveDataFrameColumn sbyteColumn: - return OrImplementation(column as PrimitiveDataFrameColumn, inPlace); + return OrImplementation(sbyteColumn, inPlace); case PrimitiveDataFrameColumn shortColumn: - return OrImplementation(column as PrimitiveDataFrameColumn, inPlace); + return OrImplementation(shortColumn, inPlace); case PrimitiveDataFrameColumn uintColumn: - return OrImplementation(column as PrimitiveDataFrameColumn, inPlace); + return OrImplementation(uintColumn, inPlace); case PrimitiveDataFrameColumn ulongColumn: - return OrImplementation(column as PrimitiveDataFrameColumn, inPlace); + return OrImplementation(ulongColumn, inPlace); case PrimitiveDataFrameColumn ushortColumn: - return OrImplementation(column as PrimitiveDataFrameColumn, inPlace); + return OrImplementation(ushortColumn, inPlace); case PrimitiveDataFrameColumn DateTimeColumn: - return OrImplementation(column as PrimitiveDataFrameColumn, inPlace); + return OrImplementation(DateTimeColumn, inPlace); default: throw new NotSupportedException(); } @@ -339,33 +339,33 @@ public override DataFrameColumn Xor(DataFrameColumn column, bool inPlace = false switch (column) { case PrimitiveDataFrameColumn boolColumn: - return XorImplementation(column as PrimitiveDataFrameColumn, inPlace); + return XorImplementation(boolColumn, inPlace); case PrimitiveDataFrameColumn byteColumn: - return XorImplementation(column as PrimitiveDataFrameColumn, inPlace); + return XorImplementation(byteColumn, inPlace); case PrimitiveDataFrameColumn charColumn: - return XorImplementation(column as PrimitiveDataFrameColumn, inPlace); + return XorImplementation(charColumn, inPlace); case PrimitiveDataFrameColumn decimalColumn: - return XorImplementation(column as PrimitiveDataFrameColumn, inPlace); + return XorImplementation(decimalColumn, inPlace); case PrimitiveDataFrameColumn doubleColumn: - return XorImplementation(column as PrimitiveDataFrameColumn, inPlace); + return XorImplementation(doubleColumn, inPlace); case PrimitiveDataFrameColumn floatColumn: - return XorImplementation(column as PrimitiveDataFrameColumn, inPlace); + return XorImplementation(floatColumn, inPlace); case PrimitiveDataFrameColumn intColumn: - return XorImplementation(column as PrimitiveDataFrameColumn, inPlace); + return XorImplementation(intColumn, inPlace); case PrimitiveDataFrameColumn longColumn: - return XorImplementation(column as PrimitiveDataFrameColumn, inPlace); + return XorImplementation(longColumn, inPlace); case PrimitiveDataFrameColumn sbyteColumn: - return XorImplementation(column as PrimitiveDataFrameColumn, inPlace); + return XorImplementation(sbyteColumn, inPlace); case PrimitiveDataFrameColumn shortColumn: - return XorImplementation(column as PrimitiveDataFrameColumn, inPlace); + return XorImplementation(shortColumn, inPlace); case PrimitiveDataFrameColumn uintColumn: - return XorImplementation(column as PrimitiveDataFrameColumn, inPlace); + return XorImplementation(uintColumn, inPlace); case PrimitiveDataFrameColumn ulongColumn: - return XorImplementation(column as PrimitiveDataFrameColumn, inPlace); + return XorImplementation(ulongColumn, inPlace); case PrimitiveDataFrameColumn ushortColumn: - return XorImplementation(column as PrimitiveDataFrameColumn, inPlace); + return XorImplementation(ushortColumn, inPlace); case PrimitiveDataFrameColumn DateTimeColumn: - return XorImplementation(column as PrimitiveDataFrameColumn, inPlace); + return XorImplementation(DateTimeColumn, inPlace); default: throw new NotSupportedException(); } @@ -391,33 +391,33 @@ public override PrimitiveDataFrameColumn ElementwiseEquals(DataFrameColumn switch (column) { case PrimitiveDataFrameColumn boolColumn: - return ElementwiseEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseEqualsImplementation(boolColumn); case PrimitiveDataFrameColumn byteColumn: - return ElementwiseEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseEqualsImplementation(byteColumn); case PrimitiveDataFrameColumn charColumn: - return ElementwiseEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseEqualsImplementation(charColumn); case PrimitiveDataFrameColumn decimalColumn: - return ElementwiseEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseEqualsImplementation(decimalColumn); case PrimitiveDataFrameColumn doubleColumn: - return ElementwiseEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseEqualsImplementation(doubleColumn); case PrimitiveDataFrameColumn floatColumn: - return ElementwiseEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseEqualsImplementation(floatColumn); case PrimitiveDataFrameColumn intColumn: - return ElementwiseEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseEqualsImplementation(intColumn); case PrimitiveDataFrameColumn longColumn: - return ElementwiseEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseEqualsImplementation(longColumn); case PrimitiveDataFrameColumn sbyteColumn: - return ElementwiseEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseEqualsImplementation(sbyteColumn); case PrimitiveDataFrameColumn shortColumn: - return ElementwiseEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseEqualsImplementation(shortColumn); case PrimitiveDataFrameColumn uintColumn: - return ElementwiseEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseEqualsImplementation(uintColumn); case PrimitiveDataFrameColumn ulongColumn: - return ElementwiseEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseEqualsImplementation(ulongColumn); case PrimitiveDataFrameColumn ushortColumn: - return ElementwiseEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseEqualsImplementation(ushortColumn); case PrimitiveDataFrameColumn DateTimeColumn: - return ElementwiseEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseEqualsImplementation(DateTimeColumn); default: throw new NotSupportedException(); } @@ -438,33 +438,33 @@ public override PrimitiveDataFrameColumn ElementwiseNotEquals(DataFrameCol switch (column) { case PrimitiveDataFrameColumn boolColumn: - return ElementwiseNotEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseNotEqualsImplementation(boolColumn); case PrimitiveDataFrameColumn byteColumn: - return ElementwiseNotEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseNotEqualsImplementation(byteColumn); case PrimitiveDataFrameColumn charColumn: - return ElementwiseNotEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseNotEqualsImplementation(charColumn); case PrimitiveDataFrameColumn decimalColumn: - return ElementwiseNotEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseNotEqualsImplementation(decimalColumn); case PrimitiveDataFrameColumn doubleColumn: - return ElementwiseNotEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseNotEqualsImplementation(doubleColumn); case PrimitiveDataFrameColumn floatColumn: - return ElementwiseNotEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseNotEqualsImplementation(floatColumn); case PrimitiveDataFrameColumn intColumn: - return ElementwiseNotEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseNotEqualsImplementation(intColumn); case PrimitiveDataFrameColumn longColumn: - return ElementwiseNotEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseNotEqualsImplementation(longColumn); case PrimitiveDataFrameColumn sbyteColumn: - return ElementwiseNotEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseNotEqualsImplementation(sbyteColumn); case PrimitiveDataFrameColumn shortColumn: - return ElementwiseNotEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseNotEqualsImplementation(shortColumn); case PrimitiveDataFrameColumn uintColumn: - return ElementwiseNotEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseNotEqualsImplementation(uintColumn); case PrimitiveDataFrameColumn ulongColumn: - return ElementwiseNotEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseNotEqualsImplementation(ulongColumn); case PrimitiveDataFrameColumn ushortColumn: - return ElementwiseNotEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseNotEqualsImplementation(ushortColumn); case PrimitiveDataFrameColumn DateTimeColumn: - return ElementwiseNotEqualsImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseNotEqualsImplementation(DateTimeColumn); default: throw new NotSupportedException(); } @@ -485,33 +485,33 @@ public override PrimitiveDataFrameColumn ElementwiseGreaterThanOrEqual(Dat switch (column) { case PrimitiveDataFrameColumn boolColumn: - return ElementwiseGreaterThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanOrEqualImplementation(boolColumn); case PrimitiveDataFrameColumn byteColumn: - return ElementwiseGreaterThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanOrEqualImplementation(byteColumn); case PrimitiveDataFrameColumn charColumn: - return ElementwiseGreaterThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanOrEqualImplementation(charColumn); case PrimitiveDataFrameColumn decimalColumn: - return ElementwiseGreaterThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanOrEqualImplementation(decimalColumn); case PrimitiveDataFrameColumn doubleColumn: - return ElementwiseGreaterThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanOrEqualImplementation(doubleColumn); case PrimitiveDataFrameColumn floatColumn: - return ElementwiseGreaterThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanOrEqualImplementation(floatColumn); case PrimitiveDataFrameColumn intColumn: - return ElementwiseGreaterThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanOrEqualImplementation(intColumn); case PrimitiveDataFrameColumn longColumn: - return ElementwiseGreaterThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanOrEqualImplementation(longColumn); case PrimitiveDataFrameColumn sbyteColumn: - return ElementwiseGreaterThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanOrEqualImplementation(sbyteColumn); case PrimitiveDataFrameColumn shortColumn: - return ElementwiseGreaterThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanOrEqualImplementation(shortColumn); case PrimitiveDataFrameColumn uintColumn: - return ElementwiseGreaterThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanOrEqualImplementation(uintColumn); case PrimitiveDataFrameColumn ulongColumn: - return ElementwiseGreaterThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanOrEqualImplementation(ulongColumn); case PrimitiveDataFrameColumn ushortColumn: - return ElementwiseGreaterThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanOrEqualImplementation(ushortColumn); case PrimitiveDataFrameColumn DateTimeColumn: - return ElementwiseGreaterThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanOrEqualImplementation(DateTimeColumn); default: throw new NotSupportedException(); } @@ -532,33 +532,33 @@ public override PrimitiveDataFrameColumn ElementwiseLessThanOrEqual(DataFr switch (column) { case PrimitiveDataFrameColumn boolColumn: - return ElementwiseLessThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanOrEqualImplementation(boolColumn); case PrimitiveDataFrameColumn byteColumn: - return ElementwiseLessThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanOrEqualImplementation(byteColumn); case PrimitiveDataFrameColumn charColumn: - return ElementwiseLessThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanOrEqualImplementation(charColumn); case PrimitiveDataFrameColumn decimalColumn: - return ElementwiseLessThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanOrEqualImplementation(decimalColumn); case PrimitiveDataFrameColumn doubleColumn: - return ElementwiseLessThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanOrEqualImplementation(doubleColumn); case PrimitiveDataFrameColumn floatColumn: - return ElementwiseLessThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanOrEqualImplementation(floatColumn); case PrimitiveDataFrameColumn intColumn: - return ElementwiseLessThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanOrEqualImplementation(intColumn); case PrimitiveDataFrameColumn longColumn: - return ElementwiseLessThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanOrEqualImplementation(longColumn); case PrimitiveDataFrameColumn sbyteColumn: - return ElementwiseLessThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanOrEqualImplementation(sbyteColumn); case PrimitiveDataFrameColumn shortColumn: - return ElementwiseLessThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanOrEqualImplementation(shortColumn); case PrimitiveDataFrameColumn uintColumn: - return ElementwiseLessThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanOrEqualImplementation(uintColumn); case PrimitiveDataFrameColumn ulongColumn: - return ElementwiseLessThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanOrEqualImplementation(ulongColumn); case PrimitiveDataFrameColumn ushortColumn: - return ElementwiseLessThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanOrEqualImplementation(ushortColumn); case PrimitiveDataFrameColumn DateTimeColumn: - return ElementwiseLessThanOrEqualImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanOrEqualImplementation(DateTimeColumn); default: throw new NotSupportedException(); } @@ -579,33 +579,33 @@ public override PrimitiveDataFrameColumn ElementwiseGreaterThan(DataFrameC switch (column) { case PrimitiveDataFrameColumn boolColumn: - return ElementwiseGreaterThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanImplementation(boolColumn); case PrimitiveDataFrameColumn byteColumn: - return ElementwiseGreaterThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanImplementation(byteColumn); case PrimitiveDataFrameColumn charColumn: - return ElementwiseGreaterThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanImplementation(charColumn); case PrimitiveDataFrameColumn decimalColumn: - return ElementwiseGreaterThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanImplementation(decimalColumn); case PrimitiveDataFrameColumn doubleColumn: - return ElementwiseGreaterThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanImplementation(doubleColumn); case PrimitiveDataFrameColumn floatColumn: - return ElementwiseGreaterThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanImplementation(floatColumn); case PrimitiveDataFrameColumn intColumn: - return ElementwiseGreaterThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanImplementation(intColumn); case PrimitiveDataFrameColumn longColumn: - return ElementwiseGreaterThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanImplementation(longColumn); case PrimitiveDataFrameColumn sbyteColumn: - return ElementwiseGreaterThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanImplementation(sbyteColumn); case PrimitiveDataFrameColumn shortColumn: - return ElementwiseGreaterThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanImplementation(shortColumn); case PrimitiveDataFrameColumn uintColumn: - return ElementwiseGreaterThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanImplementation(uintColumn); case PrimitiveDataFrameColumn ulongColumn: - return ElementwiseGreaterThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanImplementation(ulongColumn); case PrimitiveDataFrameColumn ushortColumn: - return ElementwiseGreaterThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanImplementation(ushortColumn); case PrimitiveDataFrameColumn DateTimeColumn: - return ElementwiseGreaterThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseGreaterThanImplementation(DateTimeColumn); default: throw new NotSupportedException(); } @@ -626,33 +626,33 @@ public override PrimitiveDataFrameColumn ElementwiseLessThan(DataFrameColu switch (column) { case PrimitiveDataFrameColumn boolColumn: - return ElementwiseLessThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanImplementation(boolColumn); case PrimitiveDataFrameColumn byteColumn: - return ElementwiseLessThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanImplementation(byteColumn); case PrimitiveDataFrameColumn charColumn: - return ElementwiseLessThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanImplementation(charColumn); case PrimitiveDataFrameColumn decimalColumn: - return ElementwiseLessThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanImplementation(decimalColumn); case PrimitiveDataFrameColumn doubleColumn: - return ElementwiseLessThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanImplementation(doubleColumn); case PrimitiveDataFrameColumn floatColumn: - return ElementwiseLessThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanImplementation(floatColumn); case PrimitiveDataFrameColumn intColumn: - return ElementwiseLessThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanImplementation(intColumn); case PrimitiveDataFrameColumn longColumn: - return ElementwiseLessThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanImplementation(longColumn); case PrimitiveDataFrameColumn sbyteColumn: - return ElementwiseLessThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanImplementation(sbyteColumn); case PrimitiveDataFrameColumn shortColumn: - return ElementwiseLessThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanImplementation(shortColumn); case PrimitiveDataFrameColumn uintColumn: - return ElementwiseLessThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanImplementation(uintColumn); case PrimitiveDataFrameColumn ulongColumn: - return ElementwiseLessThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanImplementation(ulongColumn); case PrimitiveDataFrameColumn ushortColumn: - return ElementwiseLessThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanImplementation(ushortColumn); case PrimitiveDataFrameColumn DateTimeColumn: - return ElementwiseLessThanImplementation(column as PrimitiveDataFrameColumn); + return ElementwiseLessThanImplementation(DateTimeColumn); default: throw new NotSupportedException(); } From 1de06be0cf8fcb3057fe8a3cbcf20b16452e0752 Mon Sep 17 00:00:00 2001 From: Aleksei Smirnov Date: Thu, 25 May 2023 09:32:42 +0300 Subject: [PATCH 11/12] Simplify getting mutable buffers # Conflicts: # src/Microsoft.Data.Analysis/PrimitiveDataFrameColumnArithmetic.cs # src/Microsoft.Data.Analysis/PrimitiveDataFrameColumnArithmetic.tt --- .../PrimitiveDataFrameColumnArithmetic.cs | 68 +++++-------------- 1 file changed, 17 insertions(+), 51 deletions(-) diff --git a/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumnArithmetic.cs b/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumnArithmetic.cs index a8916dd3be..3da50547d6 100644 --- a/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumnArithmetic.cs +++ b/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumnArithmetic.cs @@ -148,9 +148,7 @@ public void And(PrimitiveColumnContainer left, PrimitiveColumnContainer.GetMutableBuffer(buffer); - left.Buffers[b] = mutableBuffer; + var mutableBuffer = left.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; var otherSpan = right.Buffers[b].ReadOnlySpan; for (int i = 0; i < span.Length; i++) @@ -163,9 +161,7 @@ public void And(PrimitiveColumnContainer column, bool scalar) { for (int b = 0; b < column.Buffers.Count; b++) { - var buffer = column.Buffers[b]; - var mutableBuffer = DataFrameBuffer.GetMutableBuffer(buffer); - column.Buffers[b] = mutableBuffer; + var mutableBuffer = column.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; for (int i = 0; i < span.Length; i++) { @@ -177,9 +173,7 @@ public void And(bool scalar, PrimitiveColumnContainer column) { for (int b = 0; b < column.Buffers.Count; b++) { - var buffer = column.Buffers[b]; - var mutableBuffer = DataFrameBuffer.GetMutableBuffer(buffer); - column.Buffers[b] = mutableBuffer; + var mutableBuffer = column.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; for (int i = 0; i < span.Length; i++) { @@ -191,9 +185,7 @@ public void Or(PrimitiveColumnContainer left, PrimitiveColumnContainer.GetMutableBuffer(buffer); - left.Buffers[b] = mutableBuffer; + var mutableBuffer = left.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; var otherSpan = right.Buffers[b].ReadOnlySpan; for (int i = 0; i < span.Length; i++) @@ -206,9 +198,7 @@ public void Or(PrimitiveColumnContainer column, bool scalar) { for (int b = 0; b < column.Buffers.Count; b++) { - var buffer = column.Buffers[b]; - var mutableBuffer = DataFrameBuffer.GetMutableBuffer(buffer); - column.Buffers[b] = mutableBuffer; + var mutableBuffer = column.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; for (int i = 0; i < span.Length; i++) { @@ -220,9 +210,7 @@ public void Or(bool scalar, PrimitiveColumnContainer column) { for (int b = 0; b < column.Buffers.Count; b++) { - var buffer = column.Buffers[b]; - var mutableBuffer = DataFrameBuffer.GetMutableBuffer(buffer); - column.Buffers[b] = mutableBuffer; + var mutableBuffer = column.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; for (int i = 0; i < span.Length; i++) { @@ -234,9 +222,7 @@ public void Xor(PrimitiveColumnContainer left, PrimitiveColumnContainer.GetMutableBuffer(buffer); - left.Buffers[b] = mutableBuffer; + var mutableBuffer = left.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; var otherSpan = right.Buffers[b].ReadOnlySpan; for (int i = 0; i < span.Length; i++) @@ -249,9 +235,7 @@ public void Xor(PrimitiveColumnContainer column, bool scalar) { for (int b = 0; b < column.Buffers.Count; b++) { - var buffer = column.Buffers[b]; - var mutableBuffer = DataFrameBuffer.GetMutableBuffer(buffer); - column.Buffers[b] = mutableBuffer; + var mutableBuffer = column.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; for (int i = 0; i < span.Length; i++) { @@ -263,9 +247,7 @@ public void Xor(bool scalar, PrimitiveColumnContainer column) { for (int b = 0; b < column.Buffers.Count; b++) { - var buffer = column.Buffers[b]; - var mutableBuffer = DataFrameBuffer.GetMutableBuffer(buffer); - column.Buffers[b] = mutableBuffer; + var mutableBuffer = column.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; for (int i = 0; i < span.Length; i++) { @@ -285,9 +267,7 @@ public void ElementwiseEquals(PrimitiveColumnContainer left, PrimitiveColu { for (int b = 0; b < left.Buffers.Count; b++) { - var buffer = left.Buffers[b]; - var mutableBuffer = DataFrameBuffer.GetMutableBuffer(buffer); - left.Buffers[b] = mutableBuffer; + var mutableBuffer = left.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; var otherSpan = right.Buffers[b].ReadOnlySpan; for (int i = 0; i < span.Length; i++) @@ -300,9 +280,7 @@ public void ElementwiseEquals(PrimitiveColumnContainer column, bool scalar { for (int b = 0; b < column.Buffers.Count; b++) { - var buffer = column.Buffers[b]; - var mutableBuffer = DataFrameBuffer.GetMutableBuffer(buffer); - column.Buffers[b] = mutableBuffer; + var mutableBuffer = column.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; for (int i = 0; i < span.Length; i++) { @@ -314,9 +292,7 @@ public void ElementwiseNotEquals(PrimitiveColumnContainer left, PrimitiveC { for (int b = 0; b < left.Buffers.Count; b++) { - var buffer = left.Buffers[b]; - var mutableBuffer = DataFrameBuffer.GetMutableBuffer(buffer); - left.Buffers[b] = mutableBuffer; + var mutableBuffer = left.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; var otherSpan = right.Buffers[b].ReadOnlySpan; for (int i = 0; i < span.Length; i++) @@ -329,9 +305,7 @@ public void ElementwiseNotEquals(PrimitiveColumnContainer column, bool sca { for (int b = 0; b < column.Buffers.Count; b++) { - var buffer = column.Buffers[b]; - var mutableBuffer = DataFrameBuffer.GetMutableBuffer(buffer); - column.Buffers[b] = mutableBuffer; + var mutableBuffer = column.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; for (int i = 0; i < span.Length; i++) { @@ -483,9 +457,7 @@ public void ElementwiseEquals(PrimitiveColumnContainer left, Primitive { for (int b = 0; b < left.Buffers.Count; b++) { - var buffer = left.Buffers[b]; - var mutableBuffer = DataFrameBuffer.GetMutableBuffer(buffer); - left.Buffers[b] = mutableBuffer; + var mutableBuffer = left.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; var otherSpan = right.Buffers[b].ReadOnlySpan; for (int i = 0; i < span.Length; i++) @@ -498,9 +470,7 @@ public void ElementwiseEquals(PrimitiveColumnContainer column, DateTim { for (int b = 0; b < column.Buffers.Count; b++) { - var buffer = column.Buffers[b]; - var mutableBuffer = DataFrameBuffer.GetMutableBuffer(buffer); - column.Buffers[b] = mutableBuffer; + var mutableBuffer = column.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; for (int i = 0; i < span.Length; i++) { @@ -512,9 +482,7 @@ public void ElementwiseNotEquals(PrimitiveColumnContainer left, Primit { for (int b = 0; b < left.Buffers.Count; b++) { - var buffer = left.Buffers[b]; - var mutableBuffer = DataFrameBuffer.GetMutableBuffer(buffer); - left.Buffers[b] = mutableBuffer; + var mutableBuffer = left.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; var otherSpan = right.Buffers[b].ReadOnlySpan; for (int i = 0; i < span.Length; i++) @@ -527,9 +495,7 @@ public void ElementwiseNotEquals(PrimitiveColumnContainer column, Date { for (int b = 0; b < column.Buffers.Count; b++) { - var buffer = column.Buffers[b]; - var mutableBuffer = DataFrameBuffer.GetMutableBuffer(buffer); - column.Buffers[b] = mutableBuffer; + var mutableBuffer = column.Buffers.GetOrCreateMutable(b); var span = mutableBuffer.Span; for (int i = 0; i < span.Length; i++) { From 6be198d5032c41d934c5a60d6720e200a346d5b9 Mon Sep 17 00:00:00 2001 From: Aleksei Smirnov Date: Thu, 25 May 2023 09:37:44 +0300 Subject: [PATCH 12/12] Don't convert buffer to mutable if it not required # Conflicts: # src/Microsoft.Data.Analysis/PrimitiveDataFrameColumnArithmetic.cs # src/Microsoft.Data.Analysis/PrimitiveDataFrameColumnArithmetic.tt --- .../PrimitiveDataFrameColumnArithmetic.cs | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumnArithmetic.cs b/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumnArithmetic.cs index 3da50547d6..9a11b44cdf 100644 --- a/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumnArithmetic.cs +++ b/src/Microsoft.Data.Analysis/PrimitiveDataFrameColumnArithmetic.cs @@ -267,8 +267,7 @@ public void ElementwiseEquals(PrimitiveColumnContainer left, PrimitiveColu { for (int b = 0; b < left.Buffers.Count; b++) { - var mutableBuffer = left.Buffers.GetOrCreateMutable(b); - var span = mutableBuffer.Span; + var span = left.Buffers[b].ReadOnlySpan; var otherSpan = right.Buffers[b].ReadOnlySpan; for (int i = 0; i < span.Length; i++) { @@ -280,8 +279,7 @@ public void ElementwiseEquals(PrimitiveColumnContainer column, bool scalar { for (int b = 0; b < column.Buffers.Count; b++) { - var mutableBuffer = column.Buffers.GetOrCreateMutable(b); - var span = mutableBuffer.Span; + var span = column.Buffers[b].ReadOnlySpan; for (int i = 0; i < span.Length; i++) { ret[i] = (span[i] == scalar); @@ -292,8 +290,7 @@ public void ElementwiseNotEquals(PrimitiveColumnContainer left, PrimitiveC { for (int b = 0; b < left.Buffers.Count; b++) { - var mutableBuffer = left.Buffers.GetOrCreateMutable(b); - var span = mutableBuffer.Span; + var span = left.Buffers[b].ReadOnlySpan; var otherSpan = right.Buffers[b].ReadOnlySpan; for (int i = 0; i < span.Length; i++) { @@ -305,8 +302,7 @@ public void ElementwiseNotEquals(PrimitiveColumnContainer column, bool sca { for (int b = 0; b < column.Buffers.Count; b++) { - var mutableBuffer = column.Buffers.GetOrCreateMutable(b); - var span = mutableBuffer.Span; + var span = column.Buffers[b].ReadOnlySpan; for (int i = 0; i < span.Length; i++) { ret[i] = (span[i] != scalar); @@ -457,8 +453,7 @@ public void ElementwiseEquals(PrimitiveColumnContainer left, Primitive { for (int b = 0; b < left.Buffers.Count; b++) { - var mutableBuffer = left.Buffers.GetOrCreateMutable(b); - var span = mutableBuffer.Span; + var span = left.Buffers[b].ReadOnlySpan; var otherSpan = right.Buffers[b].ReadOnlySpan; for (int i = 0; i < span.Length; i++) { @@ -470,8 +465,7 @@ public void ElementwiseEquals(PrimitiveColumnContainer column, DateTim { for (int b = 0; b < column.Buffers.Count; b++) { - var mutableBuffer = column.Buffers.GetOrCreateMutable(b); - var span = mutableBuffer.Span; + var span = column.Buffers[b].ReadOnlySpan; for (int i = 0; i < span.Length; i++) { ret[i] = (span[i] == scalar); @@ -482,8 +476,7 @@ public void ElementwiseNotEquals(PrimitiveColumnContainer left, Primit { for (int b = 0; b < left.Buffers.Count; b++) { - var mutableBuffer = left.Buffers.GetOrCreateMutable(b); - var span = mutableBuffer.Span; + var span = left.Buffers[b].ReadOnlySpan; var otherSpan = right.Buffers[b].ReadOnlySpan; for (int i = 0; i < span.Length; i++) { @@ -495,8 +488,7 @@ public void ElementwiseNotEquals(PrimitiveColumnContainer column, Date { for (int b = 0; b < column.Buffers.Count; b++) { - var mutableBuffer = column.Buffers.GetOrCreateMutable(b); - var span = mutableBuffer.Span; + var span = column.Buffers[b].ReadOnlySpan; for (int i = 0; i < span.Length; i++) { ret[i] = (span[i] != scalar);